Имя: Пароль:
1C
1С v8
Задача на поиск доступных интервалов для записи.
0 ТДК
 
17.03.24
20:36
Задача на поиск доступных интервалов для записи.

Сетка расписания для мастеров оказывающих услуги построена с шагом в 30 минут.
Клиент заказывает одну или несколько услуг.
Например: стрижка машинкой - 30 минут, стрижка бороды - 30 минут. Общее время затрат на такого клиента - 60 минут.
Задача: найти в расписании мастера временные слоты, удовлетворяющие времени затрат на клиента и предложить клиенту время для записи.

Имеем следующие вводные данные:
общее время оказания услуг - 60 минут.
Найти слоты доступные для записи

Строка    Барбер        ДеньРаботы         ДатаНачала                    ДатаОкончания       Продолжительность
1    "Барбер1"|    15.03.2024|    15.03.2024 7:00:00 |    15.03.2024 7:30:00 |        30
2    "Барбер1"|    15.03.2024|    15.03.2024 7:30:00 |    15.03.2024 8:00:00 |        30
3    "Барбер1"|    15.03.2024|    15.03.2024 8:00:00 |    15.03.2024 8:30:00 |        30
4    "Барбер1"|    15.03.2024|    15.03.2024 9:00:00 |    15.03.2024 9:30:00 |        30
5    "Барбер1"|    15.03.2024|    15.03.2024 10:00:00|    15.03.2024 10:30:00|        30
6    "Барбер1"|    15.03.2024|    15.03.2024 10:30:00|    15.03.2024 11:00:00|        30
7    "Барбер1"|    15.03.2024|    15.03.2024 12:00:00|    15.03.2024 12:30:00|        30
8    "Барбер1"|    15.03.2024|    15.03.2024 13:00:00|    15.03.2024 13:30:00|        30

Для клиента, подходящее время для записи в строках 1,2,3,5 так временные интервалы следуют друг за другом и доступное время мастера достаточно для выполнения услуг на 60 минут.
Строка 4 не подходит, так как окно только на 30 минут, а интервал между недоступен для записи.
строка 7 не удовлетворяет требуемому времени записи. доступно только для услуги в 30 минут, а следующая запись начинается с 13 часов
строка 8 также доступна только на 30 минут.


Каким образом решаются подобные задачи, и возможно ли её решение одним запросом?
1 Волшебник
 
17.03.24
21:06
Используйте СКД
2 Лирик
 
18.03.24
08:46
Вам нужно соединить интервалы левым соединением сами с собой взяв Мин(Таб1.ДатаНачала) и Макс(Таб2.ДатаОкончания) где Таб2.ДатаОкончания = Таб1.ДатаНачала+(Таб2.НомерИнтервала-Таб1.НомерИнтервала)*&РазмерИнтервала. Получите "Не прерывающиеся" интервалы. Потом выберите из них те что подходят по длительности.
3 Лирик
 
18.03.24
08:45
Второй вариант:
Соединить левым соединением по Истина, сгруппировать по Таб1.ДатаНачала Как ДатаНачала, просуммировав КоличествоРазличные(Таб2.ДатаОкончания) Как КоличествоИнтервалов и взяв Макс(Таб2.ДатаОкончания) Как ДатаОкончания.
Из результата выбрать ДатаОкончания = ДатаНачала+КоличествоИнтервалов*&РазмерИнтервала.

Естетственно пользоваться ДОБАВИТЬКДАТЕ(ДатаНачала, Минута, КоличествоИнтервалов*&РазмерИнтервала)
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.