Если ВыборкаРезультата.НайтиСледующий(СтруктураНомер) Тогда
ЗаписьРегистра.Результат = ВыборкаРезультата.База * (10/100); Сообщить(" Выполнен расчет " + ЗаписьРегистра.Регистратор + " - " + ЗаписьРегистра.ВидРасчета + " ― " + ЗаписьРегистра.Сотрудник,); КонецЕсли; КонецЦикла; КонецЕсли;
КонецПроцедуры
Сумму начисленной премии мы рассчитываем как 10% от рассчитанной оплаты по окладу. Запустим 1С: Предприятие в режиме отладки и проверим правильность работы процедуры расчета. Отменим проведение документа Начисления сотрудникам №3 и перепроведем документы Начисления сотрудникам №1 и №2. Регистр расчета Начисления должен выглядеть следующим образом (рис. 17.15): Рисунок 17.15 ― Записи регистра Начисления Гусакову и Деловому начислена премия в размере 10% от суммы начисления по окладу. Проведем документ Начисление сотрудникам №3, а затем №1 и №2. Состояние регистра изменится следующим образом (рис. 17.16): Рисунок 17.16 ― Записи регистра Начисления
В результате невыхода Гусакова на работу сумма оплаты по окладу будет уменьшена и соответствующим образом уменьшится начисленная ему премия.
6. Создание отчета Начисления сотрудникам Теперь мы посмотрим, каким образом можно использовать данные, хранящиеся в регистре расчета, для получения в отчете итоговой информации о начислениях сотрудникам. Создадим в конфигураторе новый объект конфигурации Отчет. Назовем его НачисленияСотрудникам. Создадим основную схему компоновки данных отчета, добавим новый набор данных ― запрос, откроем конструктор запроса. Выберем таблицу регистра расчета Начисления (рис. 17.17). Рисунок 17.17 ― Состав полей таблицы Начисления
Из нее выберем следующие поля: Сотрудник, ВидРасчета, ПериодДействияНачало, ПериодДействияКонец, Регистратор и Результат (рис. 17.18). Рисунок 17.18 ― Выбранные поля
На закладке Объединения/Псевдонимы определим следующие псевдонимы полей ПериодДействияНачало и ПериодДействияКонец (рис. 17.19). Рисунок 17.19 ― Зададим псевдонимы полей На этом создание запроса закончено, нажмем ОK. Перейдем на закладку Ресурсы и укажем, что должна быть рассчитана сумма по полю Результат. После этого перейдем на закладку Настройки и создадим структуру отчета. Добавим группировку по полю Сотрудник и в ней ― подчиненную группировку детальных записей (рис. 17.20) Рисунок 17.20 ― Структура отчета
В качестве полей, выводимых в отчет, выберем поля ВидРасчета, Начало, Окончание, Регистратор и Результат. На закладке Сортировка укажем, что сортировка должна выполняться по возрастанию значения поля Сотрудник и Регистратор. И в заключение на закладке Другие настройки зададим заголовок отчета ― Начисления cотрудникам. Создание схемы компоновки данных закончено. Запустим 1С: Предприятие в режиме отладки. В результате работы отчета мы получим следующую таблицу (рис. 17.21): Рисунок 17.21 ― Отчет НачисленияСотрудникам
7. Выполнение перерасчета записей регистра расчета Итак, в нашем алгоритме работы с данными расчета осталось одно «узкое» место ― контроль актуальности данных, содержащихся в регистре расчета. До сих пор мы с вами использовали служебный отчет Перерасчет для того, чтобы определить, являются ли данные в регистре расчета актуальными или же они требуют перерасчета. Теперь мы с вами создадим специальную процедуру, которая будет определять, требуется ли перерасчет данных регистра расчета и, если такая необходимость есть, выполнять перерасчет. Поскольку единственным способом получения итоговой информации о начислениях сотрудникам в нашей конфигурации является отчет НачисленияСотрудникам, для вызова этой процедуры мы создадим основную форму этого отчета и добавим кнопку Перерасчитать в командную панель ДействияФормы (рис. 17.22). Рисунок 17.22 ― Командная панель формы отчета НачисленияСотрудникам
В обработчик события нажатия кнопки вставим текст вызова процедуры перерасчета, очистки табличного поля и вывода нового результата (листинг 17.8):
Листинг 17.8. Текст обработчика события нажатия кнопки Процедура ДействияФормыПерерасчитать(Кнопка)
ПерерасчитатьНачисления(ПланыВидовРасчета.ОсновныеНачисления.Оклад); ПерерасчитатьНачисления(ПланыВидовРасчета.ОсновныеНачисления.Премия); ЭлементыФормы.Результат.Очистить(); ОтчетОбъект.СкомпоноватьРезультат(ЭлементыФормы.Результат, ДанныеРасшифровки);
КонецПроцедуры
Саму процедуру перерасчета поместим в общем модуле ПроведениеРасчетов (листинг 17.9).
Листинг 17.9. Процедура перерасчета начислений Процедура ПерерасчитатьНачисления(ТребуемыйВидРасчета) Экспорт
// Здесь следует выбрать из набора записей перерасчета // записи в следующей последовательности: // записи документа1 для сотрудников из списка, // записи документа2 для сотрудников из списка, // и т. д.
Запрос = Новый Запрос( " ВЫБРАТЬ | НачисленияПерерасчет.ОбъектПерерасчета, | НачисленияПерерасчет.Сотрудник |ИЗ | РегистрРасчета.Начисления.Перерасчет КАК НачисленияПерерасчет | |ГДЕ | НачисленияПерерасчет.ВидРасчета = & ТребуемыйВидРасчета | |ИТОГИ ПО | НачисленияПерерасчет.ОбъектПерерасчета");
Запрос.УстановитьПараметр(" ТребуемыйВидРасчета", ТребуемыйВидРасчета); СписокСотрудников = Новый СписокЗначений;
// Перебрать группировку по регистратору. ВыборкаПоРегистратору = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаПоРегистратору.Следующий() Цикл Регистратор = ВыборкаПоРегистратору.ОбъектПерерасчета;
// Перебрать группировку по сотрудникам // для выбранного регистратора // и создать список сотрудников. ВыборкаПоСотрудникам = ВыборкаПоРегистратору.Выбрать(); СписокСотрудников.Очистить(); Пока ВыборкаПоСотрудникам.Следующий() Цикл СписокСотрудников.Добавить(ВыборкаПоСотрудникам.Сотрудник); КонецЦикла;
// Получить набор записей регистра расчета // для выбранного регистратора. НаборЗаписей = РегистрыРасчета.Начисления.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Значение = Регистратор; НаборЗаписей.Прочитать();
РасчитатьНачисления(НаборЗаписей, ТребуемыйВидРасчета, СписокСотрудников); НаборЗаписей.Записать(, Истина);
// Очистить перерасчитанные записи в перерасчете. НаборЗаписейПерерасчета = РегистрыРасчета.Начисления.Перерасчеты.Перерасчет.СоздатьНаборЗаписей(); НаборЗаписейПерерасчета.Отбор.ОбъектПерерасчета.Значение = Регистратор; НаборЗаписейПерерасчета.Записать(); КонецЦикла;
КонецПроцедуры
В самом начале процедуры мы запросом выбираем данные о записях перерасчетов, содержащие переданный вид расчета и сгруппированные по объекту перерасчета. Далее, при обходе результата запроса, мы формируем для каждого объекта перерасчета список сотрудников, читаем соответствующие записи регистра расчета и вызываем процедуру РасчитатьНачисления, которая использовалась нами при расчете записей документа НачисленияСотрудникам. После того, как расчет записей выполнен, мы записываем набор записей без формирования записей перерасчета и очищаем записи перерасчета по тому объекту перерасчета, который только что обработали. Запустим 1С: Предприятие и проверим, как выполняется перерасчет записей регистра расчета. Отменим проведение всех документов Начисления сотрудникам и проведем документ Начисления сотрудникам №1 и затем №2. Сформируем отчет Начисления сотрудникам (рис. 17.23). Рисунок 17.23 ― Отчет Начисления сотрудникам Теперь откроем документ Начисления сотрудникам №1, изменим оклад Гусакова на 10000 и проведем документ. В отчете НачисленияСотрудникам нажмем кнопку Перерасчитать. Будет выполнен перерасчет начисления премии Гусакову и Деловому (рис. 17.24). Рисунок 17.24 ― Окно служебных сообщений
Результат работы отчета будет содержать новые значения премии Гусакова (рис. 17.25).
Рисунок 17.25 ― Отчет Начисления сотрудникам
И, наконец, проведем документ Начисления сотрудникам №3 и нажмем Перерасчитать в отчете НачисленияСотрудникам. Снова будет произведен перерасчет оклада и премии Гусакова (рис. 17.26).
А данные отчета будут содержать актуальные значения начисления оклада и премии (рис. 17.27). Рисунок 17.27 ― Отчет Начисления сотрудникам
8. Создание отчета Диаграмма начислений Создадим новый объект конфигурации Отчет и назовем его ДиаграммаНачислений. Создадим основную форму отчета и поместим в нее элемент управления диаграмма Ганта с именем ДиаграммаГанта (рис. 17.28). Рисунок 17.28 ― Форма отчета ДиаграммаНачислений
Откроем модуль формы отчета и в обработчик события Нажатие кнопки Сформировать вставим заготовку запроса (листинг 17.10).
Листинг 17.10. Обработчик события Нажатие кнопки Процедура КнопкаСформироватьНажатие(Элемент)
Запрос = Новый Запрос; Запрос.Текст = ;
КонецПроцедуры
Откроем конструктор запроса и выберем виртуальную таблицу регистра расчета Начисления.ФактическийПериодДействия. Из этой таблицы выберем следующие поля (рис. 17.29): § Сотрудник; § ВидРасчета; § ПериодДействияНачало; § ПериодДействияКонец; § Результат; § Регистратор; § Регистратор.Представление.
Рисунок 17.29 ― Выбранные поля
Все, запрос готов. Теперь нажмем OK и после текста запроса добавим в процедуру следующий текст (листинг 17.11):
Листинг 17.11 Изменение обработчика события Нажатие кнопки Процедура КнопкаСформироватьНажатие(Элемент)
Запрос = Новый Запрос; Запрос.Текст = " ВЫБРАТЬ | НачисленияФактическийПериодДействия.Сотрудник, | НачисленияФактическийПериодДействия.ВидРасчета, | НачисленияФактическийПериодДействия.ПериодДействияНачало, | НачисленияФактическийПериодДействия.ПериодДействияКонец, | НачисленияФактическийПериодДействия.Результат, | НачисленияФактическийПериодДействия.Регистратор, | НачисленияФактическийПериодДействия.Регистратор.Представление |ИЗ | РегистрРасчета.Начисления.ФактическийПериодДействия КАК НачисленияФактическийПериодДействия";
ВыборкаРезультата = Запрос.Выполнить().Выбрать(); Диаграмма = ЭлементыФормы.ДиаграммаГанта;
|