НачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки |ИЗ
ГДЕ
КАК НачисленияСотрудникамНачисления
|
| НачисленияСотрудникамНачисления.Ссылка = &ТекущийДокумент");
Запрос.УстановитьПараметр("ТекущийДокумент",Ссылка);
//сформируем список сотрудников ТаблЗнач= Запрос.ВыполнитьО.Выгрузить();
МассивСотрудников = ТаблЗнач.ВыгрузитьКолонкуО'Сотрудник"); СписокСотрудииков= Новый СписокЗначений; СписокСотрудников.ЗагрузитьЗначения(МассивСотрудников);
РасчитатьНачисления(Двюкения.Начисления,
ПлапыВидовРасчета.ОсновныеНачисления.Оклад,
СписокСотрудников); Движения.Начисления.Записать(,Истнна);
РасчитатьНачиеления(Движении.Начисления,
ПланыВидовРасчета.ОсновныеНачисления.Премия,
СписокСотрудииков);Движения.НачисленияЛаписать(,Истина);
//} }_КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры
Теперь создадим в ветке «Общие» новый общий модуль «ПроведениеРасчетов». Добавим в него заготовку процедуры «РасчитатьНачисления»:
ПроцедураРасчитатьНачисления(НаборЗаписейРегистра, ТребуемыйВидРасчета,
СписокСотрудников) Экспорт //Рассчитать первичные записи Если ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад тогда
//Рассчитать вторичные записи иначеЕсли ТребуемыйВидРасчета =
ПланыВидовРасчета.ОсновныеНачисления.Премия тогда КонецЕсяи; КонецПроцедуры
Алгоритм расчета начислений будет различным при расчете первичных и вторичных записей, и каждая из его частей будет находиться в своей ветке условия Если...
При расчете первичных записей нам понадобятся данные графика
из регистра расчета, поэтому добавим в первую ветку условия запрос
по виртуальной таблице регистра расчета
«РегистрРасчета.Начисления.ДанныеГрафика»:
Обратите внимание, что при проведении документа мы сначала записываем движения, сформированные документом, в регистр, а затем передаем этот набор записей регистра в процедуру расчета. Сначала для расчета первичных записей («Оклад»), а затем для расчета вторичных («Премия»). Процедура расчета, на основе описанных в ней алгоритмов и данных, содержащихся в записях регистра, должна сформировать значения ресурсов регистра. После того, как ресурсы будут рассчитаны, мы перезаписываем набор записей регистра без формирования записей перерасчета (второй параметр в методе Записать() - Истина.
Перед вызовом процедуры из общего модуля мы формируем список сотрудников, содержащихся в документе, чтобы передать его в вызываемую процедуру.
ПроцедураРасчитатьНачисления(НаборЗаписейРегистра,ТребуемыйВидРасчета,
СписокСотрудников) Экспорт /Рассчитать первичные записи Если ТребуемыйВидРасчета e ПланыВидовРасчета.ОсновныеНачисления.Оклад тогда
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ
|НачисленияДанныеГрафика.ЗначениеПериодДействия КАК Норма, |НачисленияДанныеГрафика.ЗначениеФактическийПериодДействия
|КАК Факт,
|РегистрРасчета.Начисления.ДанныеГрафика(
|Регистратор = &Регистратор И |ВидРасчета = &ВидРасчета И |Сотрудник В (&СписокСотрудников)) |КАКНачисленияДанныеГрафика";
Запрос.УстановитьПараметр("Регистратор",
______________________ НаборЗаписейРегистра.Отбор.Регистратор.Значеяие);
Использование основных объектов конфигурации
Использование регистра расчета
Запрос.УстановитьПараметр("ВидРасчета",ТребуемыйВидРасчета); ~^^
3anpoc.ycTaHOBHTbnapaMeTp("CnMcoKCoTpyflHHKOB",CnncoKCoTpyflHHKOB)-
ВыборкаРезультата = Залрос.Выполнить().Выбрать();
/Л>ассчитать вторичные записи иначеЕсли ТребуемыйВидРасчета =
ПланыВидовРасчета.ОсновныеНачисления.Премиятогда КонецЕсли; КонецПроцедуры
В этом запросе мы выбираем из виртуальной таблицы данных графика регистра расчета значение графика для периода действия и для фактического периода действия. При задании параметров виртуальной таблицы мы ограничиваем выборку регистратором, нужным нам видом расчета и списком сотрудников, по которым нужно получить значения графика.
Теперь добавим обход переданного в процедуру набора записей и расчет записей, для которых получены значения графика:
Процедура РасчитатьНачисления(НаборЗаписейРегистра, ТребуемыйВидРасчета,
СписокСотрудников) экспорт /Рассчитать первичные записи Если ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НачисленияДанныеГрафика.ЗначениеПериодДействия КАК Норма,
| НачисленияДанныеГрафика.ЗначениеФактическийПериодДействия
| КАКФакт,
| НачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки