При разработке в 1С:Предприятие мы часто сталкиваемся с необходимостью учета длительности: отработанных часов, времени работы оборудования или длительности выполнения бизнес-процессов. Стандартный тип Дата с составом Время предназначен для фиксации конкретного момента на временной шкале (календарная дата), а не для измерения длительности. Из-за этого при попытке суммировать значения, превышающие сутки, 1С «сбрасывает» накопленные часы, так как тип Дата ограничен диапазоном 00:00:00 – 23:59:59. Давайте разберем, как грамотно решить эту архитектурную задачу.
Наиболее профессиональным и математически верным подходом является отказ от использования типа Дата для хранения длительности. Вместо этого мы будем использовать тип Число. Логика проста: мы приводим любое время к общему знаменателю — количеству секунд.
Почему это удобно:
СУММА(ПолеВремяВСекундах).Для вывода накопленного результата на форму пользователю мы создаем функцию-конвертер, которая преобразует секунды в читаемый формат ЧЧ:ММ:СС.
Функция ПредставлениеВремени(Секунды) Экспорт
Часы = Цел(Секунды / 3600);
Остаток = Секунды % 3600;
Минуты = Цел(Остаток / 60);
Сек = Остаток % 60;
Возврат Формат(Часы, "ЧЦ=2; ЧВН=; ЧГ=0") + ":" +
Формат(Минуты, "ЧЦ=2; ЧВН=; ЧГ=0") + ":" +
Формат(Сек, "ЧЦ=2; ЧВН=; ЧГ=0");
КонецФункции
Если вам необходимо хранить время как объект, но при этом вы хотите видеть «красивый» итог, можно использовать связку из двух полей. Одно поле (скрытое) хранит точное значение длительности в числе (секундах), а второе (строковое) предназначено для вывода пользователю.
Разберем по шагам алгоритм реализации:
ПриВыводеСтроки (в обычных формах) или обработчик оформления ячеек (в управляемых формах)."32ч 30мин" или "32:30:00".Если специфика задачи требует использования именно типа Дата (например, для совместимости с существующими отчетами), можно применить вычисление разницы между двумя датами. Однако, помните: результат такой операции — это интервал. Чтобы получить корректную сумму, нам придется учитывать количество дней, прошедших в процессе накопления.
При суммировании нескольких периодов, хранящихся в типе Дата, 1С фактически суммирует даты, начиная с 01.01.0001. В итоге вы получите дату, которая включает в себя сумму всех дней, месяцев и лет. Чтобы получить итоговую длительность, вам придется:
01.01.0001.Важное примечание: мы не рекомендуем этот метод из-за высокой сложности поддержки кода. Ошибка в расчете количества дней приведет к тому, что в отчете отобразится некорректное время (например, вместо 25 часов вы увидите 01:00:00).
Проанализировав ситуацию, мы рекомендуем придерживаться следующей стратегии:
Число для хранения секунд. Это стандарт индустрии для учета длительностей.ЧЧ:ММ) выполняйте исключительно на уровне представления (в коде формы или макете печатной формы).Формат() для настройки внешнего вида, но помните, что он не умеет автоматически суммировать значения за пределами 24-часового цикла без предварительной арифметической обработки данных.Надеемся, данное руководство поможет вам реализовать систему учета времени без ограничений и ошибок! При совместной работе над этим функционалом всегда проверяйте корректность расчетов на крайних значениях (ровно 24 часа, 23:59:59 и т.д.).