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

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

Как вытащить время из даты в 1С

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

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

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

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

Как устроен тип «Дата» и почему времени отдельно нет

Тип «Дата» в 1С хранит момент времени с точностью до секунды: дату календаря и время суток одновременно. Значение '20260315143000' означает 15 марта 2026 года, 14 часов 30 минут 00 секунд. Любая дата, даже если вы задали только календарную часть, содержит время — по умолчанию это 00:00:00.

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

Проверить, содержит ли дата ненулевое время, можно простым сравнением: если Дата = НачалоДня(Дата), время равно полуночи. Это бывает нужно при контроле корректности ввода, когда документ должен иметь точное время, а пользователь оставил его пустым.

Извлечение часов, минут и секунд функциями языка

Базовый способ — три функции встроенного языка, каждая из которых возвращает число:

  • Час(Дата) — час в диапазоне от 0 до 23;
  • Минута(Дата) — минуты от 0 до 59;
  • Секунда(Дата) — секунды от 0 до 59.

Пример кода, который разбирает дату документа на составляющие:

ДатаДокумента = ДокументОбъект.Дата;

Часы = Час(ДатаДокумента); // например, 14

Минуты = Минута(ДатаДокумента); // например, 5

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

Сообщить("Время документа: " + Часы + ":" + Минуты + ":" + Секунды);

Обратите внимание на деталь: числовые функции возвращают значения без ведущих нулей. Минута «05» вернётся как число 5, и при простой конкатенации строк вы получите «14:5:30» вместо «14:05:30». Если результат выводится пользователю, либо дополняйте нули вручную, либо используйте форматирование — о нём ниже.

Числовые части удобны для расчётов. Например, чтобы перевести время суток в общее количество секунд от полуночи: СекундСНачалаДня = Час(Дата) 3600 + Минута(Дата) 60 + Секунда(Дата). Такое представление удобно сравнивать и использовать в условиях.

bsl
ДатаДокумента = ТекущаяДатаСеанса();
Часы = Час(ДатаДокумента);
Минуты = Минута(ДатаДокумента);
СекундСНачалаДня = Часы <em> 3600 + Минуты </em> 60 + Секунда(ДатаДокумента);

Вывод времени строкой через функцию Формат()

Когда время нужно показать пользователю, правильный инструмент — функция Формат() с параметром «ДФ» (формат даты). Она сразу возвращает строку с ведущими нулями и нужным разделителем:

ДатаДокумента = ДокументОбъект.Дата;

ВремяСтрокой = Формат(ДатаДокумента, "ДФ=ЧЧ:мм:сс"); // "14:05:30"

ТолькоЧасыМинуты = Формат(ДатаДокумента, "ДФ=ЧЧ:мм"); // "14:05"

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

Для локализованного вывода можно использовать параметр «ДЛФ» (локальный формат даты): Формат(Дата, "ДЛФ=T") вернёт время в формате, принятом для текущей региональной настройки. Это удобно в отчётах, где формат должен соответствовать ожиданиям пользователя, а не жёстко зашитой маске.

Типичные ошибки
01
Написать ДФ=ЧЧ:ММ:сс с заглавными «ММ» — вместо минут подставится номер месяца, и ошибка может долго оставаться незамеченной
02
Склеивать Час() + ":" + Минута() вручную — теряются ведущие нули, получается «9:5» вместо «09:05»
03
Искать несуществующий тип «Время» — в 1С время хранится только внутри типа «Дата»
04
Сравнивать строковые представления времени вместо чисел — строковое сравнение «9:00» > «10:00» даст неверный результат

Как получить время в запросе

В языке запросов доступны аналогичные функции: ЧАС(), МИНУТА(), СЕКУНДА(). Они применяются к полям типа «Дата» и возвращают числа, которые затем можно группировать, фильтровать или выводить:

ВЫБРАТЬ

Продажи.Документ КАК Документ,

ЧАС(Продажи.Дата) КАК ЧасПродажи,

МИНУТА(Продажи.Дата) КАК МинутаПродажи

ИЗ

Документ.РеализацияТоваровУслуг КАК Продажи

ГДЕ

ЧАС(Продажи.Дата) >= 18

Такой запрос выберет документы, проведённые после 18:00. Обратите внимание: условие по времени через ЧАС() не использует индексы по полю даты, поэтому на больших таблицах сначала ограничивайте выборку по диапазону дат, а уже потом фильтруйте по времени.

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

Практические сценарии использования

Сравнение времени без учёта даты

