Как запросом получить периоды действия доп. тарифа?
По теме из базы знаний
- Сервисы 1С. Часть III
- Обмен 1С с системой ЦРПТ (Универсальная конфигурация ХамелеонЦРПТ + маркировка табака, обуви, одежды, лекарств, фото, молока, духов(парфюма), питьевой воды, велосипедов и шин)
- Форма расчета по страховым взносам за 4 квартал 2020 г. для ЗУП 2.5 и ЗГУ 1.0
- Интеграция ФГИС Зерно и 1С: обмен с системой через API для любых конфигураций (универсальная подсистема ХамелеонЗерно)
Найденные решения
В итоге получилось как то так.
ВЫБРАТЬ
Таблица1.Сотрудник КАК Сотрудник,
Таблица1.УсловияТруда КАК УсловияТруда,
МИНИМУМ(Таблица1.Период) КАК ПериодНачало,
Таблица2.Период КАК ПериодОкончание
ИЗ
РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников КАК Таблица1
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников КАК Таблица3
ПО Таблица1.Сотрудник = Таблица3.Сотрудник
И Таблица1.УсловияТруда = Таблица3.УсловияТруда
И (Таблица3.Период = ДОБАВИТЬКДАТЕ(Таблица1.Период, ДЕНЬ, -1))
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников КАК Таблица2
ПО Таблица1.Сотрудник = Таблица2.Сотрудник
И Таблица1.УсловияТруда = Таблица2.УсловияТруда
И (Таблица2.Период В
(ВЫБРАТЬ
МИНИМУМ(Н.Период)
ИЗ
РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников КАК Н
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников КАК Н1
ПО
Н.Сотрудник = Н1.Сотрудник
И Н.УсловияТруда = Н1.УсловияТруда
И Н1.Период = ДОБАВИТЬКДАТЕ(Н.Период, ДЕНЬ, 1)
ГДЕ
Н.Период >= Таблица1.Период
И Н.Сотрудник = Таблица1.Сотрудник
И Н.УсловияТруда = Таблица1.УсловияТруда
И Н1.Период ЕСТЬ NULL))
ГДЕ
НЕ Таблица1.УсловияТруда = ЗНАЧЕНИЕ(Справочник.УсловияТруда.ПустаяСсылка)
И Таблица1.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
И Таблица1.Организация = &Организация
СГРУППИРОВАТЬ ПО
Таблица1.Сотрудник,
Таблица1.УсловияТруда,
Таблица2.Период ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
из исходной таблицы надо создать
1)отдельную таблицу для определения даты начала действия тарифа
группировки сотрудник, условия труда, мин(Период)
2)1)отдельную таблицу для определения даты окончания действия тарифа
группировки сотрудник, условия труда, Макс(Период)
3) итоговую таблицу из первых 2х. Там берем Сотрудник, условия труда , начало из 1 таблицы, конец из 2 таблицы
1)отдельную таблицу для определения даты начала действия тарифа
группировки сотрудник, условия труда, мин(Период)
2)1)отдельную таблицу для определения даты окончания действия тарифа
группировки сотрудник, условия труда, Макс(Период)
3) итоговую таблицу из первых 2х. Там берем Сотрудник, условия труда , начало из 1 таблицы, конец из 2 таблицы
если возможен вариант, при котором тарифы меняются туда сюда несколько раз (т.е. начал действия может быть несколько), то я рекомендовал бы просто в коде таблицу анализировать, а не запросом.
(4) Можно и запросом.
Сначала для каждой строки определи предыдущее значение (предыдущую строку). Если строка значение не меняет, то можно её выкинуть. Она не нужна. Останутся только строки, которые меняют значение. Далее всё просто.
Сначала для каждой строки определи предыдущее значение (предыдущую строку). Если строка значение не меняет, то можно её выкинуть. Она не нужна. Останутся только строки, которые меняют значение. Далее всё просто.
В итоге получилось как то так.
ВЫБРАТЬ
Таблица1.Сотрудник КАК Сотрудник,
Таблица1.УсловияТруда КАК УсловияТруда,
МИНИМУМ(Таблица1.Период) КАК ПериодНачало,
Таблица2.Период КАК ПериодОкончание
ИЗ
РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников КАК Таблица1
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников КАК Таблица3
ПО Таблица1.Сотрудник = Таблица3.Сотрудник
И Таблица1.УсловияТруда = Таблица3.УсловияТруда
И (Таблица3.Период = ДОБАВИТЬКДАТЕ(Таблица1.Период, ДЕНЬ, -1))
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников КАК Таблица2
ПО Таблица1.Сотрудник = Таблица2.Сотрудник
И Таблица1.УсловияТруда = Таблица2.УсловияТруда
И (Таблица2.Период В
(ВЫБРАТЬ
МИНИМУМ(Н.Период)
ИЗ
РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников КАК Н
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников КАК Н1
ПО
Н.Сотрудник = Н1.Сотрудник
И Н.УсловияТруда = Н1.УсловияТруда
И Н1.Период = ДОБАВИТЬКДАТЕ(Н.Период, ДЕНЬ, 1)
ГДЕ
Н.Период >= Таблица1.Период
И Н.Сотрудник = Таблица1.Сотрудник
И Н.УсловияТруда = Таблица1.УсловияТруда
И Н1.Период ЕСТЬ NULL))
ГДЕ
НЕ Таблица1.УсловияТруда = ЗНАЧЕНИЕ(Справочник.УсловияТруда.ПустаяСсылка)
И Таблица1.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
И Таблица1.Организация = &Организация
СГРУППИРОВАТЬ ПО
Таблица1.Сотрудник,
Таблица1.УсловияТруда,
Таблица2.Период Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот
