1С-Предприятие 8.0. Практическое пособие разработчика

Выполнение перерасчета записей регистра расчета


Итак, в нашем алгоритме работы с данными расчета осталось одно "узкое" место – контроль актуальности данных, содержащихся в регистре расчета. До сих пор мы с вами использовали служебный отчет "Перерасчет" для того, чтобы определить, являются ли данные в регистре расчета актуальными или же они требуют перерасчета.

Теперь мы с вами создадим специальную процедуру, которая будет определять, требуется ли перерасчет данных регистра расчета и, если такая необходимость есть – выполнять перерасчет.

Поскольку единственным способом получения итоговой информации о начислениях сотрудникам в нашей конфигурации является отчет "НачисленияСотрудникам", для вызова этой процедуры мы добавим кнопку "Перерасчитать" в командную панель "ДействияФормы":

В обработчик события нажатия кнопки вставим текст вызова процедуры перерасчета:

Процедура ДействияФормыПерерасчитать(Кнопка)

ПерерасчитатьНачисления(ПланыВидовРасчета.ОсновныеНачисления.Оклад);

   ПерерасчитатьНачисления(ПланыВидовРасчета.ОсновныеНачисления.Премия);



КонецПроцедуры

Саму процедуру перерасчета разместим в общем модуле "ПроведениеРасчетов":

Процедура ПерерасчитатьНачисления(ТребуемыйВидРасчета) Экспорт

   //здесь следует выбрать из набора записей перерасчета, записи

   //в следующей последовательности:

   //записи документа1 для сотрудников из списка, [359]

   //записи документа2 для сотрудников из списка,

   //и т.д.

   Запрос = Новый Запрос(

       "ВЫБРАТЬ

       |    НачисленияПерерасчет.ОбъектПерерасчета КАК ОбъектПерерасчета,

       |    НачисленияПерерасчет.Сотрудник

       |ИЗ

       |    РегистрРасчета.Начисления.Перерасчет КАК НачисленияПерерасчет




       |ГДЕ

       |    НачисленияПерерасчет.ВидРасчета = &ТребуемыйВидРасчета

       |ИТОГИ ПО

       |    ОбъектПерерасчета");

   Запрос.УстановитьПараметр("ТребуемыйВидРасчета", ТребуемыйВидРасчета);

   СписокСотрудников = Новый СписокЗначений;

   //перебрать группировку по регистратору

   ВыборкаПоРегистратору = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

   Пока ВыборкаПоРегистратору.Следующий() Цикл

       Регистратор = ВыборкаПоРегистратору.ОбъектПерерасчета;

       //перебрать группировку по сотрудникам

       //для выбранного регистратора

       //и создать список сотрудников

       ВыборкаПоСотрудникам = ВыборкаПоРегистратору.Выбрать();

       СписокСотрудников.Очистить();

       Пока ВыборкаПоСотрудникам.Следующий() Цикл

           СписокСотрудников.Добавить(ВыборкаПоСотрудникам.Сотрудник);

       КонецЦикла;

       // получить набор записей регистра расчета

       //для выбранного регистратора

       НаборЗаписей = РегистрыРасчета.Начисления.СоздатьНаборЗаписей();

       НаборЗаписей.Отбор.Регистратор.Значение = Регистратор;

       НаборЗаписей.Прочитать();

       РасчитатьНачисления(НаборЗаписей, ТребуемыйВидРасчета, СписокСотрудников);

       НаборЗаписей.Записать(,Истина);

       //очистить перерасчитанные записи в перерасчете



       НаборЗаписейПерерасчета = РегистрыРасчета.Начисления.Перерасчеты.Перерасчет.СоздатьНаборЗаписей();

       НаборЗаписейПерерасчета.Отбор.ОбъектПерерасчета.Значение = Регистратор;

       НаборЗаписейПерерасчета.Записать();

   КонецЦикла;

КонецПроцедуры [360]

В самом начале процедуры мы выбираем запросом данные о записях перерасчетов, содержащие переданный вид расчета и сгруппированные по объекту перерасчета. Далее, при обходе результата запроса, мы формируем для каждого объекта перерасчета список сотрудников, читаем соответствующие записи регистра расчета и вызываем процедуру "РасчитатьНачисления", которая использовалась нами при расчете записей документа "НачисленияСотрудникам". После того, как расчет записей выполнен, мы записываем набор записей без формирования записей перерасчета и очищаем записи перерасчета по тому объекту перерасчета, который только что обработали.

Запустим 1С:Предприятие и проверим, как выполняется перерасчет записей регистра расчета.

Отменим проведение всех документов "Начисления сотрудникам" и проведем документ Начисления сотрудникам №1 и затем №2. Сформируем отчет "Начисления сотрудникам" (здесь и далее колонки отчета с 4 по 6 скрыты, в целях экономии места):



Теперь откроем документ Начисления сотрудникам №1, изменим оклад Гусакова на 10 000 и проведем документ. В отчете [361] "НачисленияСотрудникам" нажмем кнопку "Перерасчитать". Будет выполнен перерасчет начисления премии Гусакову и Деловому:



Результат работы отчета будет содержать новые значения премии Гусакова:



И, наконец, проведем документ Начисления сотрудникам №3 и нажмем "Перерасчет" в отчете "НачисленияСотрудникам". Снова будет произведен перерасчет оклада и премии Гусакова:

[362]

А данные отчета будут содержать актуальные значения начисления оклада и премии:



[363]


Содержание раздела