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