Как в 1С отобразить на форме количество времени свыше 24 часов в формате ЧЧ:ММ

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

При разработке интерфейсов в 1С часто возникает задача вывести суммарное затраченное время или длительность процесса — например, 52:35 (52 часа 35 минут) или 150:00. Стандартный тип Дата для этой цели не подходит, поскольку в платформе 1С дата всегда привязана к календарному времени, а временная шкала сбрасывается каждые 24 часа (86 400 секунд). Отдельного примитивного типа длительности в платформе нет, поэтому учет ведется в виде общего количества секунд (разницы дат), а отображение на форме выполняется через строковое представление. Разберем, как правильно реализовать такой расчет и форматирование.

Ограничения стандартного типа Дата и математика расчета

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

КоличествоСекунд = ДатаОкончания - ДатаНачала;

Если попытаться применить функцию Формат() с маской времени к дате, полученной добавлением этих секунд к пустой дате, значение больше 23:59:59 отобразить не удастся. Поэтому часы и минуты необходимо вычислять математически:

  1. Количество полных часов: вычисляется целочисленным делением общего количества секунд на 3600: Цел(КоличествоСекунд / 3600).
  2. Количество минут: вычисляется через остаток от деления на 3600 с последующим делением на 60: Цел((КоличествоСекунд % 3600) / 60).

Корректное форматирование минут с лидирующим нулем

Посмотрим на распространенную ошибку: если просто сложить строки через двоеточие, то при значении минут меньше 10 (например, 5 минут) строка примет некорректный вид 52:5 вместо 52:05. Чтобы гарантированно получить два знака для минут с лидирующим нулем, воспользуемся стандартной функцией Формат() с параметром вывода незначащих нулей ЧВН=.

Рассмотрим готовую универсальную функцию для преобразования секунд в строку длительности:


// Преобразует число секунд в строку формата "ЧЧ:ММ" или "-ЧЧ:ММ"
Функция ПолучитьСтрокуДлительности(Знач Секунды) Экспорт

    Если Не ЗначениеЗаполнено(Секунды) Тогда
        Возврат "0:00";
    КонецЕсли;

    Знак = "";
    Если Секунды < 0 Тогда
        Знак = "-";
        Секунды = -Секунды;
    КонецЕсли;

    КоличествоЧасов = Цел(Секунды / 3600);
    КоличествоМинут = Цел((Секунды % 3600) / 60);

    СтрокаМинут = Формат(КоличествоМинут, "ЧЦ=2; ЧДЦ=0; ЧВН=");

    Возврат Знак + Строка(КоличествоЧасов) + ":" + СтрокаМинут;

КонецФункции

Отображение значения на управляемой форме

Разберем по шагам, как вывести такое значение в интерфейсе управляемой формы:

  1. Создадим на форме реквизит с типом Строка (например, ВремяРаботыСтрокой с достаточной длиной, например 20 символов).
  2. Перетащим созданный реквизит в элементы формы, выбрав вид элемента Поле надписи (если поле только для просмотра) или Поле ввода.
  3. В обработчике инициализации данных или при изменении исходных дат вызываем расчет и заполняем строковый реквизит:

&НаСервере
Процедура РассчитатьИОтобразитьВремяНаСервере()

    // Пример вычисления разницы между реквизитами объекта
    Если ЗначениеЗаполнено(Объект.ДатаНачала) И ЗначениеЗаполнено(Объект.ДатаОкончания) Тогда
        РазницаВСекундах = Объект.ДатаОкончания - Объект.ДатаНачала;
        ВремяРаботыСтрокой = ПолучитьСтрокуДлительности(РазницаВСекундах);
    Иначе
        ВремяРаботыСтрокой = "0:00";
    КонецЕсли;

КонецПроцедуры

Если на форме необходимо обновлять значение текущего затраченного времени в реальном времени, можно подключить обработчик ожидания на клиенте с интервалом в 60 секунд через метод ПодключитьОбработчикОжидания(), который будет вызывать пересчет разницы с текущей датой платформы.

Отображение длительности в динамических списках и таблицах

Если данные хранятся в базе в виде числа секунд (разницы дат), а в динамическом списке необходимо показать строку вида 52:35, воспользуемся обработчиком ПриПолученииДанныхНаСервере у таблицы формы:


&НаСервере
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)

    Для Каждого СтрокаСписка Из Строки Цикл
        Секунды = СтрокаСписка.Данные.ДлительностьВСекундах;
        Если Секунды <> Неопределено Тогда
            СтрокаСписка.Оформление["ДлительностьВСекундах"].Текст = ПолучитьСтрокуДлительности(Секунды);
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры

Такой подход позволяет хранить в базе данных точное числовое значение в секундах (что обеспечивает корректную сортировку, агрегацию и отборы), отображая пользователю привычный формат часов и минут без ограничений в 24 часа.

← На главную