Как получить в СКД крайнюю дату всех последовательно идущих состояний

1. VID1234 147 01.11.23 22:09 Сейчас в теме
Здравствуйте. В ЗУП пытаюсь получить в СКД (отчет состояние сотрудников) крайнюю дату последовательно идущих событий, но не могу ни как добиться нужного результата, допустим у сотрудника с 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 события, это срабатывает, а те что далее уже нет!!:
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	СостоянияСотрудников.Период КАК Период,
	ВЫБОР
		КОГДА СостоянияСотрудников.ДействуетДо > ВложенныйЗапрос.ДействуетДо
			ТОГДА СостоянияСотрудников.ДействуетДо
		ИНАЧЕ ВложенныйЗапрос.ДействуетДо
	КОНЕЦ КАК ДействуетДо,
	СостоянияСотрудников.Сотрудник КАК Сотрудник,
	ВЫБОР
		КОГДА СостоянияСотрудников.ВидВремени = ЗНАЧЕНИЕ(Справочник.ВидыИспользованияРабочегоВремени.ПустаяСсылка)
			ТОГДА СостоянияСотрудников.Состояние
		ИНАЧЕ СостоянияСотрудников.ВидВремени
	КОНЕЦ КАК Состояние,
	ВЫБОР
		КОГДА СостоянияСотрудников.Период > &НачалоПериода
			ТОГДА СостоянияСотрудников.Период
		ИНАЧЕ &НачалоПериода
	КОНЕЦ КАК НачалоПодсчета,
	ВЫБОР
		КОГДА СостоянияСотрудников.ДействуетДо < &ОкончаниеПериода
				И СостоянияСотрудников.ДействуетДо <> ДАТАВРЕМЯ(1, 1, 1)
			ТОГДА СостоянияСотрудников.ДействуетДо
		ИНАЧЕ &ОкончаниеПериода
	КОНЕЦ КАК ОкончаниеПодсчета,
	СостоянияСотрудников.ОкончаниеПредположительно КАК ОкончаниеПредположительно
ПОМЕСТИТЬ ВТСостоянияСотрудников
ИЗ
	РегистрСведений.СостоянияСотрудников КАК СостоянияСотрудников
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
		ПО (СостоянияСотрудников.Сотрудник = Сотрудники.Ссылка)
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			СостоянияСотрудников.Сотрудник КАК Сотрудник,
			СостоянияСотрудников.ВидВремени КАК ВидВремени,
			СостоянияСотрудников.ДействуетДо КАК ДействуетДо,
			СостоянияСотрудников.Период КАК Период,
			СостоянияСотрудников.ДокументОснование КАК ДокументОснование
		ИЗ
			РегистрСведений.СостоянияСотрудников КАК СостоянияСотрудников
		ГДЕ
			СостоянияСотрудников.Период >= &НачалоПериода
			И СостоянияСотрудников.Сотрудник В
					(ВЫБРАТЬ РАЗЛИЧНЫЕ
						СПомеченнымиУбрать.Сотрудник КАК Сотрудник
					ИЗ
						СПомеченнымиУбрать КАК СПомеченнымиУбрать
					ГДЕ
						НЕ СПомеченнымиУбрать.Сотрудник ПОДОБНО "Убрать")) КАК ВложенныйЗапрос
		ПО (СостоянияСотрудников.Сотрудник = ВложенныйЗапрос.Сотрудник)
			И (РАЗНОСТЬДАТ(СостоянияСотрудников.ДействуетДо, ВложенныйЗапрос.Период, ДЕНЬ) <= 1)
			И (НЕ СостоянияСотрудников.ДокументОснование = ВложенныйЗапрос.ДокументОснование)
ГДЕ
	СостоянияСотрудников.Период МЕЖДУ &НачалоПериода И &ОкончаниеПериода
	И (СостоянияСотрудников.ДействуетДо > &НачалоПериода
			ИЛИ СостоянияСотрудников.ДействуетДо = ДАТАВРЕМЯ(1, 1, 1))
	И СостоянияСотрудников.Состояние <> ЗНАЧЕНИЕ(Перечисление.СостоянияСотрудника.Увольнение)
	И СостоянияСотрудников.Сотрудник В
			(ВЫБРАТЬ РАЗЛИЧНЫЕ
				СПомеченнымиУбрать.Сотрудник КАК Сотрудник
			ИЗ
				СПомеченнымиУбрать КАК СПомеченнымиУбрать
			ГДЕ
				НЕ СПомеченнымиУбрать.Сотрудник ПОДОБНО "Убрать")
	И НЕ СостоянияСотрудников.ВидВремени = &РабочееВремя
	И НЕ СостоянияСотрудников.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияСотрудника.Работа)
