(11) На периоды можно разбивать путем поиска предыдущей записи или поиском следующей.
В обоих случаях предыдущей / следующей записи может не быть.
Условно с царя гороха по текущую запись или с текущей записи до максимальной, условно 3999 год.
Соответственно в запросе это учесть и добиться того, что бы это было в результате.
Запрос в {7} это учитывает.
ВЫБРАТЬ
ВЫБОР КОГДА НомерМинуты >= 1 И НомерМинуты < 6 ТОГДА Истина ИНАЧЕ Ложь КОНЕЦ КАК Признак1,
ВЫБОР КОГДА НомерМинуты >= 6 И НомерМинуты < 11 ТОГДА Истина ИНАЧЕ Ложь КОНЕЦ КАК Признак2,
*
ИЗ РегистрСведений.ВашРегистр КАК рр
ГДЕ
занято И Признак1
ВЫБРАТЬ
ДАТАВРЕМЯ(2022, 12, 31) КАК Дата,
"ТочкаОтчета" КАК Статус
ПОМЕСТИТЬ м1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 1),
"А"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 2, 2),
"А"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 3),
"А"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 4),
"А"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 5),
"Б"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 6),
"Б"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 7),
"А"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 8),
"А"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 9),
"А"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 10),
"В"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 11),
"В"
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
м1.Дата,
м1.Статус,
МАКСИМУМ(м11.Дата) КАК Дата1
ПОМЕСТИТЬ м2
ИЗ
м1 КАК м1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ м1 КАК м11
ПО м1.Дата >= м11.Дата
И (НЕ м1.Статус = м11.Статус)
СГРУППИРОВАТЬ ПО
м1.Статус,
м1.Дата
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(м2.Дата1, ДЕНЬ, 1) КАК ДатаС,
МАКСИМУМ(м2.Дата) КАК ДатаПо,
м2.Статус
ИЗ
м2 КАК м2
СГРУППИРОВАТЬ ПО
м2.Дата1,
м2.Статус
(3) Т.е. если я вас правильно понял, мне не надо переводить в "датавремя" моё числовое значение Минуты? И вместо "А" ставлю свое "булевское" поле? Но тут возникает другая сложность, в пределах дня у меня 1440 минут с возможными комбинациями "булевского" поля, этож не выход делать 1440 объединений?
(1) https://forum.infostart.ru/forum9/topic308763/ Пост {24} с датами. Но без разницы даты это или числа или ещё что. Если можно сравнить на больше/меньше, то можно построить такой запрос. Это стандартный запрос разбития на периоды.
Важно ещё учесть, что некоторые записи могут быть, но не менять вам нужное значение. Что бы не было лишних не существующих периодов.
с 1 по 2 значение "КуКУ", с 3 по 4 значение "КуКу", с 5 по 7 значение "Бубука"...
А должно быть:
с 1 по 4 значение "КуКУ", с 5 по 7 значение "Бубука"...
(7) А нет ли у вас текста запроса для 1С? Потому что вышеописанная схема действительно возвращает не то что ожидаемо...
Вы правильно поняли суть задачи возвращать длительность одинаковых значений булева...
ВЫБРАТЬ
СЮ_ПланированиеВремениПроизводства.ПроизводственныйУчасток КАК ПроизводственныйУчасток,
СЮ_ПланированиеВремениПроизводства.НомерМинуты КАК НомерМинуты,
СЮ_ПланированиеВремениПроизводства.День КАК День,
СЮ_ПланированиеВремениПроизводства.РабочееМесто КАК РабочееМесто,
СЮ_ПланированиеВремениПроизводства.Занято КАК Занято
ПОМЕСТИТЬ М1
ИЗ
РегистрСведений.СЮ_ПланированиеВремениПроизводства КАК СЮ_ПланированиеВремениПроизводства
ГДЕ
СЮ_ПланированиеВремениПроизводства.День = &День
И СЮ_ПланированиеВремениПроизводства.ПроизводственныйУчасток = &ПроизводственныйУчасток
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
М1.НомерМинуты КАК НомерМинуты,
М1.Занято КАК Занято,
М1.РабочееМесто КАК РабочееМесто,
М1.ПроизводственныйУчасток КАК ПроизводственныйУчасток,
МАКСИМУМ(М11.НомерМинуты) КАК НомерМинуты1
ПОМЕСТИТЬ м2
ИЗ
М1 КАК М1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ М1 КАК М11
ПО М1.НомерМинуты >= М11.НомерМинуты
И М1.Занято <> М11.Занято
СГРУППИРОВАТЬ ПО
М1.НомерМинуты,
М1.Занято,
М1.РабочееМесто,
М1.ПроизводственныйУчасток
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
м2.НомерМинуты1 + 1 КАК НомерМинутыС,
МАКСИМУМ(м2.НомерМинуты) КАК НомерМинутыПо,
м2.Занято КАК Занято,
м2.РабочееМесто КАК РабочееМесто,
м2.ПроизводственныйУчасток КАК ПроизводственныйУчасток
ИЗ
м2 КАК м2
СГРУППИРОВАТЬ ПО
м2.Занято,
м2.НомерМинуты1 + 1,
м2.РабочееМесто,
м2.ПроизводственныйУчасток
УПОРЯДОЧИТЬ ПО
НомерМинутыС,
РабочееМесто
Показать
на скриншоте результат запроса:
720 719 Да 1 Сборка МЦ
720 719 Нет 2 Сборка МЦ
720 719 Нет 3 Сборка МЦ
720 719 Нет 4 Сборка МЦ
720 719 Нет 5 Сборка МЦ
721 720 Да 1 Сборка МЦ
721 960 Нет 1 Сборка МЦ
721 960 Нет 2 Сборка МЦ
721 960 Нет 3 Сборка МЦ
721 960 Нет 4 Сборка МЦ
721 960 Нет 5 Сборка МЦ
Вот с 721 по 960 правильно показано, а до этого нет... Что подправит в запросе?
(11) На периоды можно разбивать путем поиска предыдущей записи или поиском следующей.
В обоих случаях предыдущей / следующей записи может не быть.
Условно с царя гороха по текущую запись или с текущей записи до максимальной, условно 3999 год.
Соответственно в запросе это учесть и добиться того, что бы это было в результате.
Запрос в {7} это учитывает.
(15) Нарисовал не коротко, но что бы было понятнее. И на примере понятном всем - это сотрудник/оклад. А то разбираться с днями сборок, минутами и этапами не сильно хотелось. А так в любом случае будет понятна суть.
По алгоритму. Сначала определяются записи, которые по факту изменяют оклад. А записи, которые не изменяют оклад убираем и не рассматриваем. Т.е. к каждой записи прицепляем предыдущую и смотрим что за оклад был или вообще ничего не было (NULL).
А далее уже стандартно - прицепляем следующую и рассчитываем дату окончания (-1 секунда).
Это один из вариантов решения данной задачи в 1С. По факту их несколько даже в 1С. Например через нумерацию записей.
(16) Спасибо, но я всё таки сумел после 23 взять себя в руки и из ваших двух ответов собрать свой запрос) Но на всякий случай сохраню и ваш вариант тоже.