Выполнение перерасчета записей регистра расчета
Итак, в нашем алгоритме работы с данными расчета осталось одно "узкое" место – контроль актуальности данных, содержащихся в регистре расчета. До сих пор мы с вами использовали служебный отчет "Перерасчет" для того, чтобы определить, являются ли данные в регистре расчета актуальными или же они требуют перерасчета.
Теперь мы с вами создадим специальную процедуру, которая будет определять, требуется ли перерасчет данных регистра расчета и, если такая необходимость есть – выполнять перерасчет.
Поскольку единственным способом получения итоговой информации о начислениях сотрудникам в нашей конфигурации является отчет "НачисленияСотрудникам", для вызова этой процедуры мы добавим кнопку "Перерасчитать" в командную панель "ДействияФормы":
В обработчик события нажатия кнопки вставим текст вызова процедуры перерасчета:
Процедура ДействияФормыПерерасчитать(Кнопка)
ПерерасчитатьНачисления(ПланыВидовРасчета.ОсновныеНачисления.Оклад);
ПерерасчитатьНачисления(ПланыВидовРасчета.ОсновныеНачисления.Премия);
КонецПроцедуры
Саму процедуру перерасчета разместим в общем модуле "ПроведениеРасчетов":
Процедура ПерерасчитатьНачисления(ТребуемыйВидРасчета) Экспорт
//здесь следует выбрать из набора записей перерасчета, записи
//в следующей последовательности:
//записи документа1 для сотрудников из списка, [359]
//записи документа2 для сотрудников из списка,
//и т.д.
Запрос = Новый Запрос(
"ВЫБРАТЬ
| НачисленияПерерасчет.ОбъектПерерасчета КАК ОбъектПерерасчета,
| НачисленияПерерасчет.Сотрудник
|ИЗ
| РегистрРасчета.Начисления.Перерасчет КАК НачисленияПерерасчет
|ГДЕ
| НачисленияПерерасчет.ВидРасчета = &ТребуемыйВидРасчета
|ИТОГИ ПО
| ОбъектПерерасчета");
Запрос.УстановитьПараметр("ТребуемыйВидРасчета", ТребуемыйВидРасчета);
СписокСотрудников = Новый СписокЗначений;
//перебрать группировку по регистратору
ВыборкаПоРегистратору = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаПоРегистратору.Следующий() Цикл
Регистратор = ВыборкаПоРегистратору.ОбъектПерерасчета;
//перебрать группировку по сотрудникам
//для выбранного регистратора
//и создать список сотрудников
ВыборкаПоСотрудникам = ВыборкаПоРегистратору.Выбрать();
СписокСотрудников.Очистить();
Пока ВыборкаПоСотрудникам.Следующий() Цикл
СписокСотрудников.Добавить(ВыборкаПоСотрудникам.Сотрудник);
КонецЦикла;
// получить набор записей регистра расчета
//для выбранного регистратора
НаборЗаписей = РегистрыРасчета.Начисления.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Значение = Регистратор;
НаборЗаписей.Прочитать();
РасчитатьНачисления(НаборЗаписей, ТребуемыйВидРасчета, СписокСотрудников);
НаборЗаписей.Записать(,Истина);
//очистить перерасчитанные записи в перерасчете
НаборЗаписейПерерасчета = РегистрыРасчета.Начисления.Перерасчеты.Перерасчет.СоздатьНаборЗаписей();
НаборЗаписейПерерасчета.Отбор.ОбъектПерерасчета.Значение = Регистратор;
НаборЗаписейПерерасчета.Записать();
КонецЦикла;
КонецПроцедуры [360]
Запустим 1С:Предприятие и проверим, как выполняется перерасчет записей регистра расчета.
Отменим проведение всех документов "Начисления сотрудникам" и проведем документ Начисления сотрудникам №1 и затем №2. Сформируем отчет "Начисления сотрудникам" (здесь и далее колонки отчета с 4 по 6 скрыты, в целях экономии места):
Теперь откроем документ Начисления сотрудникам №1, изменим оклад Гусакова на 10 000 и проведем документ. В отчете [361] "НачисленияСотрудникам" нажмем кнопку "Перерасчитать". Будет выполнен перерасчет начисления премии Гусакову и Деловому:
Результат работы отчета будет содержать новые значения премии Гусакова:
И, наконец, проведем документ Начисления сотрудникам №3 и нажмем "Перерасчет" в отчете "НачисленияСотрудникам". Снова будет произведен перерасчет оклада и премии Гусакова:
[362]
А данные отчета будут содержать актуальные значения начисления оклада и премии:
[363]