К статье
Практический материал

Разработка и Конфигурация · 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».

Такую функцию удобно разместить в общем модуле, чтобы вызывать её из отчётов, печатных форм и обработок без дублирования кода.

1c
Часы = Цел(Секунды / 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С деление чисел даёт дробный результат автоматически, но если промежуточно применить Цел(), минуты будут безвозвратно потеряны.

Третья ошибка — использование приёма с датой для интервалов больше суток и четвёртая — сравнение длительностей, хранящихся в разных единицах (где-то секунды, где-то минуты). Единое правило помогает: храните длительность в базе всегда в секундах, а переводите в часы только на этапе вывода.

Типичные ошибки
01
Деление на 60 вместо 3600 — результат завышен в 60 раз
02
Применение Цел() до деления — теряются минуты и секунды
03
Приём с Дата(1,1,1) + Секунды для интервалов больше 24 часов — часы обнуляются
04
Хранение длительности в разных единицах в разных регистрах — расхождения в отчётах
05
Строковое значение секунд без Число() — ошибка выполнения при делении
Контрольные точки

Как проверить результат

3600 секунд
Норма

Результат ровно 1 час

Тревожный признак

0,6 или 60 — перепутан коэффициент

3661 секунда
Норма

1:01:01 или 1,0169... часа

Тревожный признак

Целое число без минут — потерян остаток

90000 секунд (25 часов)
Норма

25 часов или 25:00:00

Тревожный признак

01:00:00 — использован приём с датой для интервала больше суток

Выбор способа под задачу

Для внутренних расчётов и хранения оставляйте секунды — это самая точная единица без потерь. Для отчётов по трудозатратам и начислений делите на 3600 и округляйте Окр() до сотых. Для отображения пользователю длительности операции форматируйте в ЧЧ:ММ:СС через целочисленное деление и остаток.

Если длительность гарантированно меньше суток и нужен быстрый вывод, допустим короткий приём с Дата(1,1,1) + Секунды и форматом ДФ. Для агрегирования по большим данным выносите деление в запрос — это снижает объём обрабатываемых в коде строк.

Маршрут решения

Как выбрать способ

Нужна длительность для расчёта оплаты или тарификацииДелите на 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. Для формата ЧЧ:ММ:СС используйте Цел() и остаток %, для дат — разность в секундах, для больших выборок — деление в запросе. Храните длительность в секундах, а способ округления фиксируйте единым для всех расчётов.