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

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

Как из числа сделать время в 1С

Как преобразовать число во время в 1С: функция Дата(), состав даты из компонентов, работа с секундами, типичные ошибки и примеры кода на встроенном языке.

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

Встроенный язык 1С даёт для этого несколько инструментов: конструктор даты с шестью числовыми аргументами, функции извлечения компонентов (Час, Минута, Секунда) и арифметику дат, где прибавление целого числа означает прибавление секунд. Выбор способа зависит от того, в каком виде у вас исходное число — это часы и минуты по отдельности, десятичное представление времени (например, 8,5 часа) или количество секунд.

Ниже разобраны все основные сценарии с примерами кода, ограничения каждого подхода и типичные ошибки, из-за которых результат получается неверным или падает с ошибкой выполнения.

Как устроено время в типе «Дата» в 1С

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

Из этого следуют два практических вывода. Первый: когда нужно «чистое время», обычно берут дату с фиксированной календарной частью (например, 01.01.0001) и меняют только часы, минуты и секунды. Второй: при сравнении или выводе времени календарную часть игнорируют, форматируя значение через функцию Формат() с шаблоном времени.

Арифметика дат в 1С работает в секундах: выражение Дата1 + 3600 сдвигает дату-время на один час вперёд, а разность двух дат возвращает число секунд между ними. Это основа для преобразования числа секунд во время и обратно.

Сборка времени из числовых компонентов: часы, минуты, секунды

Самый прямой способ — конструктор даты с шестью аргументами: Дата(Год; Месяц; День; Час; Минута; Секунда). Если у вас есть отдельные числовые переменные для часов и минут (например, из полей ввода или из строки, разобранной по разделителю), время собирается одной строкой кода.

Часы = 14;

Минуты = 30;

Секунды = 0;

ВремяРезультат = Дата(1, 1, 1, Часы, Минуты, Секунды);

// Получим 01.01.0001 14:30:00

Сообщить(Формат(ВремяРезультат, "ДФ=HH:mm:ss")); // выведет 14:30:00

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

ДатаДокумента = ТекущаяДатаСеанса();

ВремяНачала = Дата(Год(ДатаДокумента), Месяц(ДатаДокумента), День(ДатаДокумента), ЧасНачала, МинутаНачала, 0);

Важно помнить про диапазоны: часы должны быть от 0 до 23, минуты и секунды — от 0 до 59. Если передать значение вне диапазона, платформа выбросит ошибку выполнения, поэтому данные из пользовательского ввода стоит проверять до вызова конструктора.

Порядок действий
  1. 1
    Получите числовые значения часов, минут и секунд (из реквизитов, строки или расчёта)
  2. 2
    Проверьте диапазоны: часы 0–23, минуты и секунды 0–59
  3. 3
    Соберите значение: Дата(1,1,1,Часы,Минуты,Секунды)
  4. 4
    При необходимости выведите результат через Формат(Значение, "ДФ=HH:mm:ss")

Преобразование числа секунд во время

Если исходное число — это количество секунд, прошедших от начала суток (частый формат при обмене с внешними системами, СКУД, телефонией), преобразование делается сложением: Время = Дата('00010101') + ЧислоСекунд. Литерал '00010101' — это дата 01.01.0001 00:00:00, удобная нулевая точка отсчёта.

СекундыСНачалаСуток = 30600; // 8 часов 30 минут

ВремяРезультат = Дата('00010101') + СекундыСНачалаСуток;

Сообщить(Формат(ВремяРезультат, "ДФ=HH:mm:ss")); // 08:30:00

Обратное преобразование — из времени в секунды — выполняется вычитанием начала суток: Секунды = ВремяЗначение - Дата('00010101'). Результатом будет число, которое можно хранить в числовом реквизите или передавать во внешнюю систему.

Если секунды отсчитываются от конкретной даты, а не от начала суток, прибавляйте их к этой дате. Учтите, что при переполнении суток (число больше 86399) значение «переедет» на следующий день — иногда это желаемое поведение, иногда источник ошибки.

Число вида «8,5 часа»: дробные часы и минуты

В учётных задачах время часто задано десятичным числом: 8,5 часа, 1,25 часа. Чтобы получить из такого числа время или длительность, переведите его в секунды умножением на 3600, а затем прибавьте к базовой дате или разложите на компоненты.

ДробныеЧасы = 8.5;

ВсегоСекунд = ДробныеЧасы * 3600; // 30600

Часы = Цел(ВсегоСекунд / 3600);

Минуты = Цел((ВсегоСекунд - Часы * 3600) / 60);

Секунды = ВсегоСекунд - Часы 3600 - Минуты 60;

ВремяРезультат = Дата(1, 1, 1, Часы, Минуты, Секунды); // 08:30:00

Аналогично решается задача с числом в минутах: умножьте на 60 и работайте как с секундами. Главное — не путать десятичное представление (8,5 часа = 8:30) с «часово-минутным» числом вида 8,30, где дробная часть — это минуты. Такие числа встречаются при импорте из Excel и требуют другого разбора: целая часть — часы, дробная, умноженная на 100, — минуты.

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

Нередко время приходит строкой — «14:30», «08:15:00», «1430». Перед тем как сделать из неё время, строку разбирают на числа. Для форматов с разделителем удобна функция СтрРазделить, для компактной записи — Сред() и Число().

СтрокаВремени = "14:30";

Части = СтрРазделить(СтрокаВремени, ":");

Часы = Число(Части[0]);

Минуты = Число(Части[1]);

ВремяРезультат = Дата(1, 1, 1, Часы, Минуты, 0);

