Как получить в СКД крайнюю дату всех последовательно идущих состояний
Здравствуйте. В ЗУП пытаюсь получить в СКД (отчет состояние сотрудников) крайнюю дату последовательно идущих событий, но не могу ни как добиться нужного результата, допустим у сотрудника с 01.10.2023 по 10.10.2023 идет основной отпуск, затем дополнительный с 11.10.2023 по 16.10.2023, а еще потом за свой счет с 17.10.2023 по 20.10.2023, соответственно дату нужно 20.10.2023, но если бы например отпуск за свой счет начался не с 17, а с 18, т.е. разность дат > 1 дня, то дата уже 16.10.2023. Исключение только состояние работа и увольнение.
Это доработанная часть запроса, но для некоторых позиций, где всего 2 события, это срабатывает, а те что далее уже нет!!:
Это доработанная часть запроса, но для некоторых позиций, где всего 2 события, это срабатывает, а те что далее уже нет!!:
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
СостоянияСотрудников.Период КАК Период,
ВЫБОР
КОГДА СостоянияСотрудников.ДействуетДо > ВложенныйЗапрос.ДействуетДо
ТОГДА СостоянияСотрудников.ДействуетДо
ИНАЧЕ ВложенныйЗапрос.ДействуетДо
КОНЕЦ КАК ДействуетДо,
СостоянияСотрудников.Сотрудник КАК Сотрудник,
ВЫБОР
КОГДА СостоянияСотрудников.ВидВремени = ЗНАЧЕНИЕ(Справочник.ВидыИспользованияРабочегоВремени.ПустаяСсылка)
ТОГДА СостоянияСотрудников.Состояние
ИНАЧЕ СостоянияСотрудников.ВидВремени
КОНЕЦ КАК Состояние,
ВЫБОР
КОГДА СостоянияСотрудников.Период > &НачалоПериода
ТОГДА СостоянияСотрудников.Период
ИНАЧЕ &НачалоПериода
КОНЕЦ КАК НачалоПодсчета,
ВЫБОР
КОГДА СостоянияСотрудников.ДействуетДо < &ОкончаниеПериода
И СостоянияСотрудников.ДействуетДо <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА СостоянияСотрудников.ДействуетДо
ИНАЧЕ &ОкончаниеПериода
КОНЕЦ КАК ОкончаниеПодсчета,
СостоянияСотрудников.ОкончаниеПредположительно КАК ОкончаниеПредположительно
ПОМЕСТИТЬ ВТСостоянияСотрудников
ИЗ
РегистрСведений.СостоянияСотрудников КАК СостоянияСотрудников
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
ПО (СостоянияСотрудников.Сотрудник = Сотрудники.Ссылка)
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
СостоянияСотрудников.Сотрудник КАК Сотрудник,
СостоянияСотрудников.ВидВремени КАК ВидВремени,
СостоянияСотрудников.ДействуетДо КАК ДействуетДо,
СостоянияСотрудников.Период КАК Период,
СостоянияСотрудников.ДокументОснование КАК ДокументОснование
ИЗ
РегистрСведений.СостоянияСотрудников КАК СостоянияСотрудников
ГДЕ
СостоянияСотрудников.Период >= &НачалоПериода
И СостоянияСотрудников.Сотрудник В
(ВЫБРАТЬ РАЗЛИЧНЫЕ
СПомеченнымиУбрать.Сотрудник КАК Сотрудник
ИЗ
СПомеченнымиУбрать КАК СПомеченнымиУбрать
ГДЕ
НЕ СПомеченнымиУбрать.Сотрудник ПОДОБНО "Убрать")) КАК ВложенныйЗапрос
ПО (СостоянияСотрудников.Сотрудник = ВложенныйЗапрос.Сотрудник)
И (РАЗНОСТЬДАТ(СостоянияСотрудников.ДействуетДо, ВложенныйЗапрос.Период, ДЕНЬ) <= 1)
И (НЕ СостоянияСотрудников.ДокументОснование = ВложенныйЗапрос.ДокументОснование)
ГДЕ
СостоянияСотрудников.Период МЕЖДУ &НачалоПериода И &ОкончаниеПериода
И (СостоянияСотрудников.ДействуетДо > &НачалоПериода
ИЛИ СостоянияСотрудников.ДействуетДо = ДАТАВРЕМЯ(1, 1, 1))
И СостоянияСотрудников.Состояние <> ЗНАЧЕНИЕ(Перечисление.СостоянияСотрудника.Увольнение)
И СостоянияСотрудников.Сотрудник В
(ВЫБРАТЬ РАЗЛИЧНЫЕ
СПомеченнымиУбрать.Сотрудник КАК Сотрудник
ИЗ
СПомеченнымиУбрать КАК СПомеченнымиУбрать
ГДЕ
НЕ СПомеченнымиУбрать.Сотрудник ПОДОБНО "Убрать")
И НЕ СостоянияСотрудников.ВидВремени = &РабочееВремя
И НЕ СостоянияСотрудников.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияСотрудника.Работа)
;
ПоказатьПо теме из базы знаний
Найденные решения
Верно теперь понял, вот так надо?
Скрин 1 - выборка состояний в регистре (кроме работы). Что еще "выкинуть" - параметром отсечёте.
Желтым выделил подряд идущие (смежные) нерабочие разные состояния, когда дата начала следующего равно есть следующий день от даты окончания предыдущего.
Скрин 2 - из того же запроса, финальная выборка.
Смежные периоды соединились "в один", то есть объединил соседние, но непересекающиеся интервалы.
Скрин 1 - выборка состояний в регистре (кроме работы). Что еще "выкинуть" - параметром отсечёте.
Желтым выделил подряд идущие (смежные) нерабочие разные состояния, когда дата начала следующего равно есть следующий день от даты окончания предыдущего.
Скрин 2 - из того же запроса, финальная выборка.
Смежные периоды соединились "в один", то есть объединил соседние, но непересекающиеся интервалы.
ВЫБРАТЬ
СостоянияСотрудников.Сотрудник КАК Сотрудник,
СостоянияСотрудников.Период КАК НачалоПериода,
СостоянияСотрудников.ДействуетДо КАК ДействуетДо,
СостоянияСотрудников.Состояние КАК Состояние
ПОМЕСТИТЬ Дано
ИЗ
РегистрСведений.СостоянияСотрудников КАК СостоянияСотрудников
ГДЕ
СостоянияСотрудников.Сотрудник В(&Сотрудник)
И СостоянияСотрудников.Период > &НачалоПериода
И НЕ СостоянияСотрудников.Состояние В (&Состояние)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Дано.Сотрудник КАК Сотрудник,
Дано.НачалоПериода КАК НачалоПериода,
Дано.ДействуетДо КАК Конец,
СУММА(РАЗНОСТЬДАТ(Слева.НачалоПериода, Слева.ДействуетДо, ДЕНЬ) + 1) КАК Разность
ПОМЕСТИТЬ ЕщёДано
ИЗ
Дано КАК Дано
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Дано КАК Слева
ПО (Слева.НачалоПериода <= Дано.НачалоПериода)
И Дано.Сотрудник = Слева.Сотрудник
СГРУППИРОВАТЬ ПО
Дано.НачалоПериода,
Дано.ДействуетДо,
Дано.Сотрудник
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Дано.Сотрудник КАК Сотрудник,
МИНИМУМ(Дано.НачалоПериода) КАК НачалоПериода,
МАКСИМУМ(Дано.Конец) КАК Конец
ИЗ
ЕщёДано КАК Дано
СГРУППИРОВАТЬ ПО
ДОБАВИТЬКДАТЕ(Дано.Конец, ДЕНЬ, -Дано.Разность),
Дано.Сотрудник
ПоказатьПрикрепленные файлы:


Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Сделайте проще, будет понятнее, что вам надо
По одному или многим сотрудникам надо?
По данному регистру взять срез последних, параметр по периоду, если надо, добавьте.
Выведите данные.
Если выйдет более одной записи, это сигнал к тому, что надо дополнительно в этой таблице выжать Максимум(Период)
И вот у вас этот период есть "крайняя дата"
По одному или многим сотрудникам надо?
По данному регистру взять срез последних, параметр по периоду, если надо, добавьте.
Выведите данные.
Если выйдет более одной записи, это сигнал к тому, что надо дополнительно в этой таблице выжать Максимум(Период)
И вот у вас этот период есть "крайняя дата"
(3) НУ тогда просто из регистра (не вирт таблицы) выбрать данные с нужными полями, в т.ч. "Сотрудник", Период.
Потом во вторую временную выбрать Сотрудник, Период, сгруппировать по Сотрудник, и Максимум(период)
Потом первую связать со второй внутренним соединением по полям Сотрудник и Период (классика)
Потом во вторую временную выбрать Сотрудник, Период, сгруппировать по Сотрудник, и Максимум(период)
Потом первую связать со второй внутренним соединением по полям Сотрудник и Период (классика)
(4) Добрый вечер! Не выходит:
ВЫБРАТЬ
СостоянияСотрудников.Сотрудник КАК Сотрудник,
СостоянияСотрудников.Период КАК Период,
СостоянияСотрудников.ДействуетДо КАК ДействуетДо
ПОМЕСТИТЬ ВременнаяТаблица1
ИЗ
РегистрСведений.СостоянияСотрудников КАК СостоянияСотрудников
ГДЕ
СостоянияСотрудников.Сотрудник В(&Сотрудник)
И РАЗНОСТЬДАТ(СостоянияСотрудников.ДействуетДо, СостоянияСотрудников.Период, ДЕНЬ) <= 1
И СостоянияСотрудников.Период > &НачалоПериода
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
СостоянияСотрудников.Сотрудник КАК Сотрудник,
СостоянияСотрудников.Период КАК Период,
МАКСИМУМ(СостоянияСотрудников.ДействуетДо) КАК ДействуетДо
ПОМЕСТИТЬ ВременнаяТаблица2
ИЗ
РегистрСведений.СостоянияСотрудников КАК СостоянияСотрудников
ГДЕ
СостоянияСотрудников.Сотрудник В(&Сотрудник)
И РАЗНОСТЬДАТ(СостоянияСотрудников.ДействуетДо, СостоянияСотрудников.Период, ДЕНЬ) <= 1
И СостоянияСотрудников.Период > &НачалоПериода
СГРУППИРОВАТЬ ПО
СостоянияСотрудников.Сотрудник,
СостоянияСотрудников.Период
УПОРЯДОЧИТЬ ПО
Период
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВременнаяТаблица1.ДействуетДо КАК ДействуетДо
ИЗ
ВременнаяТаблица1 КАК ВременнаяТаблица1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВременнаяТаблица2 КАК ВременнаяТаблица2
ПО (ВременнаяТаблица1.Сотрудник = ВременнаяТаблица2.Сотрудник)
И (ВременнаяТаблица1.Период = ВременнаяТаблица2.Период)
Показать
(5) Вам какая дата важнее: "период" или "действует до" ?
В общем, перебрал ваш запрос.
Я закомментил условие по разности дат, в нем неверная последовательность дат была (должно быть что первой идёт меньшая, потом большая), да и вообще это допусловие, которое примените потом, когда поймёте логику запроса.
Сейчас запрос выводит то, что надо (как я понял вас)
Выводит самую последнюю дату "период"
В общем, перебрал ваш запрос.
Я закомментил условие по разности дат, в нем неверная последовательность дат была (должно быть что первой идёт меньшая, потом большая), да и вообще это допусловие, которое примените потом, когда поймёте логику запроса.
Сейчас запрос выводит то, что надо (как я понял вас)
Выводит самую последнюю дату "период"
ВЫБРАТЬ
СостоянияСотрудников.Сотрудник КАК Сотрудник,
СостоянияСотрудников.Период КАК Период,
СостоянияСотрудников.ДействуетДо КАК ДействуетДо
ПОМЕСТИТЬ ВременнаяТаблица1
ИЗ
РегистрСведений.СостоянияСотрудников КАК СостоянияСотрудников
ГДЕ
СостоянияСотрудников.Сотрудник В(&Сотрудник)
// И РАЗНОСТЬДАТ(СостоянияСотрудников.Период, СостоянияСотрудников.ДействуетДо, ДЕНЬ) <= 1
И СостоянияСотрудников.Период > &НачалоПериода
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВременнаяТаблица1.Сотрудник КАК Сотрудник,
МАКСИМУМ(ВременнаяТаблица1.Период) КАК Период
ПОМЕСТИТЬ ВТ2
ИЗ
ВременнаяТаблица1 КАК ВременнаяТаблица1
СГРУППИРОВАТЬ ПО
ВременнаяТаблица1.Сотрудник
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВременнаяТаблица1.Сотрудник КАК Сотрудник,
ВременнаяТаблица1.Период КАК Период,
ВременнаяТаблица1.ДействуетДо КАК ДействуетДо
ИЗ
ВременнаяТаблица1 КАК ВременнаяТаблица1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ2 КАК ВТ2
ПО ВременнаяТаблица1.Сотрудник = ВТ2.Сотрудник
И ВременнаяТаблица1.Период = ВТ2.Период
Показать
(6)
Мне важна дата до, т.е. у сотрудника есть первое событие, начинается с 1.05 и до 8.05, с 9.05 по 15.05 еще одно событие и с 16.05 по 31 еще одно, таким образом дата до должна быть 31.05, поскольку события идут непрерывно
ВЫБРАТЬ
СостоянияСотрудников.Сотрудник КАК Сотрудник,
СостоянияСотрудников.Период КАК Период,
СостоянияСотрудников.ДействуетДо КАК ДействуетДо
ПОМЕСТИТЬ ВременнаяТаблица1
ИЗ
РегистрСведений.СостоянияСотрудников КАК СостоянияСотрудников
ГДЕ
СостоянияСотрудников.Сотрудник В(&Сотрудник)
// И РАЗНОСТЬДАТ(СостоянияСотрудников.Период, СостоянияСотрудников.ДействуетДо, ДЕНЬ) &НачалоПериода
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВременнаяТаблица1.Сотрудник КАК Сотрудник,
МАКСИМУМ(ВременнаяТаблица1.Период) КАК Период
ПОМЕСТИТЬ ВТ2
ИЗ
ВременнаяТаблица1 КАК ВременнаяТаблица1
СГРУППИРОВАТЬ ПО
ВременнаяТаблица1.Сотрудник
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВременнаяТаблица1.Сотрудник КАК Сотрудник,
ВременнаяТаблица1.Период КАК Период,
ВременнаяТаблица1.ДействуетДо КАК ДействуетДо
ИЗ
ВременнаяТаблица1 КАК ВременнаяТаблица1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ2 КАК ВТ2
ПО ВременнаяТаблица1.Сотрудник = ВТ2.Сотрудник
И ВременнаяТаблица1.Период = ВТ2.Период
ПоказатьСостоянияСотрудников.Сотрудник КАК Сотрудник,
СостоянияСотрудников.Период КАК Период,
СостоянияСотрудников.ДействуетДо КАК ДействуетДо
ПОМЕСТИТЬ ВременнаяТаблица1
ИЗ
РегистрСведений.СостоянияСотрудников КАК СостоянияСотрудников
ГДЕ
СостоянияСотрудников.Сотрудник В(&Сотрудник)
// И РАЗНОСТЬДАТ(СостоянияСотрудников.Период, СостоянияСотрудников.ДействуетДо, ДЕНЬ) &НачалоПериода
;
////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВременнаяТаблица1.Сотрудник КАК Сотрудник,
МАКСИМУМ(ВременнаяТаблица1.Период) КАК Период
ПОМЕСТИТЬ ВТ2
ИЗ
ВременнаяТаблица1 КАК ВременнаяТаблица1
СГРУППИРОВАТЬ ПО
ВременнаяТаблица1.Сотрудник
;
////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВременнаяТаблица1.Сотрудник КАК Сотрудник,
ВременнаяТаблица1.Период КАК Период,
ВременнаяТаблица1.ДействуетДо КАК ДействуетДо
ИЗ
ВременнаяТаблица1 КАК ВременнаяТаблица1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ2 КАК ВТ2
ПО ВременнаяТаблица1.Сотрудник = ВТ2.Сотрудник
И ВременнаяТаблица1.Период = ВТ2.Период
Мне важна дата до, т.е. у сотрудника есть первое событие, начинается с 1.05 и до 8.05, с 9.05 по 15.05 еще одно событие и с 16.05 по 31 еще одно, таким образом дата до должна быть 31.05, поскольку события идут непрерывно
(10)Работу нужно исключить, важно только отсутствие, у Вас нет подобного примера, нужно чтобы несколько отсутствий было, например отпуск, затем сразу больничный и вот крайняя дата отсутствия будет дата окончания больничного, а начало отсутствия дата начала отпуска.
(10) Работу как и увольнения исключаем, нужны только отсутствия. У Вас нет примера в списке, нужно, чтобы сразу два подряд отсутствия было, например человек пошел в отпуск 07.10.2023 по 22.10.2023, но 23 заболел и у него больничный по 30.10.2023, поэтому дата начала отсутствия будет равна 07.10.2023 и до 30.10.2023
Верно теперь понял, вот так надо?
Скрин 1 - выборка состояний в регистре (кроме работы). Что еще "выкинуть" - параметром отсечёте.
Желтым выделил подряд идущие (смежные) нерабочие разные состояния, когда дата начала следующего равно есть следующий день от даты окончания предыдущего.
Скрин 2 - из того же запроса, финальная выборка.
Смежные периоды соединились "в один", то есть объединил соседние, но непересекающиеся интервалы.
Скрин 1 - выборка состояний в регистре (кроме работы). Что еще "выкинуть" - параметром отсечёте.
Желтым выделил подряд идущие (смежные) нерабочие разные состояния, когда дата начала следующего равно есть следующий день от даты окончания предыдущего.
Скрин 2 - из того же запроса, финальная выборка.
Смежные периоды соединились "в один", то есть объединил соседние, но непересекающиеся интервалы.
ВЫБРАТЬ
СостоянияСотрудников.Сотрудник КАК Сотрудник,
СостоянияСотрудников.Период КАК НачалоПериода,
СостоянияСотрудников.ДействуетДо КАК ДействуетДо,
СостоянияСотрудников.Состояние КАК Состояние
ПОМЕСТИТЬ Дано
ИЗ
РегистрСведений.СостоянияСотрудников КАК СостоянияСотрудников
ГДЕ
СостоянияСотрудников.Сотрудник В(&Сотрудник)
И СостоянияСотрудников.Период > &НачалоПериода
И НЕ СостоянияСотрудников.Состояние В (&Состояние)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Дано.Сотрудник КАК Сотрудник,
Дано.НачалоПериода КАК НачалоПериода,
Дано.ДействуетДо КАК Конец,
СУММА(РАЗНОСТЬДАТ(Слева.НачалоПериода, Слева.ДействуетДо, ДЕНЬ) + 1) КАК Разность
ПОМЕСТИТЬ ЕщёДано
ИЗ
Дано КАК Дано
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Дано КАК Слева
ПО (Слева.НачалоПериода <= Дано.НачалоПериода)
И Дано.Сотрудник = Слева.Сотрудник
СГРУППИРОВАТЬ ПО
Дано.НачалоПериода,
Дано.ДействуетДо,
Дано.Сотрудник
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Дано.Сотрудник КАК Сотрудник,
МИНИМУМ(Дано.НачалоПериода) КАК НачалоПериода,
МАКСИМУМ(Дано.Конец) КАК Конец
ИЗ
ЕщёДано КАК Дано
СГРУППИРОВАТЬ ПО
ДОБАВИТЬКДАТЕ(Дано.Конец, ДЕНЬ, -Дано.Разность),
Дано.Сотрудник
ПоказатьПрикрепленные файлы:


Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот