В процессе разработки отчетов или обработок часто возникает задача представления числовых данных в удобном для пользователя виде. Одна из таких задач — конвертация длительности, выраженной в секундах, в стандартный формат времени "часы:минуты:секунды" (ЧЧ:ММ:СС) непосредственно в тексте запроса. Это позволяет избежать дополнительной обработки данных в коде и отдать на вывод уже готовый результат. Рассмотрим, как это сделать с помощью встроенных функций языка запросов 1С.
Для решения этой задачи мы будем использовать две ключевые функции: ДОБАВИТЬКДАТЕ и ФОРМАТ. Разберем логику их совместного применения по шагам.
'00010101'.ДОБАВИТЬКДАТЕ мы прибавляем к нашей начальной дате количество секунд, которое хранится в поле нашей таблицы. Синтаксис функции выглядит так: ДОБАВИТЬКДАТЕ(<Дата>, СЕКУНДА, <КоличествоСекунд>).ФОРМАТ.Проанализируем конкретный пример. Предположим, у нас есть некая таблица ИсточникДанных с полем ВремяВСекундах, которое хранит длительность в секундах.
Тогда запрос для преобразования этого поля в строку времени будет выглядеть следующим образом:
ВЫБРАТЬ
ИсточникДанных.ВремяВСекундах,
ФОРМАТ(ДОБАВИТЬКДАТЕ('00010101', СЕКУНДА, ИсточникДанных.ВремяВСекундах), "ДФ=ЧЧ:мм:сс") КАК ВремяФормат
ИЗ
ИсточникДанных КАК ИсточникДанных
Давайте разберем этот код подробнее:
ДОБАВИТЬКДАТЕ('00010101', СЕКУНДА, ИсточникДанных.ВремяВСекундах): Эта часть берет начальную дату '0001-01-01 00:00:00' и прибавляет к ней значение из поля ВремяВСекундах. Например, если в поле было значение 3661, результатом этой функции будет дата-время '0001-01-01 01:01:01'.ФОРМАТ(..., "ДФ=ЧЧ:мм:сс"): Эта функция берет полученную дату-время и форматирует ее в строку согласно заданному шаблону.
ДФ= (или DF=) — это управляющая строка, указывающая на формат даты (Date Format).ЧЧ — часы с ведущим нулем (например, 01, 09, 12).мм — минуты с ведущим нулем. Важно использовать именно строчные 'м', так как заглавные 'ММ' обозначают месяц.сс — секунды с ведущим нулем.В результате выполнения этого запроса для записи со значением ВремяВСекундах = 3661 мы получим в поле ВремяФормат строку "01:01:01".
Хотя предложенный выше способ является наиболее идиоматичным и простым для 1С, в некоторых случаях можно использовать и чисто математический подход, особенно если требуется большая гибкость или существуют ограничения на использование функций даты-времени.
Этот метод основан на целочисленном делении и получении остатка от деления для вычисления часов, минут и секунд.
Посмотрим на пример такого запроса:
ВЫБРАТЬ
ИсточникДанных.ВремяВСекундах,
// Вычисляем часы
Цел(ИсточникДанных.ВремяВСекундах / 3600) КАК Часы,
// Вычисляем минуты
Цел((ИсточникДанных.ВремяВСекундах % 3600) / 60) КАК Минуты,
// Вычисляем секунды
ИсточникДанных.ВремяВСекундах % 60 КАК Секунды
ИЗ
ИсточникДанных КАК ИсточникДанных
Разберем логику вычислений:
ЦЕЛ().%. Это дает нам количество секунд, "не уместившихся" в полные часы. Затем мы делим этот остаток на 60 (количество секунд в минуте) и снова берем целую часть.Важный нюанс: этот запрос вернет часы, минуты и секунды в виде отдельных числовых полей. Чтобы собрать их в одну строку формата "ЧЧ:ММ:СС", потребуется дополнительное преобразование, например, с помощью функции ВЫРАЗИТЬ для приведения к строке и оператора конкатенации строк +. Это делает запрос более громоздким и менее читаемым по сравнению с первым вариантом.
ВЫБРАТЬ
// ... вычисления часов, минут, секунд ...
// Собираем все в одну строку. Этот синтаксис может быть сложным и зависеть от версии платформы.
// Примерная конкатенация (в реальном запросе может потребоваться ВЫРАЗИТЬ и условные операторы для добавления ведущих нулей)
Часы + ":" + Минуты + ":" + Секунды КАК ВремяСтрокой
ИЗ
...
Как видим, математический подход требует больше шагов и усложняет текст запроса, особенно при необходимости форматирования с ведущими нулями. Поэтому для стандартной задачи преобразования в строку времени рекомендуется использовать связку функций ДОБАВИТЬКДАТЕ и ФОРМАТ как наиболее эффективный и лаконичный метод.