Разработка и Конфигурация · 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Получите числовые значения часов, минут и секунд (из реквизитов, строки или расчёта)
- 2Проверьте диапазоны: часы 0–23, минуты и секунды 0–59
- 3Соберите значение: Дата(1,1,1,Часы,Минуты,Секунды)
- 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") — строка в формате ГГГГММДДччммсс. Но при малейшем отклонении формата этот способ даёт ошибку, поэтому для непредсказуемых входных данных разбор по компонентам надёжнее.
Функция ВремяИзСтроки(СтрокаВремени)
Части = СтрРазделить(СтрокаВремени, ":");
Если Части.Количество() < 2 Тогда
Возврат Неопределено;
КонецЕсли;
Попытка
Возврат Дата(1, 1, 1, Число(Части[0]), Число(Части[1]), 0);
Исключение
Возврат Неопределено;
КонецПопытки;
КонецФункцииХранение времени в реквизитах: дата или число
При проектировании конфигурации возникает вопрос: хранить время как дату с фиктивным днём или как число (секунды, минуты). Оба подхода рабочие, но у них разные последствия. Дата удобна для форматированного вывода и арифметики, число — для обмена, сортировки длительностей и хранения интервалов больше суток.
| Подход | Плюсы | Ограничения |
|---|---|---|
| Реквизит типа «Дата» (состав «Время») | Готовый ввод с маской, форматирование, арифметика в секундах | Нельзя хранить интервал больше 24 часов без смещения дня |
| Число (секунды или минуты) | Простой обмен, сортировка, любые длительности | Нужно вручную форматировать для отображения и проверять ввод |
| Строка «ЧЧ:ММ» | Наглядность в файлах обмена | Нет контроля типа, требуется разбор и проверка при каждом использовании |
Для реквизитов типа «начало смены» или «время визита» в управляемых формах удобнее всего дата с составом «Время»: платформа сама покажет поле ввода с маской ЧЧ:ММ:СС и не даст ввести некорректное значение. Для длительностей (отработано часов, время в пути) надёжнее число — секунды или минуты с явной единицей измерения в имени реквизита.
Сравнение вариантов
Подходит для отметок времени в пределах суток; не подходит для длительностей больше 24 часов
Подходит для длительностей и обмена; требует ручного форматирования при выводе
Подходит только как транспортный формат; в базе хранить не рекомендуется
Проверка результата и типичные ошибки
После преобразования результат стоит проверить явно: вывести через Формат() с шаблоном времени и убедиться, что часы и минуты совпадают с ожидаемыми. Для числа секунд полезна обратная проверка — вычесть начало суток и сравнить с исходным числом.
Самые частые ошибки в этой теме: передача в конструктор значений вне диапазона (час 24 вместо 0, минуты 60), путаница между десятичными часами и «часами с минутами» в дробной части, а также ожидание, что сложение даты с числом прибавляет дни, а не секунды. Ещё одна ловушка — сравнение двух «времён» с разной календарной частью: 01.01.0001 08:00 и текущая дата 08:00 не равны, хотя на экране выглядят одинаково.
Как проверить результат
Часы и минуты совпадают с исходными числами
Время сдвинуто на час или сутки — проверьте базовую дату и единицы измерения
Время - Дата('00010101') равно исходному числу секунд
Разность отличается — значит календарная часть не нулевая
Конструктор отрабатывает без исключений
Ошибка выполнения — где-то значение вышло за диапазон
Что важно запомнить
Времени без даты в 1С нет: число превращается во время либо конструктором Дата(г; м; д; ч; мин; с), либо сложением базовой даты с числом секунд. Проверяйте диапазоны входных чисел, различайте десятичные часы и формат «часы.минуты», а перед сравнением приводите значения к одной календарной части.
Частые вопросы
Как получить текущее время в виде числа секунд от начала суток?
Возьмите текущую дату сеанса и вычтите из неё начало этого же дня: НачалоДня(ТекущаяДатаСеанса()). Выражение ТекущаяДатаСеанса() - НачалоДня(ТекущаяДатаСеанса()) вернёт число секунд с полуночи.
Можно ли хранить в реквизите только время без даты?
Да: создайте реквизит типа «Дата» и в свойстве «Состав даты» выберите «Время». В интерфейсе поле будет вводиться как ЧЧ:ММ:СС, а календарная часть внутри значения останется фиксированной и не будет мешать отображению.
Как прибавить к дате несколько часов?
Переведите часы в секунды и сложите: НоваяДата = ИсходнаяДата + Часы * 3600. Аналогично минуты умножаются на 60. Прямой функции «прибавить часы» во встроенном языке нет, вся арифметика идёт в секундах.
Почему Дата('00010101') + 90000 даёт следующий день?
Потому что в сутках 86400 секунд, и значение 90000 выходит за их пределы — дата законно переходит на 02.01.0001 01:00:00. Если нужен результат строго в пределах суток, проверяйте число перед сложением или берите остаток от деления на 86400.
Как вывести длительность больше суток в формате ЧЧ:ММ?
Тип «Дата» для этого не подходит. Храните длительность числом секунд и форматируйте вручную: часы — это Цел(Секунды / 3600) без ограничения 24, минуты — остаток, делённый на 60. Соберите строку через СтрШаблон или конкатенацию.
Чем отличается Час() от извлечения часа через Формат()?
Функция Час(ДатаЗначение) возвращает число от 0 до 23, пригодное для расчётов и конструктора Дата(). Формат() возвращает строку для отображения, и использовать её результат в арифметике нельзя без обратного преобразования.