Разработка и Конфигурация · 9 мин
Как перевести секунды в часы и минуты в 1С
Практические способы перевести секунды в часы и минуты в 1С: формулы с Цел и Остаток, форматирование дат, готовая функция и типичные ошибки при расчётах длительности.
Во встроенном языке 1С нет готовой функции, которая одним вызовом превращает количество секунд в строку вида «2 ч 15 мин». Длительность в учётных задачах обычно хранится как число секунд (длительность звонка, время выполнения операции, наработка оборудования), а показать пользователю её нужно в привычном виде. Задачу приходится решать вручную — целочисленным делением и остатком, либо через форматирование значения типа «Дата».
Оба подхода рабочие, но у каждого есть границы применения. Арифметический способ универсален и безопасен для любых интервалов, включая длительность больше суток. Способ через дату короче по коду, но упирается в ограничение форматирования и может дать неожиданный результат на больших значениях. Ниже разобраны оба варианта с готовым кодом, проверкой результата и разбором ошибок.
Как устроен расчёт: базовая формула
Перевод строится на двух операциях встроенного языка: функция Цел() отбрасывает дробную часть, а оператор % возвращает остаток от деления. Час — это 3600 секунд, минута — 60 секунд. Отсюда прямой алгоритм: сначала выделяем полные часы, затем из остатка — полные минуты, и в конце остаются секунды.
Функция СекундыВСтроку(Секунды)
Часы = Цел(Секунды / 3600);
Минуты = Цел((Секунды % 3600) / 60);
Сек = Секунды % 60;
Возврат Строка(Часы) + " ч " + Минуты + " мин " + Сек + " с";
КонецФункции
Для значения 8130 функция вернёт «2 ч 15 мин 30 с». Обратите внимание: оператор % в 1С работает с остатком от деления, и для положительных чисел поведение совпадает с математическим ожиданием. Если длительность может быть отрицательной (например, разница двух замеров), перед расчётом возьмите модуль через Макс(Секунды, -Секунды) или обработайте знак отдельно, иначе получите отрицательные минуты.
Часы = Цел(Секунды / 3600);
Минуты = Цел((Секунды % 3600) / 60);
Сек = Секунды % 60;Вывод в формате ЧЧ:ММ:СС через функцию Формат
Когда нужен компактный вид «02:15:30» для отчёта или печатной формы, удобнее воспользоваться функцией Формат(). Длительность в секундах можно прибавить к пустой дате (начало отсчёта — 01.01.0001 00:00:00) и отформатировать как время:
Длительность = '00010101' + Секунды;
СтрокаВремени = Формат(Длительность, "ДФ=ЧЧ:мм:сс");
Здесь '00010101' — литерал даты без времени, сложение даты и числа в 1С даёт дату, сдвинутую на указанное количество секунд. Форматная строка «ДФ=ЧЧ:мм:сс» выводит часы, минуты и секунды с ведущими нулями. Вариант хорош для интервалов в пределах суток.
Вариант для длительности больше суток
В производственных и логистических задачах интервал легко превышает 24 часа: время ремонта, длительность простоя, суммарная наработка. Здесь логично либо выводить общее количество часов (например, «49 ч 30 мин»), либо раскладывать на дни, часы и минуты.
Функция ДлительностьСтрокой(Секунды)
Дни = Цел(Секунды / 86400);
Часы = Цел((Секунды % 86400) / 3600);
Минуты = Цел((Секунды % 3600) / 60);
Если Дни > 0 Тогда
Возврат Строка(Дни) + " дн " + Часы + " ч " + Минуты + " мин";
Иначе
Возврат Строка(Часы) + " ч " + Минуты + " мин";
КонецЕсли;
КонецФункции
Выбор представления зависит от контекста. Для пользователя понятнее «2 дн 1 ч 30 мин», для аналитики суммарной наработки — «49 ч 30 мин», потому что часы удобнее сравнивать между собой. Определите требование до написания кода, чтобы не переделывать формат после внедрения.
Получение секунд из дат и документов
Часто исходные данные — не число секунд, а два момента времени: начало и окончание операции. Разность двух значений типа «Дата» в 1С даёт результат именно в секундах, поэтому перевод выглядит так:
Секунды = ДатаОкончания - ДатаНачала;
Часы = Цел(Секунды / 3600);
Минуты = Цел((Секунды % 3600) / 60);
Если длительность хранится в реквизите документа как число, убедитесь, что единица измерения действительно секунды. В типовых конфигурациях встречаются поля, где время хранится в минутах или в часах с дробной частью (например, 1,5 часа). Перед расчётом проверьте описание реквизита в конфигураторе или в коде, который его заполняет, — ошибка в единицах исказит результат в 60 раз.
Вывод длительности в отчётах на СКД
В системе компоновки данных длительность обычно вычисляют прямо в запросе. В языке запросов нет функции целочисленного деления, но есть РАЗНОСТЬДАТ, которая сразу возвращает интервал в нужной единице:
ВЫБРАТЬ
РАЗНОСТЬДАТ(Операция.ДатаНачала, Операция.ДатаОкончания, СЕКУНДА) КАК ДлительностьСек,
РАЗНОСТЬДАТ(Операция.ДатаНачала, Операция.ДатаОкончания, МИНУТА) КАК ДлительностьМин
ИЗ
Документ.Операция КАК Операция
Учтите, что РАЗНОСТЬДАТ возвращает количество полных единиц указанного типа: 90 секунд дадут 1 минуту, а не 1,5. Если нужен вид «часы и минуты», получите секунды и разложите их в вычисляемом поле СКД или в модуле формы отчёта тем же арифметическим способом.
- 1Определите, где хранится длительность: число секунд или пара дат
- 2Напишите функцию разложения через Цел() и оператор % в общем модуле
- 3Разместите модуль с признаком «Сервер» и «Вызов сервера», если функция нужна из форм
- 4Проверьте граничные значения: 0, 59, 3600, значение больше 86400
- 5Выведите результат в нужное поле формы или колонку отчёта
Проверка результата и граничные значения
Функция перевода длительности простая, но её стоит прогнать на контрольных значениях до включения в прикладной код. Проверка занимает несколько минут в консоли кода и избавляет от ошибок в печатных формах.
| Вход, секунд | Ожидаемый результат | Что проверяет |
|---|---|---|
| 0 | 0 ч 0 мин 0 с | Отсутствие ошибки на нуле |
| 59 | 0 ч 0 мин 59 с | Значение меньше минуты |
| 3600 | 1 ч 0 мин 0 с | Ровно один час без остатка |
| 8130 | 2 ч 15 мин 30 с | Типовой случай |
| 90061 | 25 ч 1 мин 1 с | Интервал больше суток |
Как проверить результат
Ровно 1 час, минуты и секунды равны нулю
Появляются дробные часы или лишняя минута
Часы превышают 23 или выделены дни
Часы «обнуляются» после 23 — признак форматирования через дату
Выводится 0 ч 0 мин без ошибки
Ошибка деления или пустая строка
Типичные ошибки при переводе секунд
Большинство проблем связано не с самой формулой, а с исходными данными и выбором способа форматирования. Ниже собраны ошибки, которые чаще всего встречаются на практике.
Отдельно стоит сказать об округлении. Если бизнес-логика требует округлять длительность вверх (например, тарификация звонков поминутно), делайте это осознанно: Цел((Секунды + 59) / 60) для минут. Не смешивайте округление и точный вывод в одной функции — выделите для округления отдельный параметр или отдельную функцию.
Что важно запомнить
Универсальный способ — целочисленное деление: часы через Цел(Секунды / 3600), минуты через остаток. Форматирование через дату подходит только для интервалов меньше суток. Перед внедрением проверьте единицы хранения исходных данных и пограничные значения.
Частые вопросы
Можно ли получить дробные часы, например 2,25 часа?
Да, для этого достаточно обычного деления: ЧасыДробные = Секунды / 3600. Такое представление удобно для расчётов стоимости и коэффициентов, но для показа пользователю его лучше переводить в формат «часы и минуты» — дробное значение воспринимается хуже.
Как вывести минуты с ведущим нулём, чтобы было «02:05»?
Используйте функцию Формат с форматной строкой для числа: Формат(Минуты, "ЧЦ=2; ЧВН="). Она дополнит значение нулём слева до двух знаков. Альтернатива — собрать строку через функцию СтрШаблон с предварительным форматированием каждой части.
Что делать, если длительность может быть отрицательной?
Сначала определите знак и сохраните его, затем работайте с модулем числа. После разложения добавьте знак к итоговой строке. Если отрицательная длительность означает ошибку данных (окончание раньше начала), лучше зафиксировать предупреждение в журнале, а не выводить значение пользователю.
Есть ли тип «длительность» во встроенном языке 1С?
Отдельного типа для интервалов времени нет. Длительность хранят как число секунд или как разность двух дат. В запросах интервал получают функцией РАЗНОСТЬДАТ с указанием нужной единицы измерения.
Как посчитать суммарную длительность по множеству записей?
Суммируйте секунды обычным итогом в запросе или циклом, а перевод в часы и минуты выполняйте один раз над итоговым числом. Суммировать уже отформатированные строки нельзя — это частая причина ошибок в сводных отчётах.
Работает ли оператор % с дробными числами?
Во встроенном языке остаток от деления корректно определён для целых операндов. Если секунды могут быть дробными (например, после деления при усреднении), сначала округлите значение через Цел() или Окр(), иначе результат может отличаться от ожидаемого.