Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// ДВИЖЕНИЯ ПО РЕГИСТРУ ОСНОВНЫЕ НАЧИСЛЕНИЯ
// Запрос для формирования рабочего набора записей
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник,
| НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение,
| НачислениеЗарплатыОсновныеНачисления.ВидРасчета КАК ВидРасчета,
| НачислениеЗарплатыОсновныеНачисления.График КАК График,
| НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ДатаНачала,
| НачислениеЗарплатыОсновныеНачисления.ДатаОкончания КАК ДатаОкончания
|ПОМЕСТИТЬ ВТ_ТабЧасть_Оклад
|ИЗ
| Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления
|ГДЕ
| НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка
| И НачислениеЗарплатыОсновныеНачисления.ВидРасчета = &ВидРасчетаОклад
|
|ИНДЕКСИРОВАТЬ ПО
| Сотрудник,
| Подразделение
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ТабЧасть_Оклад.Сотрудник КАК Сотрудник,
| ВТ_ТабЧасть_Оклад.Подразделение КАК Подразделение,
| ВТ_ТабЧасть_Оклад.ВидРасчета КАК ВидРасчета,
| ВТ_ТабЧасть_Оклад.График КАК График,
| ВТ_ТабЧасть_Оклад.ДатаНачала КАК ПериодДействияНачало,
| ВТ_ТабЧасть_Оклад.ДатаОкончания КАК ПериодДействияКонец,
| ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.ЧасоваяСтавка, 0) КАК Параметр,
| &ПериодРегистрации КАК ПериодРегистрации
|ИЗ
| ВТ_ТабЧасть_Оклад КАК ВТ_ТабЧасть_Оклад
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних(
| &ПериодРегистрации,
| (Сотрудник, Подразделение) В
| (ВЫБРАТЬ
| ВТ_ТабЧасть_Оклад.Сотрудник КАК Сотрудник,
| ВТ_ТабЧасть_Оклад.Подразделение КАК Подразделение
| ИЗ
| ВТ_ТабЧасть_Оклад КАК ВТ_ТабЧасть_Оклад)) КАК СведенияОСотрудникахСрезПоследних
| ПО ВТ_ТабЧасть_Оклад.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник
| И ВТ_ТабЧасть_Оклад.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник,
| НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение,
| НачислениеЗарплатыОсновныеНачисления.ВидРасчета КАК ВидРасчета,
| НачислениеЗарплатыОсновныеНачисления.ДатаНачала,
| НачислениеЗарплатыОсновныеНачисления.ДатаОкончания,
| &ПериодРегистрации КАК ПериодРегистрации,
| РАЗНОСТЬДАТ(НачислениеЗарплатыОсновныеНачисления.ДатаНачала, НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, МЕСЯЦ) КАК КоличествоМесяцев
|ИЗ
| Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления
|ГДЕ
| НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка
| И НачислениеЗарплатыОсновныеНачисления.ВидРасчета = &ВидРасчетаБольничный";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("ВидРасчетаОклад", ПланыВидовРасчета.ОсновныеНачисления.Оклад);
Запрос.УстановитьПараметр("ВидРасчетаБольничный", ПланыВидовРасчета.ОсновныеНачисления.Больничный);
Запрос.УстановитьПараметр("ПериодРегистрации", НачалоМесяца(Дата));
МассивРезультатов = Запрос.ВыполнитьПакет();
// Обход результата запроса по Окладу, заполнение движений в регистре
ВыборкаОклад = МассивРезультатов[1].Выбрать();
Пока ВыборкаОклад.Следующий() Цикл
Движение = Движения.ОсновныеНачисления.Добавить();
ЗаполнитьЗначенияСвойств(Движение, ВыборкаОклад);
КонецЦикла;
// Обход результата запроса по Больничному, заполнение движений в регистре
ВыборкаБольничный = МассивРезультатов[2].Выбрать();
// Разбиваем заданный период больничного по месяцам, при этом для каждого записи в качестве начала периода действия
// устанавливаем начало месяца, в качестве конца - конец месяца, переопределяем только начало периода действия
// для первой строки и конец периода действия для последней строки
Пока ВыборкаБольничный.Следующий() Цикл
Для ИндексМесяца = 0 По ВыборкаБольничный.КоличествоМесяцев Цикл
Движение = Движения.ОсновныеНачисления.Добавить();
ЗаполнитьЗначенияСвойств(Движение, ВыборкаБольничный);
НачалоТекущегоМесяца = НачалоМесяца (ДобавитьМесяц(ВыборкаБольничный.ДатаНачала, ИндексМесяца));
Если ИндексМесяца = 0 Тогда
ПериодДействияНачало = ВыборкаБольничный.ДатаНачала // Переопределение значения ПериодДействияНачало для первой строки
Иначе
ПериодДействияНачало = НачалоТекущегоМесяца;
КонецЕсли;
Движение.ПериодДействияНачало = ПериодДействияНачало;
Движение.ПериодДействияКонец = КонецМесяца(НачалоТекущегоМесяца);
Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоТекущегоМесяца, -1);
Движение.БазовыйПериодКонец = КонецМесяца(Движение.БазовыйПериодНачало);
КонецЦикла;
Движение.ПериодДействияКонец = ВыборкаБольничный.ДатаОкончания; // Переопределение значения ПериодДействияКонец для последней строки
КонецЦикла;
// Данные могут вводиться задним числом, значит необходимо сформировать сторно записи
СторноЗаписи = Движения.ОсновныеНачисления.ПолучитьДополнение();
Для Каждого Сторно Из СторноЗаписи Цикл
Движение = Движения.ОсновныеНачисления.Добавить();
ЗаполнитьЗначенияСвойств(Движение, Сторно);
Движение.ПериодРегистрации = Сторно.ПериодРегистрацииСторно;
Движение.ПериодДействияНачало = Сторно.ПериодДействияНачалоСторно;
Движение.ПериодДействияКонец = Сторно.ПериодДействияКонецСторно;
Движение.Сторно = Истина;
КонецЦикла;
// Запись рабочего набора записей
Движения.ОсновныеНачисления.Записать();
// Окончательный расчет данных в регистре
Расчет.РассчитатьНачисления(Ссылка, Движения.ОсновныеНачисления);
КонецПроцедуры