Разработка и Конфигурация · 9 мин
Как перевести секунды в часы в 1С
Как перевести секунды в часы в 1С: формула деления, функции для вывода в формате ЧЧ:ММ:СС, округление, работа с датами и типичные ошибки разработчика.
Перевод секунд в часы — частая задача при разработке на платформе 1С:Предприятие: учёт длительности звонков, время выполнения операций, трудозатраты, длительность простоя оборудования. Во встроенном языке 1С нет отдельной готовой функции «СекундыВЧасы», поэтому преобразование выполняется простой арифметикой: количество секунд делится на 3600.
Основная сложность не в самом делении, а в деталях: как округлить результат, как представить длительность в привычном виде ЧЧ:ММ:СС, как не потерять дробную часть и как корректно работать с типом «Дата», где время хранится именно в секундах. Ниже разобраны рабочие способы с примерами кода.
Базовая формула перевода секунд в часы
В одном часе 3600 секунд (60 минут × 60 секунд). Поэтому базовое преобразование выглядит так:
Часы = Секунды / 3600;
Например, 7200 секунд дадут ровно 2 часа, а 5400 секунд — 1,5 часа. Важно, чтобы переменная с секундами имела числовой тип. Если значение пришло из строки (например, из файла обмена), сначала преобразуйте его функцией Число(), иначе получите ошибку выполнения.
Если нужен результат в минутах, делите на 60, а в сутках — на 86400. Эти три коэффициента покрывают большинство задач учёта времени в 1С.
Вывод длительности в формате ЧЧ:ММ:СС
Дробное значение вроде 2,75 часа удобно для расчётов, но пользователи привыкли видеть время как 2:45:00. Для такого представления используют целочисленное деление и остаток:
Функция СекундыВСтрокуВремени(Секунды)
Часов = Цел(Секунды / 3600);
Минут = Цел((Секунды % 3600) / 60);
Сек = Секунды % 60;
Возврат Формат(Часов, "ЧЦ=2; ЧН=00; ЧВН=") + ":"
+ Формат(Минут, "ЧЦ=2; ЧН=00; ЧВН=") + ":"
+ Формат(Сек, "ЧЦ=2; ЧН=00; ЧВН=");
КонецФункции
Здесь оператор % возвращает остаток от деления, а Цел() отбрасывает дробную часть. Параметры формата ЧЦ=2; ЧН=00; ЧВН= гарантируют двузначное отображение с ведущим нулём: вместо «2:5:3» получится «02:05:03».
Такую функцию удобно разместить в общем модуле, чтобы вызывать её из отчётов, печатных форм и обработок без дублирования кода.
Часы = Цел(Секунды / 3600);
Минуты = Цел((Секунды % 3600) / 60);
СекундыОстаток = Секунды % 60;Округление результата до нужной точности
При делении секунд на 3600 почти всегда получается дробное число с длинным «хвостом». Для отчётов и начислений его нужно округлить осознанно: 1С по умолчанию хранит числа с высокой точностью, и вывод «сырого» значения испортит печатную форму.
Варианты округления:
Окр(Секунды / 3600, 2)— округление до двух знаков (сотых часа), подходит для табелей и начислений;Цел(Секунды / 3600)— отбрасывание дробной части, только целые часы;Окр(Секунды / 3600, 0)— округление до целых часов по арифметическим правилам.
Помните: Окр() в 1С округляет по правилу «0,5 — вверх», а Цел() всегда отбрасывает дробную часть. Для расчёта оплаты за время разница между этими функциями напрямую влияет на суммы, поэтому способ округления должен быть зафиксирован в методике учёта.
Перевод через тип «Дата»
В 1С тип «Дата» внутренне представляет время с точностью до секунды, и разность двух дат возвращается именно в секундах. Это удобный способ измерить длительность:
НачалоОперации = ТекущаяДата();
// ... выполнение операции ...
ДлительностьСек = ТекущаяДата() - НачалоОперации;
ДлительностьЧасов = ДлительностьСек / 3600;
Обратный трюк: если сложить дату начала дня с количеством секунд, получится дата-время, из которой функция Формат() извлечёт часы и минуты:
ДатаВремени = Дата(1,1,1) + Секунды;
Строка = Формат(ДатаВремени, "ДФ=ЧЧ:мм:сс");
У этого приёма есть ограничение: он корректно работает только для длительностей меньше суток. Если секунд больше 86400, часы «перепрыгнут» через 24 и результат будет неверным — для больших интервалов используйте арифметику с остатком от деления.
Перевод секунд в часы в запросах
В языке запросов 1С тоже доступна арифметика, поэтому длительность в часах можно вычислить прямо в выборке, не обрабатывая результат в коде:
ВЫБРАТЬ
Операции.Сотрудник,
СУММА(Операции.ДлительностьСек) / 3600 КАК ЧасовВсего
ИЗ
РегистрСведений.Операции КАК Операции
СГРУППИРОВАТЬ ПО
Операции.Сотрудник
Такой подход быстрее, чем перебор выборки в цикле с построчным делением, особенно на больших объёмах данных. Если нужно округление, используйте функцию ВЫРАЗИТЬ(... КАК ЧИСЛО(15, 2)) — она отбросит лишние знаки до указанной точности.
Учтите, что ВЫРАЗИТЬ отсекает дробную часть по правилам приведения типа, а не округляет арифметически. Для точного округления в запросе применяют приём ВЫРАЗИТЬ(Значение + 0.005 КАК ЧИСЛО(15, 2)).
Типичные ошибки и как их проверить
Самая частая ошибка — деление на 60 вместо 3600: разработчик путает перевод в минуты и в часы, и результат оказывается завышенным в 60 раз. Вторая типовая проблема — потеря дробной части из-за того, что оба операнда целые: в 1С деление чисел даёт дробный результат автоматически, но если промежуточно применить Цел(), минуты будут безвозвратно потеряны.
Третья ошибка — использование приёма с датой для интервалов больше суток и четвёртая — сравнение длительностей, хранящихся в разных единицах (где-то секунды, где-то минуты). Единое правило помогает: храните длительность в базе всегда в секундах, а переводите в часы только на этапе вывода.
Как проверить результат
Результат ровно 1 час
0,6 или 60 — перепутан коэффициент
1:01:01 или 1,0169... часа
Целое число без минут — потерян остаток
25 часов или 25:00:00
01:00:00 — использован приём с датой для интервала больше суток
Выбор способа под задачу
Для внутренних расчётов и хранения оставляйте секунды — это самая точная единица без потерь. Для отчётов по трудозатратам и начислений делите на 3600 и округляйте Окр() до сотых. Для отображения пользователю длительности операции форматируйте в ЧЧ:ММ:СС через целочисленное деление и остаток.
Если длительность гарантированно меньше суток и нужен быстрый вывод, допустим короткий приём с Дата(1,1,1) + Секунды и форматом ДФ. Для агрегирования по большим данным выносите деление в запрос — это снижает объём обрабатываемых в коде строк.
Как выбрать способ
Частые вопросы
Как перевести секунды в минуты в 1С?
Разделите количество секунд на 60: Минуты = Секунды / 60. Для целых минут без остатка используйте Цел(Секунды / 60), а оставшиеся секунды получите оператором Секунды % 60.
Как получить часы из разности двух дат?
Вычитание двух значений типа Дата даёт число секунд между ними. Разделите результат на 3600: Часов = (ДатаОкончания - ДатаНачала) / 3600. При необходимости округлите функцией Окр().
Почему формат ДФ=ЧЧ:мм:сс показывает неправильное время?
Приём с прибавлением секунд к дате работает только в пределах одних суток. Если секунд больше 86400, часы сбрасываются на начало суток. Для длинных интервалов вычисляйте часы арифметически: Цел(Секунды / 3600).
Как округлить часы до двух знаков в запросе 1С?
Используйте ВЫРАЗИТЬ(Секунды / 3600 КАК ЧИСЛО(15, 2)). Учтите, что приведение типа отсекает лишние знаки, а не округляет арифметически; для округления добавьте 0,005 перед приведением.
В каких единицах лучше хранить длительность в базе?
В секундах, в числовом реквизите. Это самая точная единица без потерь при округлении, а перевод в минуты, часы или формат ЧЧ:ММ:СС выполняется только при выводе в отчёты и формы.
Как вывести длительность больше суток, например 50 часов?
Форматируйте вручную: Часов = Цел(Секунды / 3600), Минут = Цел((Секунды % 3600) / 60), Сек = Секунды % 60, и соберите строку вида "50:15:30". Функция Формат с маской времени здесь не подойдёт, так как она ограничена сутками.
Что важно запомнить
Секунды переводятся в часы делением на 3600. Для формата ЧЧ:ММ:СС используйте Цел() и остаток %, для дат — разность в секундах, для больших выборок — деление в запросе. Храните длительность в секундах, а способ округления фиксируйте единым для всех расчётов.