Период Этап Состояние
05.03.24 Процесс 1 Идет
06.03.24 Процесс 1 Идет
07.03.24 Процесс 1 Закрыто
08.03.24 Процесс 1 Идет
09.03.24 Процесс 1 Идет
10.03.24 Процесс 1 Закрыто
11.03.24 Процесс 2 Идет
12.03.24 Процесс 1 Идет
13.03.24 Процесс 2 Идет
Как запросом получить без промежуточных записей без признака закрыто. Закрыта подряд запись будет один раз.
Вот в таком виде (нужно чтобы не засорять отображение в динамическом списке
лишними сигналами, что процесс идет, т.к. сигналы продуцируются оборудованием постоянно и игнорировать нельзя
но отображать не нужно лишние).
Период Этап Состояние
05.03.24 Процесс 1 Идет
07.03.24 Процесс 1 Закрыто
08.03.24 Процесс 1 Идет
10.03.24 Процесс 1 Закрыто
11.03.24 Процесс 2 Идет
12.03.24 Процесс 1 Идет
Всем спасибо. Вопрос снимается. Умудрился сделать запросом в динамическом списке всё что было нужно.
ВЫБРАТЬ
ДАТАВРЕМЯ(2024, 3, 5) КАК Период,
"Процесс1" КАК Этап,
"Идет" КАК Состояние
ПОМЕСТИТЬ Данные
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2024, 3, 6),
"Процесс1",
"Идет"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2024, 3, 7),
"Процесс1",
"Закрыто"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2024, 3, 8),
"Процесс1",
"Идет"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2024, 3, 9),
"Процесс1",
"Идет"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2024, 3, 10),
"Процесс1",
"Закрыто"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2024, 3, 11),
"Процесс2",
"Идет"
;
ВЫБРАТЬ
Период,
Этап,
Состояние
ПОМЕСТИТЬ ВТЗакрытия
ИЗ
ДАННЫЕ
ГДЕ
Состояние = "Закрыто"
;
Выбрать
Т1.Период,
Т1.Этап,
Т1.Состояние,
МИНИМУМ(Т2.Период) КАК Дата
ПОМЕСТИТЬ ВТПроцессыДаты
ИЗ
Данные КАК Т1
Левое соединение ВТЗакрытия КАК Т2
По Т1.Этап = Т2.Этап
И Т1.Период <= Т2.Период
СГРУППИРОВАТЬ ПО
Т1.Период,
Т1.Этап,
Т1.Состояние
;
ВЫбрать
МИНИМУМ(Период) Период,
Этап,
Состояние
ИЗ
ВТПроцессыДаты
СГРУППИРОВАТЬ ПО
Этап,
Состояние,
Дата
УПОРЯДОЧИТЬ ПО
Период,
Этап
2.
vadim.semyonov.rzn
08.04.24 15:14 Сейчас в теме
лучше всего группировкой во временных таблицах. примерно так:
ВЫБРАТЬ
Т1.Процесс КАК Процесс,
МИНИМУМ(Т1.Дата) КАК Дата
ПОМЕСТИТЬ втДатыНачала
ИЗ <ваша таблица> КАК Т1
ГДЕ
Т1.Состояние = "Идет"
СГРУППИРОВАТЬ ПО
Т1.Процесс
;
ВЫБРАТЬ
Т1.Процесс КАК Процесс,
МАКСИМУМ(Т1.Дата) КАК Дата
ПОМЕСТИТЬ втДатыЗакрытия
ИЗ <ваша таблица> КАК Т1
ГДЕ
Т1.Состояние = "Закрыто"
СГРУППИРОВАТЬ ПО
Т1.Процесс
;
ВЫБРАТЬ
Т1.Процесс КАК Процесс,
Т1.Дата КАК Период,
"Идет" КАК Состояние
ИЗ втДатыНачала КАК Т1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Т2.Процесс КАК Процесс,
Т2.Дата КАК Период,
"Закрыто" КАК Состояние
ИЗ втДатыЗакрытия КАК Т2
Показать
с индексами и сортировкой, думаю, сами разберетесь
(2) Если бы было так просто! Мне нужно не самое начало "идет" и не самое последнее "закрыто" по процессу получить.
Нужны именно первое "идет" и первое "закрыто", потом второе "идет" и второе "закрыто" и т.д. и т.п. по каждому из процессов. Потому как оборудование плодит эти записи "идет" постоянно, а "закрыто" только иногда.
В целом, понял, что придётся сначала получить и обработать ТЗ. А потом уже класть её в динамический список и дообъединять с остальными записями, которые мне нужны. Запрос такой в 1С сделать нереально сразу в динамическом списке.
ВЫБРАТЬ
ТЗ.Период КАК Период,
ТЗ.Этап КАК Этап,
ТЗ.Состояние КАК Состояние
ПОМЕСТИТЬ ВременнаяТаблица
ИЗ
&ТЗ КАК ТЗ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВременнаяТаблица.Период КАК Период,
ВременнаяТаблица.Этап КАК Этап,
ВременнаяТаблица.Состояние КАК Состояние,
МИНИМУМ(ВременнаяТаблица1.Период) КАК Период1,
ВременнаяТаблица1.Этап КАК Этап1,
ВременнаяТаблица1.Состояние КАК Состояние1
ПОМЕСТИТЬ ВременнаяТаблица1
ИЗ
ВременнаяТаблица КАК ВременнаяТаблица
ЛЕВОЕ СОЕДИНЕНИЕ ВременнаяТаблица КАК ВременнаяТаблица1
ПО (ВременнаяТаблица1.Этап = ВременнаяТаблица.Этап)
И ВременнаяТаблица.Период < ВременнаяТаблица1.Период
И ВременнаяТаблица.Состояние <> ВременнаяТаблица1.Состояние
ГДЕ
ВременнаяТаблица.Состояние <> "Закрыто"
СГРУППИРОВАТЬ ПО
ВременнаяТаблица.Период,
ВременнаяТаблица.Этап,
ВременнаяТаблица.Состояние,
ВременнаяТаблица1.Этап,
ВременнаяТаблица1.Состояние
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
МИНИМУМ(ВременнаяТаблица1.Период) КАК Период,
ВременнаяТаблица1.Этап КАК Этап,
ВременнаяТаблица1.Состояние КАК Состояние,
ВременнаяТаблица1.Период1 КАК Период1,
ВременнаяТаблица1.Этап1 КАК Этап1,
ВременнаяТаблица1.Состояние1 КАК Состояние1
ПОМЕСТИТЬ ВременнаяТаблица2
ИЗ
ВременнаяТаблица1 КАК ВременнаяТаблица1
СГРУППИРОВАТЬ ПО
ВременнаяТаблица1.Этап,
ВременнаяТаблица1.Состояние,
ВременнаяТаблица1.Период1,
ВременнаяТаблица1.Этап1,
ВременнаяТаблица1.Состояние1
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВременнаяТаблица2.Период КАК Период,
ВременнаяТаблица2.Этап КАК Этап,
ВременнаяТаблица2.Состояние КАК Состояние
ПОМЕСТИТЬ ВременнаяТаблица3
ИЗ
ВременнаяТаблица2 КАК ВременнаяТаблица2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВременнаяТаблица2.Период1,
ВременнаяТаблица2.Этап1,
ВременнаяТаблица2.Состояние1
ИЗ
ВременнаяТаблица2 КАК ВременнаяТаблица2
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВременнаяТаблица3.Период КАК Период,
ВременнаяТаблица3.Этап КАК Этап,
ВременнаяТаблица3.Состояние КАК Состояние
ИЗ
ВременнаяТаблица3 КАК ВременнаяТаблица3
ГДЕ
НЕ ВременнаяТаблица3.Период ЕСТЬ NULL
УПОРЯДОЧИТЬ ПО
Период
ТабЭтапы = Таблица.Скопировать();
ТабЭтапы.Свернуть("Этап");
тКопия = Таблица.Скопировать();
тКопия.Очистить();
Для Каждого СтрокаЭтап Из ТабЭтапы Цикл
ИскомыеСтроки = Таблица.НайтиСтроки(Новый Структура("Этап", СтрокаЭтап.Этап));
ПроцессИдет = Истина;
ПроцессЗавершен = Ложь;
Для Каждого ИскомаяСтрока Из ИскомыеСтроки Цикл
Если ПроцессИдет И Не ПроцессЗавершен Тогда
ЗаполнитьЗначенияСвойств(тКопия.Добавить(), ИскомаяСтрока);
ПроцессИдет = Ложь;
КонецЕсли;
Если Не ПроцессЗавершен Тогда
Если ИскомаяСтрока.Состояние = "Закрыто" Тогда
ЗаполнитьЗначенияСвойств(тКопия.Добавить(), ИскомаяСтрока);
ПроцессИдет = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
тКопия.Сортировать("Период");
А зачем в цикле поиск и вложенный цикл?
Можно же сначала отсортировать по этапу и по дате.
Добавить колонку "актуальность" типа булево.
Пройтись одним проходом и установить значение новой колонки.
Далее отбор и оставить только нужные строки.
И ещё десяток вариантов, в том числе без добавления новой колонки.
Суть задачи как у автора в (1) сводится к удалению лишних строк.
Лишняя строка или не лишняя понятно, если знаешь предыдущую строку в разрезе этапов (предварительная сортировка решает этот вопрос).
(2)в Вашем запросе разве не такой результат выйдет?
Период Этап Состояние
05.03.24 Процесс 1 Идет
06.03.24 Процесс 1 Идет
07.03.24 Процесс 1 Закрыто
08.03.24 Процесс 1 Идет
09.03.24 Процесс 1 Идет
10.03.24 Процесс 1 Закрыто
11.03.24 Процесс 2 Идет
12.03.24 Процесс 1 Идет
13.03.24 Процесс 2 Идет
Результат
05.03.24 Процесс 1 Идет
10.03.24 Процесс 1 Закрыто
-----------------------------------------------------
Этап | ДатаН | ДатаК
-----------------------------------------------------
Процесс 1 | 05.03.24 | 07.03.24
Процесс 1 | 08.03.24 | 10.03.24
Процесс 2 | 11.03.24 |
Процесс 1 | 12.03.24 |
Подобный пример. Только не процессы а сотрудники и не "Идет" и "Закрыто", а состояние 1 и 0. Но суть та же.
Учитывается не только несколько стартов подряд "Идет", но и несколько стопов "Закрыто".
В конце только убрать лишнее условие (t.sost=1), что-бы показывать незавершенные процессы и усё.
https://forum.infostart.ru/forum9/topic308763/#message3045095
Если кратко по сути алгоритма, то сначала надо "убить" все лишние записи, которые не несут информационного смысла.
Это те, которые стартуют уже начатый процесс и стопорят уже остановленный. Условие "t.sost<>t.sostDO" как раз и "убивает" такие записи. А далее всё просто.