;
Показать
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
16. Vinzor 112 02.11.23 19:00 Сейчас в теме +2 $m
Верно теперь понял, вот так надо?
Скрин 1 - выборка состояний в регистре (кроме работы). Что еще "выкинуть" - параметром отсечёте.
Желтым выделил подряд идущие (смежные) нерабочие разные состояния, когда дата начала следующего равно есть следующий день от даты окончания предыдущего.
Скрин 2 - из того же запроса, финальная выборка.
Смежные периоды соединились "в один", то есть объединил соседние, но непересекающиеся интервалы.
ВЫБРАТЬ
	СостоянияСотрудников.Сотрудник КАК Сотрудник,
	СостоянияСотрудников.Период КАК НачалоПериода,
	СостоянияСотрудников.ДействуетДо КАК ДействуетДо,
	СостоянияСотрудников.Состояние КАК Состояние
ПОМЕСТИТЬ Дано
ИЗ
	РегистрСведений.СостоянияСотрудников КАК СостоянияСотрудников
ГДЕ
	СостоянияСотрудников.Сотрудник В(&Сотрудник)
	И СостоянияСотрудников.Период > &НачалоПериода
	И НЕ СостоянияСотрудников.Состояние В (&Состояние)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Дано.Сотрудник КАК Сотрудник,
	Дано.НачалоПериода КАК НачалоПериода,
	Дано.ДействуетДо КАК Конец,
	СУММА(РАЗНОСТЬДАТ(Слева.НачалоПериода, Слева.ДействуетДо, ДЕНЬ) + 1) КАК Разность
ПОМЕСТИТЬ ЕщёДано
ИЗ
	Дано КАК Дано
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Дано КАК Слева
		ПО (Слева.НачалоПериода <= Дано.НачалоПериода)
			И Дано.Сотрудник = Слева.Сотрудник

СГРУППИРОВАТЬ ПО
	Дано.НачалоПериода,
	Дано.ДействуетДо,
	Дано.Сотрудник
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Дано.Сотрудник КАК Сотрудник,
	МИНИМУМ(Дано.НачалоПериода) КАК НачалоПериода,
	МАКСИМУМ(Дано.Конец) КАК Конец
ИЗ
	ЕщёДано КАК Дано

СГРУППИРОВАТЬ ПО
	ДОБАВИТЬКДАТЕ(Дано.Конец, ДЕНЬ, -Дано.Разность),
	Дано.Сотрудник
Показать
Прикрепленные файлы:
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
14. user1880116 02.11.23 18:30 Сейчас в теме
(1)
крайнюю дату последовательно идущих событий

ВЫБРАТЬ * ИЗ РегистрСведений.СостоянияСотрудников.СрезКрайних...

Да, это действительно хорошо звучит.
15. VID1234 147 02.11.23 18:31 Сейчас в теме
(14) Здравствуйте. Ага, срез последних вообще некорректно работает.
2. Vinzor 112 01.11.23 23:56 Сейчас в теме
Сделайте проще, будет понятнее, что вам надо
По одному или многим сотрудникам надо?
По данному регистру взять срез последних, параметр по периоду, если надо, добавьте.
Выведите данные.
Если выйдет более одной записи, это сигнал к тому, что надо дополнительно в этой таблице выжать Максимум(Период)
И вот у вас этот период есть "крайняя дата"
3. VID1234 147 02.11.23 11:54 Сейчас в теме
(2)Здравствуйте. По нескольким, А срез последних на какую дату 3999? У меня видь период формирования отчета раньше чем дата состояния, может я формирую отчет за 01.10, а событие отпуск например у сотрудника до 01.12
4. Vinzor 112 02.11.23 17:23 Сейчас в теме
(3) НУ тогда просто из регистра (не вирт таблицы) выбрать данные с нужными полями, в т.ч. "Сотрудник", Период.
Потом во вторую временную выбрать Сотрудник, Период, сгруппировать по Сотрудник, и Максимум(период)
Потом первую связать со второй внутренним соединением по полям Сотрудник и Период (классика)
5. VID1234 147 02.11.23 17:42 Сейчас в теме
(4) Добрый вечер! Не выходит:
ВЫБРАТЬ
	СостоянияСотрудников.Сотрудник КАК Сотрудник,
	СостоянияСотрудников.Период КАК Период,
	СостоянияСотрудников.ДействуетДо КАК ДействуетДо
