При решении задач, связанных с расчетом длительности событий, часто возникает проблема «перехода через полночь». Например, если самолет вылетает в 22:00, а прилетает в 02:00 следующего дня, простая разность значений даст отрицательное число, что не соответствует логике полета. Давайте разберем, как эффективно решить эту задачу в запросе 1С, не создавая громоздких и трудночитаемых конструкций.
Это самый распространенный и быстрый способ для платформы 1С. Мы вычисляем разность между временем прибытия и отправления, и, если результат оказывается отрицательным, прибавляем к нему целые сутки (24 часа или 1440 минут).
Рассмотрим пример кода для вычисления времени в пути в часах:
ВЫБРАТЬ
Рейсы.ВремяОтправления,
Рейсы.ВремяПрибытия,
ВЫБОР
КОГДА (Рейсы.ВремяПрибытия - Рейсы.ВремяОтправления) < 0
ТОГДА (Рейсы.ВремяПрибытия - Рейсы.ВремяОтправления) + 24
ИНАЧЕ (Рейсы.ВремяПрибытия - Рейсы.ВремяОтправления)
КОНЕЦ КАК ДлительностьВЧасах
ИЗ
Справочник.Рейсы КАК Рейсы
Этот подход хорош тем, что он не требует сложных манипуляций с датами и работает максимально быстро, так как выполняется внутри одной выборки данных. Мы просто проверяем условие: если разница отрицательная — значит, произошел переход через полночь, и мы корректируем результат на полные сутки.
Для более точных расчетов, когда нас интересуют минуты, рекомендуется приводить все данные к единой шкале — «минутам от начала суток». Это исключает ошибки при работе с типами данных и упрощает сравнение.
Минуты = Часы * 60 + Минуты.ВЫБОР, но для минут прибавляем 1440 (количество минут в сутках).Такой подход делает запрос устойчивым к любым вариациям времени и избавляет от проблем с форматированием. Вычисление длительности в минутах позволит вам в дальнейшем легко перевести результат в любой удобный формат: часы и минуты, дробные часы и т.д.
Многие разработчики стараются использовать функции типа ДОБАВИТЬКДАТЕ или РАЗНОСТЬДАТ. Однако, если у вас есть только время без привязки к конкретной дате выполнения рейса, попытка «собрать» дату искусственно может привести к следующим проблемам:
ГДЕ или в сложных вычисляемых полях могут замедлить выполнение запроса при работе с большими объемами данных.Для того чтобы ваш отчет или обработка работали максимально стабильно, придерживайтесь следующих правил:
ВЫБРАТЬ, а не фильтровать данные через функции преобразования в секции ГДЕ.ВЫБОР является стандартом де-факто. Он лаконичен и надежен.ВремяОтправления и ВремяПрибытия в вашей базе данных имеют сопоставимые типы. Если это строки, обязательно приведите их к числовому формату до начала арифметических операций.Таким образом, мы видим, что решение задачи по расчету времени полета не требует громоздких алгоритмов. Достаточно использовать математическую логику с проверкой знака разности, что позволяет получить корректный результат даже в самых сложных случаях перехода через полночь. Работайте с числами, избегайте лишних приведений типов, и ваши запросы будут летать так же быстро, как самолеты в вашей базе данных.