Чтобы проверить, попадает ли момент в рабочий интервал, скажем с 9:00 до 18:00, переведите время в секунды от полуночи и сравните числа. Строковое сравнение «09:00» < «17:30» работает только при строго одинаковом формате с ведущими нулями и легко ломается — числовое сравнение надёжнее.

Подстановка времени в новую дату

Обратная задача — собрать дату с нужным временем — решается сложением: НоваяДата = НачалоДня(Дата) + 14 3600 + 30 60. К значению типа «Дата» можно прибавлять число секунд. Так удобно, например, переносить документ на то же время другого дня.

Время в печатных формах и отчётах СКД

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

Порядок действий
  1. 1
    Определите цель: время нужно для расчёта или для показа пользователю
  2. 2
    Для расчётов извлеките числа через Час(), Минута(), Секунда() или переведите время в секунды от полуночи
  3. 3
    Для вывода примените Формат(Дата, "ДФ=ЧЧ:мм:сс") — ведущие нули добавятся автоматически
  4. 4
    В запросе используйте ЧАС(), МИНУТА(), СЕКУНДА() и сначала ограничьте выборку по периоду
  5. 5
    Проверьте результат на дате с нулевым временем и на дате с минутами меньше 10

Проверка результата и граничные случаи

После реализации проверьте код на нескольких контрольных значениях. Дата с временем 00:00:00 должна дать «00:00:00», а не пустую строку и не ошибку. Дата с минутами 05 должна выводиться как «05», а не «5» — это сразу выявляет проблему ведущих нулей при ручной склейке строк.

Отдельно проверьте поведение с пустой датой. Значение '00010101' (пустая дата) формально содержит время 00:00:00, и функции вернут нули. Если в вашей логике пустая дата должна обрабатываться иначе, добавьте явную проверку Если Не ЗначениеЗаполнено(Дата) Тогда ....

Ещё один нюанс — часовые пояса. Функция ТекущаяДатаСеанса() возвращает время сеанса, а ТекущаяДата() на клиенте — время клиентского компьютера. Если время извлекается для бизнес-логики (например, «документы после 18:00»), используйте дату сеанса или дату документа, а не показания часов конкретного рабочего места.

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

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

Дата со временем 00:00:00
Норма

Возвращается «00:00:00» или нулевые числа

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

Пустая строка, ошибка или пропуск записи

Минуты меньше 10, например 14:05
Норма

Выводится «14:05» с ведущим нулём

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

Выводится «14:5» — потерян ноль

Дата, где месяц отличается от минут
Норма

В строке времени стоят минуты

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

Вместо минут подставлен номер месяца — ошибка в регистре «ММ»

Пустая дата 01.01.0001
Норма

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

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

Молча возвращает 00:00:00 и искажает расчёты

Часто задаваемые вопросы

Можно ли объявить в 1С переменную типа «Время»?

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

Как вычесть время из даты, оставив только календарную часть?

Используйте функцию НачалоДня(Дата) — она возвращает ту же дату со временем 00:00:00. В запросе аналог — НАЧАЛОПЕРИОДА(Дата, ДЕНЬ). Это стандартный приём для сравнения дат без учёта времени.

Почему Формат(Дата, "ДФ=ЧЧ:ММ:сс") показывает неправильные минуты?

Потому что заглавные «ММ» в форматной строке обозначают месяц, а минуты записываются строчными «мм». Замените формат на ДФ=ЧЧ:мм:сс и проверьте результат на дате, где номер месяца и минуты различаются.

Как сравнить два момента времени без привязки к дате?

Переведите оба значения в секунды от полуночи: Час(Дата) 3600 + Минута(Дата) 60 + Секунда(Дата) — и сравните полученные числа. Сравнение строк вида «ЧЧ:мм» ненадёжно, а сравнение полных дат учитывает и календарную часть.

Как получить время в запросе сразу строкой «ЧЧ:мм»?

Язык запросов не имеет функции форматирования, поэтому строку собирают уже после выполнения запроса — при обходе выборки через Формат(). Внутри запроса выбирайте числовые значения ЧАС() и МИНУТА() или само поле даты целиком.

Чем отличается ТекущаяДата() от ТекущаяДатаСеанса() при работе со временем?

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

Итог

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

Отдельного типа «время» в 1С нет — время извлекают из даты функциями Час(), Минута(), Секунда() для расчётов и Формат(Дата, "ДФ=ЧЧ:мм:сс") для вывода. В запросах работают ЧАС(), МИНУТА(), СЕКУНДА(). Следите за регистром букв в форматной строке, ведущими нулями и обработкой пустых дат.