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