Как правильно реализовать учет и суммирование времени, если оно превышает 24 часа?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке в 1С:Предприятие мы часто сталкиваемся с необходимостью учета длительности: отработанных часов, времени работы оборудования или длительности выполнения бизнес-процессов. Стандартный тип Дата с составом Время предназначен для фиксации конкретного момента на временной шкале (календарная дата), а не для измерения длительности. Из-за этого при попытке суммировать значения, превышающие сутки, 1С «сбрасывает» накопленные часы, так как тип Дата ограничен диапазоном 00:00:00 – 23:59:59. Давайте разберем, как грамотно решить эту архитектурную задачу.

Вариант 1: Использование числового типа для хранения секунд

Наиболее профессиональным и математически верным подходом является отказ от использования типа Дата для хранения длительности. Вместо этого мы будем использовать тип Число. Логика проста: мы приводим любое время к общему знаменателю — количеству секунд.

Почему это удобно:

  1. Любые арифметические операции (сложение, вычитание) работают корректно без учета переходов через полночь.
  2. Запросы к базе данных позволяют легко использовать агрегатную функцию СУММА(ПолеВремяВСекундах).
  3. Отсутствует риск потери данных при превышении порога в 24 часа.

Для вывода накопленного результата на форму пользователю мы создаем функцию-конвертер, которая преобразует секунды в читаемый формат ЧЧ:ММ:СС.


Функция ПредставлениеВремени(Секунды) Экспорт
    Часы = Цел(Секунды / 3600);
    Остаток = Секунды % 3600;
    Минуты = Цел(Остаток / 60);
    Сек = Остаток % 60;
    Возврат Формат(Часы, "ЧЦ=2; ЧВН=; ЧГ=0") + ":" + 
           Формат(Минуты, "ЧЦ=2; ЧВН=; ЧГ=0") + ":" + 
           Формат(Сек, "ЧЦ=2; ЧВН=; ЧГ=0");
КонецФункции

Вариант 2: Использование строкового реквизита для отображения

Если вам необходимо хранить время как объект, но при этом вы хотите видеть «красивый» итог, можно использовать связку из двух полей. Одно поле (скрытое) хранит точное значение длительности в числе (секундах), а второе (строковое) предназначено для вывода пользователю.

Разберем по шагам алгоритм реализации:

  1. При изменении времени в колонке пересчитываем его в секунды и сохраняем в числовой реквизит.
  2. Для формирования строки итогов используем процедуру ПриВыводеСтроки (в обычных формах) или обработчик оформления ячеек (в управляемых формах).
  3. В процедуре вычисляем сумму секунд по колонке и форматируем ее через строку, например: "32ч 30мин" или "32:30:00".

Вариант 3: Комбинированный подход с использованием дат

Если специфика задачи требует использования именно типа Дата (например, для совместимости с существующими отчетами), можно применить вычисление разницы между двумя датами. Однако, помните: результат такой операции — это интервал. Чтобы получить корректную сумму, нам придется учитывать количество дней, прошедших в процессе накопления.

При суммировании нескольких периодов, хранящихся в типе Дата, 1С фактически суммирует даты, начиная с 01.01.0001. В итоге вы получите дату, которая включает в себя сумму всех дней, месяцев и лет. Чтобы получить итоговую длительность, вам придется:

  1. Вычесть из результата «пустую» дату 01.01.0001.
  2. Полученное число секунд (или интервал) обработать делением, чтобы отделить дни от часов.

Важное примечание: мы не рекомендуем этот метод из-за высокой сложности поддержки кода. Ошибка в расчете количества дней приведет к тому, что в отчете отобразится некорректное время (например, вместо 25 часов вы увидите 01:00:00).

Итоги и рекомендации

Проанализировав ситуацию, мы рекомендуем придерживаться следующей стратегии:

Надеемся, данное руководство поможет вам реализовать систему учета времени без ограничений и ошибок! При совместной работе над этим функционалом всегда проверяйте корректность расчетов на крайних значениях (ровно 24 часа, 23:59:59 и т.д.).

← На главную