Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
12 дек 2024, 11:26

Грамотное сравнение 2х периодов

Автор ruslik, 28 апр 2023, 18:12

0 Пользователей и 1 гость просматривают эту тему.

ruslik

Добрый день!
Столкнулся с проблемой. Есть задача - Контролировать пересечение периодов.
Например, документом в систему вводятся занятия периодами, нужно контролировать, чтобы в одно время было не более 3х занятий. Периоды хранятся в РС.

Сделал функцию, на контроль пересечения, если пересечений больше 3х, то документ не проводится. Но есть слабые места -
Например(часы занятий):
1: 12-17
2: 11-13
3: 16-18
4: 14-18
Документ должен проводится, но этого не делает, потому что думает, что пересечений больше трех, а по факту, одновременно будет 3 занятия, а не 4.

Подскажите пожалуйста, как грамотно сравнивать периоды?

Максим75

ruslik, прикольная задача.
вот диаграмма Ганта как раз и создана, чтобы можно было посчитать кол-во связей, в которых участвует интервал.
может кто знает, как с этим чудом работать? просветите.

LexaK

ruslik, в вашем примере я насчитал 4 пересечения, поэтому документ и не проводится
если помогло нажмите: Спасибо!

Kvark5d

ruslik, интересная задача. Я бы решил так:
предположим, что периоды за один день собраны в таблицу значений Периоды
с колонками НачалоПериода, КонецПериода
   
создадим таблицу значений в которую будем записывать время входящее в каждый период с шагом в 1 минуту
в итоге подсчитаем сколько занятий попало в каждую минуту
   
ТЗДляПоискаПересечений = Новый ТаблицаЗначений;
ТЗДляПоискаПересечений.Колонки.Добавить("Время");
ТЗДляПоискаПересечений.Колонки.Добавить("КолВоЗанятий");                                                 
   
Шаг = 60;
Для Каждого Период ИЗ Периоды Цикл                     
    а= Период.НачалоПериода;
    Пока а<=Период.КонецПериода Цикл
        НовСтр=ТЗДляПоискаПересечений.Добавить();
        НовСтр.Время = а;
        НовСтр.КолВоЗанятий = 1;
        а=а+Шаг;
    КонецЦикла;       
КонецЦикла;   
ТЗДляПоискаПересечений.Свернуть("Время","КолВоЗанятий");
ТЗДляПоискаПересечений.Сортировать("КолВоЗанятий Убыв");
Макс = ТЗДляПоискаПересечений[0].КолВоЗанятий;
Если Макс>3 Тогда
    // больше 3 занятий в одно время
КонецЕсли;

В Вашем примере выдает три пересечения

Похожие темы (5)

Рейтинг@Mail.ru

Поиск