Как преобразовать количество секунд в формат даты или времени в СКД: детальное руководство

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

В практике разработки отчетов на базе Системы компоновки данных (СКД) часто возникает задача вывода длительности различных процессов. Обычно в базе данных такие значения хранятся в секундах (тип Число). Однако для конечного пользователя цифра "3665" малоинформативна — гораздо удобнее видеть "01:01:05".

Разберем типичную проблему: разработчик настраивает расчет ресурса через добавление секунд к пустой дате, и в итогах (группировках) всё отображается корректно, но в детальных записях отчет продолжает выводить сырые секунды. Проанализируем, почему так происходит, и рассмотрим несколько эффективных способов решения этой задачи.

Причина проблемы: почему детальные записи игнорируют формат ресурса

Рассмотрим ситуацию. В схеме компоновки данных на закладке Ресурсы прописано выражение: ДобавитьКДате(ДатаВремя(1,1,1), "Секунда", Сумма(КоличествоСекунд)). В этом случае СКД применяет расчет только тогда, когда происходит агрегация данных (группировка). Детальные записи — это уровень, где агрегация (функция Сумма) не работает в привычном понимании для простых полей, поэтому туда транслируется значение напрямую из набора данных запроса.

Чтобы добиться единообразия, нам нужно применить логику преобразования на обоих уровнях. Рассмотрим по шагам, как это реализовать.

Способ 1. Использование пользовательских полей

Это решение было предложено в ходе обсуждения на форуме и является одним из самых быстрых в реализации. Пользовательские поля позволяют задать разные формулы для итогов и для строк отчета.

  1. Перейдем в настройки отчета (в режиме конфигуратора или в режиме «1С:Предприятие»).
  2. Откроем вкладку Пользовательские поля.
  3. Создадим новое Пользовательское поле выражение.
  4. В поле Выражение детальных записей укажем:
    
    ДобавитьКДате(ДатаВремя(1,1,1), "Секунда", ПолеСекунды)
    
  5. В поле Выражение записей итогов укажем:
    
    ДобавитьКДате(ДатаВремя(1,1,1), "Секунда", Сумма(ПолеСекунды))
    
  6. В настройках Условного оформления для этого поля установим формат даты ДФ=ЧЧ:мм:сс.

Таким образом, СКД будет использовать первую формулу для каждой строки, а вторую — для расчета сумм по папкам и общим итогам.

Способ 2. Вычисляемые поля — профессиональный подход

Если мы хотим зашить логику преобразования в саму схему (чтобы пользователю не нужно было ничего настраивать), воспользуемся закладкой Вычисляемые поля. Этот метод считается более правильным с точки зрения архитектуры схемы.

Разберем алгоритм действий:

  1. На закладке Вычисляемые поля добавим новое поле с именем ВремяДлительность.
  2. В колонке Выражение напишем: ДобавитьКДате(ДатаВремя(1, 1, 1), "Секунда", КоличествоСекунд). Это обеспечит вывод времени в детальных записях.
  3. Перейдем на закладку Ресурсы.
  4. Добавим поле ВремяДлительность в ресурсы.
  5. В колонке Выражение укажем:
    
    ДобавитьКДате(ДатаВремя(1, 1, 1), "Секунда", Сумма(КоличествоСекунд))
    
  6. В колонке Оформление для данного поля выставим формат ДФ=ЧЧ:мм:сс.

Важный нюанс: Обратите внимание, что внутри функции ДобавитьКДате в ресурсах мы суммируем именно исходное числовое поле КоличествоСекунд, а не пытаемся суммировать даты. Попытка сложить даты приведет к ошибке.

Способ 3. Преобразование длительности более 24 часов

Стандартный метод с ДатаВремя(1,1,1) имеет существенное ограничение: как только сумма секунд превысит 86 400 (одни сутки), счетчик часов обнулится. Например, 25 часов превратятся в 01:00:00. Если ваша задача — отображать накопленную длительность (например, время работы оборудования за месяц), этот метод не подойдет.

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


ВЫБОР 
    КОГДА Сумма(Секунды) >= 3600 
    ТОГДА Формат(Целое(Сумма(Секунды) / 3600), "ЧЦ=10; ЧГ=0") + ":" 
    ИНАЧЕ "00:" 
КОНЕЦ 
+ Формат((Сумма(Секунды) % 3600) / 60, "ЧЦ=2; ЧВН=; ЧГ=0") 
+ ":" 
+ Формат(Сумма(Секунды) % 60, "ЧЦ=2; ЧВН=; ЧГ=0")

Использование функции Целое() и оператора остатка от деления % позволяет корректно вычислить количество полных часов, минут и секунд, независимо от того, превышают они 24 часа или нет.

Способ 4. Использование общих модулей (самый гибкий вариант)

Если логика преобразования сложная (например, нужно выводить "2 дн. 5 час. 10 мин."), лучше всего вынести расчет в Общий модуль. Убедитесь, что у модуля стоят флажки Сервер, Внешнее соединение и Клиент (в зависимости от настроек отчета).

Создадим функцию в общем модуле МойМодульСКД:


Функция ПреобразоватьСекундыВТекст(Знач ВсегоСекунд) Экспорт
    // Если секунд нет, возвращаем пустую строку
    Если ВсегоСекунд = 0 Или ВсегоСекунд = Неопределено Тогда
        Возврат "";
    КонецЕсли;

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

    Возврат Формат(Часов, "ЧГ=0") + ":" + Формат(Минут, "ЧВН=; ЧЦ=2") + ":" + Формат(Секунд, "ЧВН=; ЧЦ=2");
КонецФункции

После этого в СКД в поле выражения ресурса достаточно написать:

МойМодульСКД.ПреобразоватьСекундыВТекст(Сумма(КоличествоСекунд))

Обработка пустых значений и NULL

Выясним причину появления странных дат в отчете. Если поле секунд в базе равно NULL или 0, функция ДобавитьКДате(ДатаВремя(1,1,1), "Секунда", 0) вернет 01.01.0001 00:00:00. Чтобы отчет выглядел чисто, используем конструкцию ВЫБОР:


ВЫБОР 
    КОГДА Сумма(ПолеСекунды) = 0 ТОГДА "" 
    ИНАЧЕ ДобавитьКДате(ДатаВремя(1,1,1), "Секунда", Сумма(ПолеСекунды)) 
КОНЕЦ

Подведение итогов

Рассмотрев все варианты, сделаем выводы:

  1. Для простого отображения времени в пределах суток идеально подходят Вычисляемые поля с использованием ДобавитьКДате и настройкой формата ЧЧ:мм:сс.
  2. Если необходимо отображать длительность более 24 часов, используем строковое суммирование в выражении СКД или функции общего модуля.
  3. Чтобы изменения коснулись и детальных записей, и итогов, всегда проверяйте, чтобы соответствующие выражения были прописаны и в вычисляемых полях (для строк), и в ресурсах (для групп).

Использование данных подходов позволит сделать ваши отчеты профессиональными и удобными для восприятия пользователями.

← На главную