Функция Число() бросает исключение, если строка не является числом, поэтому при обработке внешних данных вызов стоит оборачивать в Попытка/Исключение или предварительно проверять содержимое. Пустая строка, пробелы и нечисловые символы — самые частые причины падения такого кода.

Если формат гарантированно корректный, можно воспользоваться и прямым литералом даты: Дата("00010101143000") — строка в формате ГГГГММДДччммсс. Но при малейшем отклонении формата этот способ даёт ошибку, поэтому для непредсказуемых входных данных разбор по компонентам надёжнее.

bsl
Функция ВремяИзСтроки(СтрокаВремени)
	Части = СтрРазделить(СтрокаВремени, ":");
	Если Части.Количество() < 2 Тогда
		Возврат Неопределено;
	КонецЕсли;
	Попытка
		Возврат Дата(1, 1, 1, Число(Части[0]), Число(Части[1]), 0);
	Исключение
		Возврат Неопределено;
	КонецПопытки;
КонецФункции

Хранение времени в реквизитах: дата или число

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

ПодходПлюсыОграничения
Реквизит типа «Дата» (состав «Время»)Готовый ввод с маской, форматирование, арифметика в секундахНельзя хранить интервал больше 24 часов без смещения дня
Число (секунды или минуты)Простой обмен, сортировка, любые длительностиНужно вручную форматировать для отображения и проверять ввод
Строка «ЧЧ:ММ»Наглядность в файлах обменаНет контроля типа, требуется разбор и проверка при каждом использовании

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

Сравнение вариантов

Дата с составом «Время»

Подходит для отметок времени в пределах суток; не подходит для длительностей больше 24 часов

Число секунд

Подходит для длительностей и обмена; требует ручного форматирования при выводе

Строка ЧЧ:ММ

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

Проверка результата и типичные ошибки

После преобразования результат стоит проверить явно: вывести через Формат() с шаблоном времени и убедиться, что часы и минуты совпадают с ожидаемыми. Для числа секунд полезна обратная проверка — вычесть начало суток и сравнить с исходным числом.

Самые частые ошибки в этой теме: передача в конструктор значений вне диапазона (час 24 вместо 0, минуты 60), путаница между десятичными часами и «часами с минутами» в дробной части, а также ожидание, что сложение даты с числом прибавляет дни, а не секунды. Ещё одна ловушка — сравнение двух «времён» с разной календарной частью: 01.01.0001 08:00 и текущая дата 08:00 не равны, хотя на экране выглядят одинаково.

Типичные ошибки
01
Передача часа 24 или минуты 60 в конструктор Дата() — ошибка выполнения; сначала проверяйте диапазоны
02
Ожидание, что Дата + 1 прибавляет день: в 1С прибавляется одна секунда, для суток нужно +86400
03
Сравнение времени без учёта календарной части: приводите оба значения к одной дате перед сравнением
04
Трактовка 8,30 как восьми с половиной часов: уточните формат исходных данных
05
Число() над непроверенной строкой без Попытки — падение на пустом или некорректном значении
Контрольные точки

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

Вывод через Формат(Значение, "ДФ=HH:mm:ss")
Норма

Часы и минуты совпадают с исходными числами

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

Время сдвинуто на час или сутки — проверьте базовую дату и единицы измерения

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

Время - Дата('00010101') равно исходному числу секунд

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

Разность отличается — значит календарная часть не нулевая

Граничные значения 00:00:00 и 23:59:59
Норма

Конструктор отрабатывает без исключений

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

Ошибка выполнения — где-то значение вышло за диапазон

Итог

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

Времени без даты в 1С нет: число превращается во время либо конструктором Дата(г; м; д; ч; мин; с), либо сложением базовой даты с числом секунд. Проверяйте диапазоны входных чисел, различайте десятичные часы и формат «часы.минуты», а перед сравнением приводите значения к одной календарной части.

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

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

Возьмите текущую дату сеанса и вычтите из неё начало этого же дня: НачалоДня(ТекущаяДатаСеанса()). Выражение ТекущаяДатаСеанса() - НачалоДня(ТекущаяДатаСеанса()) вернёт число секунд с полуночи.

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

Да: создайте реквизит типа «Дата» и в свойстве «Состав даты» выберите «Время». В интерфейсе поле будет вводиться как ЧЧ:ММ:СС, а календарная часть внутри значения останется фиксированной и не будет мешать отображению.

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

Переведите часы в секунды и сложите: НоваяДата = ИсходнаяДата + Часы * 3600. Аналогично минуты умножаются на 60. Прямой функции «прибавить часы» во встроенном языке нет, вся арифметика идёт в секундах.

Почему Дата('00010101') + 90000 даёт следующий день?

Потому что в сутках 86400 секунд, и значение 90000 выходит за их пределы — дата законно переходит на 02.01.0001 01:00:00. Если нужен результат строго в пределах суток, проверяйте число перед сложением или берите остаток от деления на 86400.

Как вывести длительность больше суток в формате ЧЧ:ММ?

Тип «Дата» для этого не подходит. Храните длительность числом секунд и форматируйте вручную: часы — это Цел(Секунды / 3600) без ограничения 24, минуты — остаток, делённый на 60. Соберите строку через СтрШаблон или конкатенацию.

Чем отличается Час() от извлечения часа через Формат()?

Функция Час(ДатаЗначение) возвращает число от 0 до 23, пригодное для расчётов и конструктора Дата(). Формат() возвращает строку для отображения, и использовать её результат в арифметике нельзя без обратного преобразования.