ПОМЕСТИТЬ ВременнаяТаблица1
ИЗ
	РегистрСведений.СостоянияСотрудников КАК СостоянияСотрудников
ГДЕ
	СостоянияСотрудников.Сотрудник В(&Сотрудник)
	И РАЗНОСТЬДАТ(СостоянияСотрудников.ДействуетДо, СостоянияСотрудников.Период, ДЕНЬ) <= 1
	И СостоянияСотрудников.Период > &НачалоПериода
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
	СостоянияСотрудников.Сотрудник КАК Сотрудник,
	СостоянияСотрудников.Период КАК Период,
	МАКСИМУМ(СостоянияСотрудников.ДействуетДо) КАК ДействуетДо
ПОМЕСТИТЬ ВременнаяТаблица2
ИЗ
	РегистрСведений.СостоянияСотрудников КАК СостоянияСотрудников
ГДЕ
	СостоянияСотрудников.Сотрудник В(&Сотрудник)
	И РАЗНОСТЬДАТ(СостоянияСотрудников.ДействуетДо, СостоянияСотрудников.Период, ДЕНЬ) <= 1
	И СостоянияСотрудников.Период > &НачалоПериода

СГРУППИРОВАТЬ ПО
	СостоянияСотрудников.Сотрудник,
	СостоянияСотрудников.Период

УПОРЯДОЧИТЬ ПО
	Период
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВременнаяТаблица1.ДействуетДо КАК ДействуетДо
ИЗ
	ВременнаяТаблица1 КАК ВременнаяТаблица1
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВременнаяТаблица2 КАК ВременнаяТаблица2
		ПО (ВременнаяТаблица1.Сотрудник = ВременнаяТаблица2.Сотрудник)
			И (ВременнаяТаблица1.Период = ВременнаяТаблица2.Период)
Показать
6. Vinzor 112 02.11.23 17:54 Сейчас в теме
(5) Вам какая дата важнее: "период" или "действует до" ?
В общем, перебрал ваш запрос.
Я закомментил условие по разности дат, в нем неверная последовательность дат была (должно быть что первой идёт меньшая, потом большая), да и вообще это допусловие, которое примените потом, когда поймёте логику запроса.
Сейчас запрос выводит то, что надо (как я понял вас)
Выводит самую последнюю дату "период"

ВЫБРАТЬ
	СостоянияСотрудников.Сотрудник КАК Сотрудник,
	СостоянияСотрудников.Период КАК Период,
	СостоянияСотрудников.ДействуетДо КАК ДействуетДо
ПОМЕСТИТЬ ВременнаяТаблица1
ИЗ
	РегистрСведений.СостоянияСотрудников КАК СостоянияСотрудников
ГДЕ
	СостоянияСотрудников.Сотрудник В(&Сотрудник)
//	И РАЗНОСТЬДАТ(СостоянияСотрудников.Период, СостоянияСотрудников.ДействуетДо, ДЕНЬ) <= 1
	И СостоянияСотрудников.Период > &НачалоПериода
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВременнаяТаблица1.Сотрудник КАК Сотрудник,
	МАКСИМУМ(ВременнаяТаблица1.Период) КАК Период
ПОМЕСТИТЬ ВТ2
ИЗ
	ВременнаяТаблица1 КАК ВременнаяТаблица1

СГРУППИРОВАТЬ ПО
	ВременнаяТаблица1.Сотрудник
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВременнаяТаблица1.Сотрудник КАК Сотрудник,
	ВременнаяТаблица1.Период КАК Период,
	ВременнаяТаблица1.ДействуетДо КАК ДействуетДо
ИЗ
	ВременнаяТаблица1 КАК ВременнаяТаблица1
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ2 КАК ВТ2
		ПО ВременнаяТаблица1.Сотрудник = ВТ2.Сотрудник
			И ВременнаяТаблица1.Период = ВТ2.Период
