Выбрать запросом в РС

1. user1118625 12 22.02.24 11:46 Сейчас в теме
Добрый день.
Имеется РС (не периодический, подчиненный регистратору)
Есть измерения: НомерМинуты, ДеньПланирования
Есть ресурс: занято (тип булево)

подскажите пожалуйста, как запросом выбрать номера минут в которых свободно и в которых занято?

Т.е. интересует последовательность, что с 1 по 5 минуту свободно, потом с 6 по 10 занято, и т.д.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
12. user-z99999 71 22.02.24 14:29 Сейчас в теме +0.5 $m
13. Said-We 22.02.24 15:08 Сейчас в теме +0.5 $m
(11) На периоды можно разбивать путем поиска предыдущей записи или поиском следующей.
В обоих случаях предыдущей / следующей записи может не быть.
Условно с царя гороха по текущую запись или с текущей записи до максимальной, условно 3999 год.
Соответственно в запросе это учесть и добиться того, что бы это было в результате.
Запрос в {7} это учитывает.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user-z99999 71 22.02.24 11:58 Сейчас в теме
(1)
Примерно так:
  ВЫБРАТЬ   
  ВЫБОР КОГДА НомерМинуты >= 1 И НомерМинуты < 6 ТОГДА Истина ИНАЧЕ Ложь КОНЕЦ КАК Признак1, 
  ВЫБОР КОГДА НомерМинуты >= 6 И НомерМинуты < 11 ТОГДА Истина ИНАЧЕ Ложь КОНЕЦ КАК Признак2,
  *
  ИЗ РегистрСведений.ВашРегистр КАК рр
  ГДЕ  
  занято И Признак1
Показать
4. user1118625 12 22.02.24 12:25 Сейчас в теме
(2)
пример с 1-5 и 6-10 был вымышленный, т.е. заранее я не знаю с какой и по какую минуту свободно...Именно это и надо найти
3. homer_ 79 22.02.24 12:20 Сейчас в теме
пример

ВЫБРАТЬ
	ДАТАВРЕМЯ(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.Статус
Показать
5. user1118625 12 22.02.24 12:28 Сейчас в теме
(3) Т.е. если я вас правильно понял, мне не надо переводить в "датавремя" моё числовое значение Минуты? И вместо "А" ставлю свое "булевское" поле? Но тут возникает другая сложность, в пределах дня у меня 1440 минут с возможными комбинациями "булевского" поля, этож не выход делать 1440 объединений?
6. homer_ 79 22.02.24 12:30 Сейчас в теме
(5) я вам дал принцип, а в каком формате у вас хранятся данные я без понятия
7. Said-We 22.02.24 12:58 Сейчас в теме
(1) https://forum.infostart.ru/forum9/topic308763/
Пост {24} с датами. Но без разницы даты это или числа или ещё что. Если можно сравнить на больше/меньше, то можно построить такой запрос. Это стандартный запрос разбития на периоды.
Важно ещё учесть, что некоторые записи могут быть, но не менять вам нужное значение. Что бы не было лишних не существующих периодов.
с 1 по 2 значение "КуКУ", с 3 по 4 значение "КуКу", с 5 по 7 значение "Бубука"...
А должно быть:
с 1 по 4 значение "КуКУ", с 5 по 7 значение "Бубука"...
8. user1118625 12 22.02.24 13:05 Сейчас в теме
(7)да именно так, но счас проверяю предыдущую схему.
9. user1118625 12 22.02.24 13:22 Сейчас в теме
(7) А нет ли у вас текста запроса для 1С? Потому что вышеописанная схема действительно возвращает не то что ожидаемо...
Вы правильно поняли суть задачи возвращать длительность одинаковых значений булева...
10. Said-We 22.02.24 13:46 Сейчас в теме
(9)1С под рукой сейчас нет. В переписке есть ссылки какие-то. Можно поиском поискать - это частый вопрос.
11. user1118625 12 22.02.24 13:59 Сейчас в теме
(10) Уже всё, туплю жестко (
ВЫБРАТЬ
	СЮ_ПланированиеВремениПроизводства.ПроизводственныйУчасток КАК ПроизводственныйУчасток,
	СЮ_ПланированиеВремениПроизводства.НомерМинуты КАК НомерМинуты,
	СЮ_ПланированиеВремениПроизводства.День КАК День,
	СЮ_ПланированиеВремениПроизводства.РабочееМесто КАК РабочееМесто,
СЮ_ПланированиеВремениПроизводства.Занято КАК Занято
ПОМЕСТИТЬ М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 правильно показано, а до этого нет... Что подправит в запросе?
Прикрепленные файлы:
12. user-z99999 71 22.02.24 14:29 Сейчас в теме +0.5 $m
15. user1118625 12 26.02.24 10:43 Сейчас в теме
(10) Добрый день. Подскажите пожалуйста не появилась 1с под рукой? А то голову сломал :(
13. Said-We 22.02.24 15:08 Сейчас в теме +0.5 $m
(11) На периоды можно разбивать путем поиска предыдущей записи или поиском следующей.
В обоих случаях предыдущей / следующей записи может не быть.
Условно с царя гороха по текущую запись или с текущей записи до максимальной, условно 3999 год.
Соответственно в запросе это учесть и добиться того, что бы это было в результате.
Запрос в {7} это учитывает.
14. user1118625 12 22.02.24 16:31 Сейчас в теме
Простите, но голова уже совсем не варит.. Надо после перерыва вернуться к заадче.
16. Said-We 26.02.24 13:05 Сейчас в теме
(15) Нарисовал не коротко, но что бы было понятнее. И на примере понятном всем - это сотрудник/оклад. А то разбираться с днями сборок, минутами и этапами не сильно хотелось. А так в любом случае будет понятна суть.

По алгоритму. Сначала определяются записи, которые по факту изменяют оклад. А записи, которые не изменяют оклад убираем и не рассматриваем. Т.е. к каждой записи прицепляем предыдущую и смотрим что за оклад был или вообще ничего не было (NULL).
А далее уже стандартно - прицепляем следующую и рассчитываем дату окончания (-1 секунда).
Это один из вариантов решения данной задачи в 1С. По факту их несколько даже в 1С. Например через нумерацию записей.
Прикрепленные файлы:
17. user1118625 12 26.02.24 13:23 Сейчас в теме
(16) Спасибо, но я всё таки сумел после 23 взять себя в руки и из ваших двух ответов собрать свой запрос) Но на всякий случай сохраню и ваш вариант тоже.
Оставьте свое сообщение

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