Как в запросе 1С перевести секунды в формат времени ЧЧ:ММ:СС?

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

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

Основное решение: комбинация функций ДОБАВИТЬКДАТЕ и ФОРМАТ

Для решения этой задачи мы будем использовать две ключевые функции: ДОБАВИТЬКДАТЕ и ФОРМАТ. Разберем логику их совместного применения по шагам.

  1. Создание базовой точки отсчета. Нам нужна "нулевая" дата. В отличие от задачи интерактивного формирования текста запроса для иерархии, здесь мы используем простую константу — пустую дату '00010101'.
  2. Добавление секунд. С помощью функции ДОБАВИТЬКДАТЕ мы прибавляем к нашей начальной дате количество секунд, которое хранится в поле нашей таблицы. Синтаксис функции выглядит так: ДОБАВИТЬКДАТЕ(<Дата>, СЕКУНДА, <КоличествоСекунд>).
  3. Форматирование результата. Полученную дату-время нужно преобразовать в строку. В этом может помочь стандартная функция ФОРМАТ.

Проанализируем конкретный пример. Предположим, у нас есть некая таблица ИсточникДанных с полем ВремяВСекундах, которое хранит длительность в секундах.

Тогда запрос для преобразования этого поля в строку времени будет выглядеть следующим образом:


ВЫБРАТЬ
    ИсточникДанных.ВремяВСекундах,
    ФОРМАТ(ДОБАВИТЬКДАТЕ('00010101', СЕКУНДА, ИсточникДанных.ВремяВСекундах), "ДФ=ЧЧ:мм:сс") КАК ВремяФормат
ИЗ
    ИсточникДанных КАК ИсточникДанных

Давайте разберем этот код подробнее:

В результате выполнения этого запроса для записи со значением ВремяВСекундах = 3661 мы получим в поле ВремяФормат строку "01:01:01".

Альтернативные подходы и математические вычисления

Хотя предложенный выше способ является наиболее идиоматичным и простым для 1С, в некоторых случаях можно использовать и чисто математический подход, особенно если требуется большая гибкость или существуют ограничения на использование функций даты-времени.

Этот метод основан на целочисленном делении и получении остатка от деления для вычисления часов, минут и секунд.

Посмотрим на пример такого запроса:


ВЫБРАТЬ
    ИсточникДанных.ВремяВСекундах,
    // Вычисляем часы
    Цел(ИсточникДанных.ВремяВСекундах / 3600) КАК Часы,
    // Вычисляем минуты
    Цел((ИсточникДанных.ВремяВСекундах % 3600) / 60) КАК Минуты,
    // Вычисляем секунды
    ИсточникДанных.ВремяВСекундах % 60 КАК Секунды
ИЗ
    ИсточникДанных КАК ИсточникДанных

Разберем логику вычислений:

  1. Часы: Мы делим общее количество секунд на 3600 (количество секунд в одном часе) и берем целую часть от результата с помощью функции ЦЕЛ().
  2. Минуты: Сначала мы получаем остаток от деления общего количества секунд на 3600 с помощью оператора %. Это дает нам количество секунд, "не уместившихся" в полные часы. Затем мы делим этот остаток на 60 (количество секунд в минуте) и снова берем целую часть.
  3. Секунды: Это просто остаток от деления общего количества секунд на 60.

Важный нюанс: этот запрос вернет часы, минуты и секунды в виде отдельных числовых полей. Чтобы собрать их в одну строку формата "ЧЧ:ММ:СС", потребуется дополнительное преобразование, например, с помощью функции ВЫРАЗИТЬ для приведения к строке и оператора конкатенации строк +. Это делает запрос более громоздким и менее читаемым по сравнению с первым вариантом.


ВЫБРАТЬ
    // ... вычисления часов, минут, секунд ...
    // Собираем все в одну строку. Этот синтаксис может быть сложным и зависеть от версии платформы.
    // Примерная конкатенация (в реальном запросе может потребоваться ВЫРАЗИТЬ и условные операторы для добавления ведущих нулей)
    Часы + ":" + Минуты + ":" + Секунды КАК ВремяСтрокой
ИЗ
    ...

Как видим, математический подход требует больше шагов и усложняет текст запроса, особенно при необходимости форматирования с ведущими нулями. Поэтому для стандартной задачи преобразования в строку времени рекомендуется использовать связку функций ДОБАВИТЬКДАТЕ и ФОРМАТ как наиболее эффективный и лаконичный метод.

← На главную