При разработке документов и справочников в платформе 1С часто возникает задача расчета длительности процесса (например, времени проведения проверки, длительности смены или выполнения задачи). Разберем, как правильно получить разницу между датой начала и датой окончания в часах и минутах, а также проанализируем подводные камни различных подходов.
В платформе 1С вычитание одной даты из другой (Дата2 - Дата1) возвращает разницу в секундах. Это фундаментальное правило позволяет легко переводить интервал в любые другие единицы времени посредством стандартных математических операций.
Рассмотри наиболее надежный и универсальный способ расчета интервала. Чтобы перевести секунды в часы и минуты, достаточно применить функции целочисленного деления Цел() и остатка.
Разберем по шагам реализацию данного алгоритма:
Рассмотрим пример кода:
// Проверяем заполнение реквизитов перед расчетом
Если ЗначениеЗаполнено(ДатаНачала) И ЗначениеЗаполнено(ДатаОкончания) И ДатаОкончания >= ДатаНачала Тогда
ИнтервалВСекундах = ДатаОкончания - ДатаНачала;
// Вычисляем количество полных часов
ИнтервалВЧасах = Цел(ИнтервалВСекундах / 3600);
// Вычисляем оставшиеся минуты
ОстатокСекунд = ИнтервалВСекундах - (ИнтервалВЧасах * 3600);
ИнтервалВМинутах = Цел(ОстатокСекунд / 60);
// Формируем представление
СтрокаИнтервала = Строка(ИнтервалВЧасах) + " ч. " + Строка(ИнтервалВМинутах) + " мин.";
КонецЕсли;
Существует альтернативный способ получения времени через прибавление секунд к пустой дате '00010101'. В этом случае платформа сформирует объект типа Дата, из которого с помощью стандартных функций Час() и Минута() можно извлечь составляющие интервала.
Посмотрим на пример кода:
РазницаВСекундах = ДатаОкончания - ДатаНачала;
ВременнаяДата = '00010101000000' + РазницаВСекундах;
Часов = Час(ВременнаяДата);
Минут = Минута(ВременнаяДата);
Критически важное ограничение данного способа: этот метод корректно работает только тогда, когда интервал проверки не превышает 24 часа (86 400 секунд). Если время проверки составит, например, 25 часов, то ВременнаяДата перейдет на следующие сутки (0001-01-02 01:00:00). Функция Час() вернет значение 1 вместо 25. Поэтому для длительных интервалов следует использовать математический способ (Способ 1).
При вычислении интервалов важно застраховаться от ошибок ввода со стороны пользователей. Перед выполнением расчета рекомендуется выполнять следующие проверки:
ЗначениеЗаполнено() для обеих дат. Если одна из дат не заполнена, вычитание приведет к некорректным миллионным значениям.ДатаОкончания >= ДатаНачала. Если дата окончания меньше даты начала, результат вычитания станет отрицательным.В языке запросов 1С прямая арифметическая операция вычитания дат не поддерживается. Для этих целей применяется встроенная функция РАЗНОСТЬДАТ().
Проанализируем пример получения разницы в секундах через запрос:
ВЫБРАТЬ
ДокументПроверка.Ссылка КАК Ссылка,
РАЗНОСТЬДАТ(ДокументПроверка.ДатаНачала, ДокументПроверка.ДатаОкончания, СЕКУНДА) КАК ИнтервалВСекундах
ИЗ
Документ.Проверка КАК ДокументПроверка
Дальнейшую раскладку полученных секунд на часы и минуты можно выполнить математически прямо в поле выражения СКД или при обработке результатов запроса в коде.
В реальных бизнес-задачах астрономическое время часто не отражает фактическую длительность проверки. Если процесс включает ночные перерывы, выходные или праздничные дни, простой разницы дат недостаточно. В таких случаях расчет производится по графикам работы через регистры сведений с использованием механизмов производственного календаря.
Если в вашей конфигурации используется Библиотека Стандартных Подсистем (БСП), для форматирования строк и склонения числительных ("1 час", "2 часа", "5 часов") рекомендуется использовать готовые функции из общих модулей работы со строками, чтобы не писать собственные алгоритмы склонения окончаний.