Запрос для неоднократного изменения окладов
Данный запрос был написан для Билета №2 без учета подразделений (в регистре СведенияОСотрудниках нет измерения Подразделение)
Тестовые данные:
Документ "Начисление зарплаты"
N Сотрудник Вид расчета Дата начала Дата окончания
1 Бельдыев Оклад 01.07.2015 10.07.2015
2 Бельдыев Оклад 20.07.2015 31.07.2015
3 Иванов Оклад 01.07.2015 31.07.2015
4 Иванов Оклад 01.05.2015 31.05.2015
Регистр "Сведения о сотрудниках"
Период Сотрудник Оклад
01.01.2015 Бельдыев 10 000,00
01.01.2015 Иванов 15 000,00
01.07.2015 Иванов 25 000,00
02.07.2015 Бельдыев 15 000,00
10.07.2015 Бельдыев 17 000,00
25.07.2015 Бельдыев 13 500,00
31.07.2015 Иванов 20 000,00
Результат запроса:
Сотрудник ВидРасчета ПериодДействияНачало ПериодДействияКонец Размер
Бельдыев Оклад 01.07.2015 0:00:00 01.07.2015 23:59:59 10 000
Бельдыев Оклад 02.07.2015 0:00:00 09.07.2015 23:59:59 15 000
Бельдыев Оклад 10.07.2015 0:00:00 10.07.2015 23:59:59 17 000
Бельдыев Оклад 20.07.2015 0:00:00 24.07.2015 23:59:59 17 000
Бельдыев Оклад 25.07.2015 0:00:00 31.07.2015 23:59:59 13 500
Иванов Оклад 01.05.2015 0:00:00 31.05.2015 23:59:59 15 000
Иванов Оклад 01.07.2015 0:00:00 30.07.2015 23:59:59 25 000
Иванов Оклад 31.07.2015 0:00:00 31.07.2015 23:59:59 20 000
Текст запроса:
ВЫБРАТЬ
НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник,
НачислениеЗарплатыОсновныеНачисления.ВидРасчета,
НАЧАЛОПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаНачала, ДЕНЬ) КАК ДатаНачала,
КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ДатаОкончания
ПОМЕСТИТЬ ДанныеДокумента
ИЗ
Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления
ГДЕ
НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка
ИНДЕКСИРОВАТЬ ПО
Сотрудник
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
МАКСИМУМ(СведенияОСотрудниках.Период) КАК Период,
СведенияОСотрудниках.Сотрудник КАК Сотрудник
ПОМЕСТИТЬ СотрудникиСрез
ИЗ
РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДанныеДокумента КАК ДанныеДокумента
ПО СведенияОСотрудниках.Сотрудник = ДанныеДокумента.Сотрудник
ГДЕ
СведенияОСотрудниках.Период <= ДанныеДокумента.ДатаОкончания
СГРУППИРОВАТЬ ПО
СведенияОСотрудниках.Сотрудник
ИНДЕКСИРОВАТЬ ПО
Сотрудник
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
СведенияОСотрудниках.Сотрудник КАК Сотрудник,
СведенияОСотрудниках.Период,
СведенияОСотрудниках.Оклад
ПОМЕСТИТЬ СотрудникиСрезОклады
ИЗ
СотрудникиСрез КАК СотрудникиСрез
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках
ПО СотрудникиСрез.Сотрудник = СведенияОСотрудниках.Сотрудник
СГРУППИРОВАТЬ ПО
СведенияОСотрудниках.Сотрудник,
СведенияОСотрудниках.Период,
СведенияОСотрудниках.Оклад
ИНДЕКСИРОВАТЬ ПО
Сотрудник
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
СотрудникиСрезОклады.Сотрудник КАК Сотрудник,
ВЫБОР
КОГДА СотрудникиСрезОклады.Период < ДанныеДокумента.ДатаНачала
ТОГДА ДанныеДокумента.ДатаНачала
ИНАЧЕ СотрудникиСрезОклады.Период
КОНЕЦ КАК Период1,
МАКСИМУМ(СотрудникиСрезОклады.Период) КАК Период
ПОМЕСТИТЬ СотрудникиПериоды
ИЗ
ДанныеДокумента КАК ДанныеДокумента
ВНУТРЕННЕЕ СОЕДИНЕНИЕ СотрудникиСрезОклады КАК СотрудникиСрезОклады
ПО ДанныеДокумента.Сотрудник = СотрудникиСрезОклады.Сотрудник
И ДанныеДокумента.ДатаОкончания >= СотрудникиСрезОклады.Период
СГРУППИРОВАТЬ ПО
СотрудникиСрезОклады.Сотрудник,
ВЫБОР
КОГДА СотрудникиСрезОклады.Период < ДанныеДокумента.ДатаНачала
ТОГДА ДанныеДокумента.ДатаНачала
ИНАЧЕ СотрудникиСрезОклады.Период
КОНЕЦ
ИНДЕКСИРОВАТЬ ПО
Сотрудник
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
СотрудникиПериоды.Сотрудник КАК Сотрудник,
СотрудникиПериоды.Период1 КАК Период,
СотрудникиСрезОклады.Оклад
ПОМЕСТИТЬ ПериодыОклады
ИЗ
СотрудникиПериоды КАК СотрудникиПериоды
ВНУТРЕННЕЕ СОЕДИНЕНИЕ СотрудникиСрезОклады КАК СотрудникиСрезОклады
ПО СотрудникиПериоды.Сотрудник = СотрудникиСрезОклады.Сотрудник
И СотрудникиПериоды.Период = СотрудникиСрезОклады.Период
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДанныеДокумента.Сотрудник,
ДанныеДокумента.ДатаОкончания,
0
ИЗ
ДанныеДокумента КАК ДанныеДокумента
ИНДЕКСИРОВАТЬ ПО
Сотрудник
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПериодыОклады.Сотрудник,
ПериодыОклады.Период КАК ПериодС,
ПериодыОклады.Оклад,
МИНИМУМ(ПериодыОклады1.Период) КАК ПериодПо
ПОМЕСТИТЬ РазделениеПоПериодам
ИЗ
ПериодыОклады КАК ПериодыОклады
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПериодыОклады КАК ПериодыОклады1
ПО ПериодыОклады.Сотрудник = ПериодыОклады1.Сотрудник
И ПериодыОклады.Период < ПериодыОклады1.Период
ГДЕ
ПериодыОклады.Оклад > 0
СГРУППИРОВАТЬ ПО
ПериодыОклады.Сотрудник,
ПериодыОклады.Период,
ПериодыОклады.Оклад
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
РазделениеПоПериодам.Сотрудник КАК Сотрудник,
РазделениеПоПериодам.ПериодС,
РазделениеПоПериодам.Оклад,
ВЫБОР
КОГДА КОНЕЦПЕРИОДА(РазделениеПоПериодам.ПериодПо, ДЕНЬ) = РазделениеПоПериодам.ПериодПо
ТОГДА РазделениеПоПериодам.ПериодПо
ИНАЧЕ ДОБАВИТЬКДАТЕ(РазделениеПоПериодам.ПериодПо, ДЕНЬ, -1)
КОНЕЦ КАК ПериодПо
ПОМЕСТИТЬ РазделениеПериодовГотово
ИЗ
РазделениеПоПериодам КАК РазделениеПоПериодам
ИНДЕКСИРОВАТЬ ПО
Сотрудник
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДанныеДокумента.Сотрудник КАК Сотрудник,
ДанныеДокумента.ВидРасчета,
ЕСТЬNULL(РазделениеПериодовГотово.ПериодС, ДанныеДокумента.ДатаНачала) КАК ПериодДействияНачало,
КОНЕЦПЕРИОДА(ЕСТЬNULL(РазделениеПериодовГотово.ПериодПо, ДанныеДокумента.ДатаОкончания), ДЕНЬ) КАК ПериодДействияКонец,
ЕСТЬNULL(РазделениеПериодовГотово.Оклад, 0) КАК Размер
ИЗ
ДанныеДокумента КАК ДанныеДокумента
ЛЕВОЕ СОЕДИНЕНИЕ РазделениеПериодовГотово КАК РазделениеПериодовГотово
ПО ДанныеДокумента.Сотрудник = РазделениеПериодовГотово.Сотрудник
СГРУППИРОВАТЬ ПО
ДанныеДокумента.Сотрудник,
ДанныеДокумента.ВидРасчета,
ЕСТЬNULL(РазделениеПериодовГотово.ПериодС, ДанныеДокумента.ДатаНачала),
КОНЕЦПЕРИОДА(ЕСТЬNULL(РазделениеПериодовГотово.ПериодПо, ДанныеДокумента.ДатаОкончания), ДЕНЬ),
ЕСТЬNULL(РазделениеПериодовГотово.Оклад, 0)
УПОРЯДОЧИТЬ ПО
Сотрудник,
ПериодДействияНачало
АВТОУПОРЯДОЧИВАНИЕ