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

Разработка и Конфигурация · 10 мин

Как перевести время в число в 1С

Способы преобразования времени в число в 1С: функции Час, Минута, Секунда, разность дат, форматирование. Примеры кода для 1С 8.3 и типичные ошибки.

Во встроенном языке 1С нет отдельного типа «время» — время хранится как часть значения типа «Дата», где дата и время объединены в одну величину с точностью до секунды. Поэтому «перевести время в число» может означать разные задачи: извлечь часы, минуты или секунды из даты, посчитать длительность между двумя моментами в секундах или получить десятичное число часов для расчёта зарплаты и табеля.

Выбор способа зависит от цели. Если нужно узнать, который час, — используют функции Час(), Минута(), Секунда(). Если нужно посчитать отработанное время между двумя датами — применяют вычитание дат, которое возвращает разность в секундах. Если требуется представить время как десятичную дробь (например, 7,5 часа), результат делят на 3600 или 60.

Ниже разобраны все основные сценарии с готовыми примерами кода для платформы 1С:Предприятие 8.3, а также типичные ошибки, из-за которых расчёты времени дают неверный результат.

Как устроено время в 1С и почему это важно

Тип «Дата» в 1С хранит одновременно календарную дату и время суток с точностью до секунды. Значение «01.01.0001 00:00:00» — минимальная дата, а пустая дата по умолчанию. Любая переменная типа «Дата», полученная функцией ТекущаяДата() или из реквизита документа, содержит и день, и время.

Из-за этого прямого «перевода времени в число» одной встроенной функцией не существует — платформа предлагает набор функций для извлечения составляющих. Понимание этого устройства помогает не искать несуществующую функцию «ВремяВЧисло», а собирать нужный результат из простых операций.

Для учётных расчётов надёжнее использовать серверное время или дату документа.

Извлечение часов, минут и секунд функциями Час(), Минута(), Секунда()

Простейший способ перевести время в число — разложить дату на компоненты. Функция Час(Дата) возвращает число от 0 до 23, Минута(Дата) — от 0 до 59, Секунда(Дата) — от 0 до 59. Все три принимают один параметр — значение типа «Дата».

ДатаВремя = ТекущаяДата();

Часы = Час(ДатаВремя); // например, 14

Минуты = Минута(ДатаВремя); // например, 35

Секунды = Секунда(ДатаВремя); // например, 12

Этот подход подходит, когда нужно проверить, попадает ли время в заданный интервал, сформировать строку вида «14:35» или заполнить отдельные числовые реквизиты. Например, условие Если Час(ДатаДокумента) >= 22 Тогда позволяет отметить ночные часы для расчёта доплаты.

Разность двух дат: длительность в секундах

Если из одной даты вычесть другую, результатом будет число — количество секунд между моментами. Это основной способ посчитать длительность: время работы сотрудника, длительность операции, простой оборудования.

Начало = Дата("20260115090000"); // 09:00:00

Окончание = Дата("20260115173000"); // 17:30:00

ДлительностьСек = Окончание - Начало; // 30600 секунд

ДлительностьЧасов = ДлительностьСек / 3600; // 8,5 часа

Результат вычитания — целое число секунд. Если окончание раньше начала, получится отрицательное число — это удобно для проверки корректности введённых данных: отрицательная длительность означает ошибку ввода.

Для получения минут делите на 60, для часов — на 3600. Если нужно целое число часов с округлением, применяйте функции Цел() или Окр() с указанием разрядности и режима округления.

Порядок действий для расчёта длительности
  1. 1
    Получите два значения типа «Дата»: начало и окончание интервала
  2. 2
    Вычтите начало из окончания — получите секунды
  3. 3
    Проверьте, что результат не отрицательный
  4. 4
    Разделите на 3600 для часов или на 60 для минут
  5. 5
    При необходимости округлите функцией Окр() до нужной точности

Перевод времени в десятичное число для табеля и расчётов

В кадровых и зарплатных конфигурациях время часто требуется в десятичном виде: 8 часов 30 минут — это 8,5. Формула проста: часы плюс минуты, делённые на 60. Если исходник — длительность в секундах, достаточно одного деления на 3600.

// Вариант 1: из компонентов времени

ДесятичныеЧасы = Час(ДатаВремя) + Минута(ДатаВремя) / 60;

// Вариант 2: из длительности в секундах

ДесятичныеЧасы = (Окончание - Начало) / 3600;

Обратное преобразование — из десятичного числа в часы и минуты — делается через целую часть и остаток: целая часть числа — часы, дробная часть, умноженная на 60, — минуты. Например, 7,75 часа — это 7 часов 45 минут.

При расчётах с деньгами следите за точностью: промежуточные значения лучше не округлять, а итоговую сумму округлять до копеек функцией Окр(Сумма, 2). Округление на каждом шаге накапливает погрешность, которая на большом объёме данных превращается в расхождения с табелем.

bsl
Функция ВремяВДесятичныеЧасы(Начало, Окончание)
	Секунды = Окончание - Начало;
	Если Секунды < 0 Тогда
		Возврат 0;
	КонецЕсли;
	Возврат Окр(Секунды / 3600, 2);
КонецФункции

Форматирование и преобразование строки со временем в дату

Обратная задача — получить дату со временем из строки. Функция Дата() принимает строку в формате «ГГГГММДДччммсс», где время можно опустить. Например, Дата("20260315143000") вернёт 15 марта 2026 года, 14:30:00.

Для вывода времени пользователю применяется функция Формат() с форматной строкой: Формат(ДатаВремя, "ДЛФ=T") выведет только время, а Формат(ДатаВремя, "ДФ=чч:мм") — часы и минуты в заданном виде. Результат форматирования — строка, а не число: использовать её в арифметике нельзя.