Показать
7. VID1234 147 02.11.23 18:02 Сейчас в теме
(6)
ВЫБРАТЬ
СостоянияСотрудников.Сотрудник КАК Сотрудник,
СостоянияСотрудников.Период КАК Период,
СостоянияСотрудников.ДействуетДо КАК ДействуетДо
ПОМЕСТИТЬ ВременнаяТаблица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, поскольку события идут непрерывно
8. VID1234 147 02.11.23 18:09 Сейчас в теме
(6) Вот регистр и что мне нужно получить
Прикрепленные файлы:
9. VID1234 147 02.11.23 18:17 Сейчас в теме
(6) А это что выводит запрос:
Прикрепленные файлы:
10. Vinzor 112 02.11.23 18:20 Сейчас в теме
Давайте так. У меня своя база со своими данными. Вот пример. Я обвёл дату. Надо её надо получить или какую в какой строке ?
Прикрепленные файлы:
11. VID1234 147 02.11.23 18:23 Сейчас в теме
(10)Работу нужно исключить, важно только отсутствие, у Вас нет подобного примера, нужно чтобы несколько отсутствий было, например отпуск, затем сразу больничный и вот крайняя дата отсутствия будет дата окончания больничного, а начало отсутствия дата начала отпуска.
12. VID1234 147 02.11.23 18:25 Сейчас в теме
(10) Работу как и увольнения исключаем, нужны только отсутствия. У Вас нет примера в списке, нужно, чтобы сразу два подряд отсутствия было, например человек пошел в отпуск 07.10.2023 по 22.10.2023, но 23 заболел и у него больничный по 30.10.2023, поэтому дата начала отсутствия будет равна 07.10.2023 и до 30.10.2023
13. VID1234 147 02.11.23 18:28 Сейчас в теме
(12) и таких отсутствий может быть несколько, дополнительный отпуск, прогул и т.п., т.е. именно важен тот момент, что нужна крайняя дата последнего события - последовательно идущих событий от первого события, а дата начала будет началом первого события
16. Vinzor 112 02.11.23 19:00 Сейчас в теме +2 $m
Верно теперь понял, вот так надо?
Скрин 1 - выборка состояний в регистре (кроме работы). Что еще "выкинуть" - параметром отсечёте.
Желтым выделил подряд идущие (смежные) нерабочие разные состояния, когда дата начала следующего равно есть следующий день от даты окончания предыдущего.
Скрин 2 - из того же запроса, финальная выборка.
Смежные периоды соединились "в один", то есть объединил соседние, но непересекающиеся интервалы.
ВЫБРАТЬ
	СостоянияСотрудников.Сотрудник КАК Сотрудник,
	СостоянияСотрудников.Период КАК НачалоПериода,
	СостоянияСотрудников.ДействуетДо КАК ДействуетДо,
	СостоянияСотрудников.Состояние КАК Состояние
ПОМЕСТИТЬ Дано
ИЗ
	РегистрСведений.СостоянияСотрудников КАК СостоянияСотрудников
ГДЕ
	СостоянияСотрудников.Сотрудник В(&Сотрудник)
	И СостоянияСотрудников.Период > &НачалоПериода
	И НЕ СостоянияСотрудников.Состояние В (&Состояние)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Дано.Сотрудник КАК Сотрудник,
	Дано.НачалоПериода КАК НачалоПериода,
	Дано.ДействуетДо КАК Конец,
	СУММА(РАЗНОСТЬДАТ(Слева.НачалоПериода, Слева.ДействуетДо, ДЕНЬ) + 1) КАК Разность
ПОМЕСТИТЬ ЕщёДано
ИЗ
	Дано КАК Дано
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Дано КАК Слева
		ПО (Слева.НачалоПериода <= Дано.НачалоПериода)
			И Дано.Сотрудник = Слева.Сотрудник

СГРУППИРОВАТЬ ПО
	Дано.НачалоПериода,
	Дано.ДействуетДо,
	Дано.Сотрудник
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Дано.Сотрудник КАК Сотрудник,
	МИНИМУМ(Дано.НачалоПериода) КАК НачалоПериода,
	МАКСИМУМ(Дано.Конец) КАК Конец
ИЗ
	ЕщёДано КАК Дано

СГРУППИРОВАТЬ ПО
	ДОБАВИТЬКДАТЕ(Дано.Конец, ДЕНЬ, -Дано.Разность),
	Дано.Сотрудник
Показать
Прикрепленные файлы:
17. VID1234 147 02.11.23 19:19 Сейчас в теме
19. VID1234 147 02.11.23 22:18 Сейчас в теме
(16) Спасибо. Правда еще повозился далее с дублями, но главное это решено. Жму руку.
20. DENSKR 16 02.11.23 22:38 Сейчас в теме
(16) Хорош, но можно лучше.
18. DENSKR 16 02.11.23 20:43 Сейчас в теме
Только "дата" в данном случае является "последней". :-)
Оставьте свое сообщение

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