Разработка и Конфигурация · 9 мин
Как преобразовать время в число в 1С
Как преобразовать время в число в 1С: функции Час, Минута, Секунда, работа с типом Дата, вычисление секунд и часов, типовые ошибки и готовые примеры кода.
Задача преобразовать время в число в 1С возникает при расчёте длительности операций, учёте рабочего времени, сравнении интервалов и передаче данных во внешние системы, где время хранится как количество секунд или часов. Во встроенном языке 1С нет отдельного типа «Время» — время всегда является частью значения типа «Дата», поэтому преобразование сводится к извлечению из даты компонентов часа, минуты и секунды и их арифметической обработке.
Основной инструмент — функции Час(), Минута() и Секунда(), которые принимают значение типа «Дата» и возвращают целое число. Зная эти три компонента, легко получить время в виде единого числа: секунд с начала суток, часов с дробной частью или минут. Отдельный частный случай — разность двух дат: в 1С вычитание дат сразу даёт число — длительность в секундах.
Ниже разобраны все рабочие способы: от простого извлечения часов до универсальных функций для запросов и передачи данных в Unix-формате, а также типичные ошибки, которые приводят к неверным расчётам.
Как устроено время в 1С и почему нет отдельного типа
В платформе 1С:Предприятие значение времени всегда хранится внутри типа «Дата», который объединяет календарную дату и время с точностью до секунды. Даже если реквизит справочника задуман как «время начала смены», физически он содержит и дату — часто это 01.01.0001 или дата документа. Это важно учитывать: при преобразовании в число календарная часть либо отсекается, либо искажает результат.
Проверить, что содержит переменная, можно через функцию ТипЗнч() и вывод значения в сообщение. Если вы видите «01.01.0001 14:30:00», значит реквизит хранит только время, и дату нужно игнорировать. Если дата реальная — решите, что именно требуется: время суток или полная метка времени.
Извлечение часов, минут и секунд функциями
Базовый способ преобразования — разложить время на компоненты. Функции Час(Дата), Минута(Дата) и Секунда(Дата) возвращают целые числа: час от 0 до 23, минута и секунда от 0 до 59. Дальше эти числа складываются с нужными весами.
Пример получения времени в секундах с начала суток:
ВремяСекунды = Час(ТекущееВремя) * 3600
+ Минута(ТекущееВремя) * 60
+ Секунда(ТекущееВремя);
Если нужно время в часах с дробной частью (например, 14,5 для 14:30), делите минуты и секунды:
ВремяЧасы = Час(ТекущееВремя)
+ Минута(ТекущееВремя) / 60
+ Секунда(ТекущееВремя) / 3600;
Такой формат удобен для расчёта оплаты по тарифу за час: число напрямую умножается на ставку. Перед использованием убедитесь, что значение заполнено — для пустой даты (01.01.0001 00:00:00) все три функции вернут ноль, что может быть ошибочно принято за полночь.
Разность дат как готовое число секунд
Самый короткий способ получить длительность в числовом виде — вычесть одну дату из другой. Оператор «минус» для двух значений типа «Дата» возвращает число — количество секунд между ними. Это стандартный приём для замера длительности операций:
НачалоОперации = ТекущаяДатаСеанса();
// ... выполнение операции ...
ДлительностьСекунд = ТекущаяДатаСеанса() - НачалоОперации;
Чтобы получить минуты или часы, разделите результат на 60 или 3600. Для целочисленного результата используйте Цел() или Окр() с нужной точностью. Учтите: разность может быть отрицательной, если даты перепутаны местами, поэтому при сравнении интервалов полезно брать модуль или заранее определять порядок дат.
Этот же приём работает для преобразования времени, хранящегося с датой 01.01.0001: достаточно вычесть начало дня — ВремяВСекундах = ЗначениеДаты - НачалоДня(ЗначениеДаты). Результат идентичен формуле с Час/Минута/Секунда, но пишется короче.
Способы получения числа из времени
Наглядно и читаемо, подходит для обучения и отладки. Чуть длиннее в записи.
Самая короткая запись секунд с начала суток. Требует понимания арифметики дат.
Единственный способ для интервалов между разными моментами, включая переход через полночь.
Преобразование времени в число в запросе
В языке запросов 1С доступны те же функции: ЧАС(), МИНУТА(), СЕКУНДА() и РАЗНОСТЬДАТ(). Функция РАЗНОСТЬДАТ(Дата1, Дата2, СЕКУНДА) возвращает число секунд между датами и удобна для вычисления длительности прямо в выборке, без обхода результата в коде.
Типовой фрагмент запроса для получения времени в часах:
ВЫБРАТЬ
ЧАС(Таблица.ВремяНачала) + МИНУТА(Таблица.ВремяНачала) / 60 КАК ВремяЧислом
ИЗ
Документ.Смена КАК Таблица
Вычисления в запросе быстрее при больших объёмах, чем построчная обработка выборки в цикле. Однако сложные формулы ухудшают читаемость запроса — если логика ветвится, лучше вычислить число в коде после получения данных.
- 1Определите, что хранит значение: только время (дата 01.01.0001) или полную метку времени
- 2Проверьте заполненность значения через ЗначениеЗаполнено()
- 3Выберите целевую единицу: секунды, минуты или часы с дробной частью
- 4Примените формулу: Час()*3600 + Минута()*60 + Секунда() или разность дат
- 5Проверьте результат на контрольном примере, например 14:30:00 должно дать 52200 секунд
Unix-время и обмен с внешними системами
При интеграции с веб-сервисами и базами данных часто требуется Unix timestamp — число секунд с 01.01.1970. Получить его можно разностью дат:
UnixВремя = ТекущаяДатаСеанса() - Дата(1970, 1, 1);
Здесь кроется главный подводный камень — часовой пояс. ТекущаяДатаСеанса() возвращает время в часовом поясе сеанса, а Unix-время по определению отсчитывается от UTC. Если внешняя система ожидает UTC, используйте УниверсальноеВремя() или ТекущаяУниверсальнаяДата(), иначе метки «уедут» на величину смещения пояса.
Обратное преобразование из числа в дату выполняется сложением: ДатаИзUnix = Дата(1970, 1, 1) + ЧислоСекунд. При получении данных из внешних источников проверяйте, в каком поясе передано значение, и при необходимости корректируйте смещение.
Типичные ошибки и ограничения
Наиболее частая ошибка — попытка применить функции Час() или Секунда() к строке вида «14:30». Строку сначала нужно превратить в дату, например через Дата("00010101143000") или разбор строки с последующей сборкой через Дата(1, 1, 1, Часы, Минуты, Секунды). Прямое преобразование строки вызовет ошибку исполнения.
Вторая группа проблем — переход через полночь. Если смена начинается в 22:00 и заканчивается в 06:00 следующего дня, простое вычитание времён без учёта дат даст отрицательное число. Решение — хранить полные даты начала и окончания, а не только время.
Также помните, что точность типа «Дата» ограничена секундами. Миллисекунды в стандартном типе не хранятся; для высокоточных замеров используют ТекущаяУниверсальнаяДатаВМиллисекундах(), которая сразу возвращает число.
Проверка результата и FAQ
Любое преобразование стоит проверить на контрольных значениях: 14:30:00 должно давать 52200 секунд или 14,5 часа, полночь — 0, 23:59:59 — 86399 секунд. Обратное преобразование числа в дату должно вернуть исходное время — это самый надёжный тест корректности формулы.
Что важно запомнить
Время в 1С — часть типа «Дата». Число получают через Час/Минута/Секунда или разность дат (в секундах). В запросах — РАЗНОСТЬДАТ(). Для интеграций контролируйте часовой пояс и используйте универсальное время.
Можно ли преобразовать строку «14:30» сразу в число?
Напрямую нет — функции Час(), Минута(), Секунда() принимают только тип «Дата». Сначала преобразуйте строку: разберите её на компоненты и соберите дату через Дата(1, 1, 1, 14, 30, 0), затем применяйте стандартную формулу.
Как получить длительность в минутах с дробной частью?
Вычтите одну дату из другой — получите секунды — и разделите результат на 60. Например: (ДатаОкончания - ДатаНачала) / 60 даст минуты с дробной частью, где 0,5 означает 30 секунд.
Почему разность дат даёт отрицательное число?
Либо даты перепутаны местами, либо интервал переходит через полночь, а хранится только время без даты. Храните полные метки даты-времени для начала и конца интервала — тогда вычитание всегда даст корректную длительность.
Как получить число секунд в запросе, а не в коде?
Используйте функцию РАЗНОСТЬДАТ(Дата1; Дата2; СЕКУНДА) — она возвращает число секунд между двумя датами. Для времени суток подойдёт выражение ЧАС(Поле) 3600 + МИНУТА(Поле) 60 + СЕКУНДА(Поле).
Как хранить миллисекунды, если тип «Дата» их не поддерживает?
Используйте функцию ТекущаяУниверсальнаяДатаВМиллисекундах() — она сразу возвращает число. Для хранения таких значений подойдёт реквизит типа «Число» достаточной разрядности, а не «Дата».
Как из числа секунд снова получить время?
Сложите число с началом суток: Дата(1, 1, 1) + СекундыСНачалаДня. Для Unix-времени: Дата(1970, 1, 1) + ЧислоСекунд, с учётом часового пояса, в котором было сформировано исходное число.