Если время приходит из внешнего источника (CSV, обмен с другой системой) в виде строки «14:30», надёжнее разбить её по разделителю и собрать дату функцией Дата(Год, Месяц, День, Час, Минута, Секунда) — явное задание компонентов исключает ошибки разбора региональных форматов.

Типичные ошибки
01
Попытка вычесть строки вместо дат — получается ошибка преобразования типов; решение: сначала привести значения к типу «Дата»
02
Использование результата Формат() в арифметике — форматирование возвращает строку, а не число
03
Забытый учёт перехода через полночь: смена с 22:00 до 06:00 даёт отрицательную разность, если обе даты в одном дне
04
Округление промежуточных значений — накапливается погрешность в итоговых суммах
05
Сравнение ТекущаяДата() на клиенте и сервере — разные часовые пояса дают разные результаты

Переход через полночь и граничные случаи

Классическая проблема расчёта рабочего времени — ночная смена. Если начало смены 22:00 одного дня, а окончание 06:00 следующего, простое вычитание в пределах одной даты даст отрицательное число. Решение — всегда хранить полные даты с днём, а не только время суток.

Если по условиям задачи доступно только время суток, добавьте проверку: когда окончание меньше начала, прибавьте к окончанию сутки — 86400 секунд. Функция Дата + 86400 сдвигает дату на день вперёд, что корректно обрабатывает переход через полночь.

Ещё один граничный случай — пустая дата. Вычитание с участием пустой даты (01.01.0001) даст огромное отрицательное или положительное число. Перед расчётом проверяйте заполненность функцией ЗначениеЗаполнено().

Контрольные точки

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

Знак разности дат
Норма

Положительное число секунд при окончании позже начала

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

Отрицательное значение при корректных данных — перепутаны начало и окончание

Десятичные часы
Норма

Значение в разумных пределах, например 0–24 для суточной длительности

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

Огромные числа — признак пустой даты в расчёте

Ночная смена
Норма

Смена 22:00–06:00 даёт 8 часов

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

Отрицательная длительность или 16 часов — не учтён переход через полночь

Где применяется перевод времени в число в типовых конфигурациях

В конфигурациях линейки «1С:Зарплата и управление персоналом» отработанное время хранится в часах с дробной частью, а табели и графики работают именно с числовыми значениями. При доработках, где нужно выгрузить время в стороннюю систему, стандартный приём — хранить длительность в секундах или часах в числовом реквизите.

В учётных задачах (учёт времени работ, хронометраж услуг, биллинг) обычно заводят реквизиты «ВремяНачала» и «ВремяОкончания» типа «Дата» и вычисляемое поле длительности. Такой подход сохраняет и исходные данные, и результат, что упрощает проверку расчётов.

В запросах для аналогичных задач используются функции языка запросов: ЧАС(), МИНУТА(), СЕКУНДА() и РАЗНОСТЬДАТ(Дата1, Дата2, СЕКУНДА). Последняя особенно удобна, когда длительность нужно посчитать сразу в выборке без обхода результата в коде.

Сравнение способов перевода времени в число

Час(), Минута(), Секунда()

Подходят для извлечения компонентов времени и проверок условий; не дают длительность между двумя моментами

Вычитание дат

Универсальный способ получить длительность в секундах; требует двух полных дат и контроля перехода через полночь

РАЗНОСТЬДАТ в запросе

Считает длительность прямо в выборке, быстро на больших объёмах; доступна только в языке запросов

Формат()

Даёт строковое представление времени для вывода; результат нельзя использовать в арифметике

Частые вопросы

Как в 1С получить текущее время в виде числа?

Вызовите Час(ТекущаяДата()) для часов, Минута(ТекущаяДата()) для минут. Если нужно число секунд с начала суток, вычтите из текущей даты начало дня: ТекущаяДата() - НачалоДня(ТекущаяДата()).

Как перевести секунды обратно в часы и минуты?

Часы — это Цел(Секунды / 3600), оставшиеся минуты — Цел((Секунды % 3600) / 60). Оператор % возвращает остаток от деления. Для вывода пользователю удобнее собрать строку через СтрШаблон().

Почему вычитание дат даёт огромное число?

Скорее всего, один из операндов — пустая дата (01.01.0001). Проверьте оба значения функцией ЗначениеЗаполнено() перед расчётом и обработайте случай незаполненных данных отдельно.

Как посчитать длительность в запросе без обхода выборки?

Используйте функцию языка запросов РАЗНОСТЬДАТ(Начало, Окончание, СЕКУНДА) — она вернёт разность в секундах. Третий параметр можно заменить на МИНУТА или ЧАС, если нужна другая единица измерения.

Можно ли хранить время отдельно от даты?

Отдельного типа «время» нет, поэтому варианты такие: хранить дату с нулевым днём (время на дату 01.01.0001), хранить секунды от начала суток в числовом реквизите или часы в десятичном виде. Для расчётов удобнее всего числовое хранение в секундах.

Как округлить время до 15 минут?

Переведите длительность в минуты, разделите на 15, округлите функцией Окр() до целого и умножьте обратно на 15. Например: Окр(Минуты / 15, 0) * 15. Учтите, что округление всегда выбирайте осознанно — в большую или меньшую сторону, согласно правилам учёта.

Итог

Что важно запомнить

В 1С время — часть типа «Дата», отдельного типа нет. Компоненты извлекают функциями Час(), Минута(), Секунда(), длительность считают вычитанием дат (результат в секундах) или РАЗНОСТЬДАТ в запросе. Для десятичных часов делите секунды на 3600, проверяйте заполненность дат и переход через полночь.