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

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

Как получить время из даты в 1С: все способы с примерами

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

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

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

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

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

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

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

Функции Час(), Минута(), Секунда() — базовый способ

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

ДатаДокумента = Документ.Дата; // например, 15.03.2026 09:45:30

ЧасВремени = Час(ДатаДокумента); // 9

МинутаВремени = Минута(ДатаДокумента); // 45

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

Этот способ удобен, когда компоненты нужны по отдельности: для сравнения часа с границей смены, для группировки по часам в отчёте, для логики «событие произошло до полудня». Обратите внимание: функции возвращают числа без ведущего нуля — час 9, а не «09». Если нужен строковый вид с нулями, потребуется дополнительное форматирование.

Для сборки строки времени из компонентов удобно использовать функцию СтрШаблон или конкатенацию с дополнением нулями:

ВремяСтрокой = СтрШаблон("%1:%2",

Формат(Час(ДатаДокумента), "ЧЦ=2; ЧВН="),

Формат(Минута(ДатаДокумента), "ЧЦ=2; ЧВН="));

// результат: "09:45"

1c
ВремяСтрокой = Формат(ТекущаяДата(), "ДФ=ЧЧ:мм:сс");

Получение времени строкой через Формат()

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

Формат(ДатаДокумента, "ДФ=ЧЧ:мм:сс");   // "09:45:30"

Формат(ДатаДокумента, "ДФ=ЧЧ:мм"); // "09:45"

Формат(ДатаДокумента, "ДФ='дд.ММ.гггг ЧЧ:мм'"); // "15.03.2026 09:45"

Обратите внимание на регистр символов в шаблоне: «ЧЧ» — часы, «мм» — минуты (строчные), «ММ» — месяц (прописные). Путаница между «мм» и «ММ» — одна из самых частых ошибок: вместо минут в строку попадает номер месяца, и на глаз это заметно не сразу.

Способ с Формат() не подходит для вычислений: результат — строка, сравнивать и сортировать её как время нельзя. Строковое сравнение «9:45» и «10:05» даст неверный порядок, потому что сравниваются символы, а не числа.

Время как число секунд от начала суток

Для вычислений — сравнений, сортировок, расчёта длительности — удобно представить время числом секунд, прошедших с полуночи. Для этого из даты вычитают начало её же дня:

СекундСНачалаДня = ДатаДокумента - НачалоДня(ДатаДокумента);

// для 09:45:30 результат — число 35130

Вычитание двух дат в 1С даёт число — разность в секундах. Функция НачалоДня() возвращает ту же дату со временем 00:00:00, поэтому разность и есть время суток в секундах. Такое число можно сравнивать, сортировать, складывать с другими интервалами.

Обратное преобразование тоже простое: чтобы получить из числа секунд часы и минуты, используют целочисленное деление и остаток:

Часы   = Цел(СекундСНачалаДня / 3600);

Минуты = Цел((СекундСНачалаДня - Часы * 3600) / 60);

Секунды = СекундСНачалаДня % 60;

Этот подход стандартно применяют, когда нужно хранить время отдельно от даты — например, время начала и окончания смены в справочнике графиков работы. Реквизит делается числовым, а при выводе пользователю значение преобразуется в привычный вид «ЧЧ:мм».

Хранение времени числом секунд избавляет от проблем сравнения дат с разной календарной частью. Но помните об ограничении: такое число не переживает переход через полночь — интервал «с 22:00 до 06:00» придётся хранить двумя полями и обрабатывать отдельно.
ПЗ
Практическое замечание

Извлечение времени в запросах

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

ВЫБРАТЬ

Реализация.Ссылка КАК Документ,

ЧАС(Реализация.Дата) КАК ЧасПродажи,

МИНУТА(Реализация.Дата) КАК МинутаПродажи

ИЗ

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

ГДЕ

ЧАС(Реализация.Дата) >= 18

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

Для получения времени одним числом в запросе применяется функция РАЗНОСТЬДАТ с параметром СЕКУНДА в сочетании с НАЧАЛОПЕРИОДА:

ВЫБРАТЬ

РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(Реализация.Дата, ДЕНЬ),

Реализация.Дата, СЕКУНДА) КАК СекундСНачалаДня

ИЗ

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

Время в СКД, динамических списках и на формах

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

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

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

Маршрут решения

Как выбрать способ

Нужно показать время пользователю или в печатной формеИспользуйте Формат(Дата, "ДФ=ЧЧ:мм:сс") — быстро и наглядно
Нужно сравнивать, сортировать или считать длительностьПереведите время в секунды: Дата - НачалоДня(Дата)
Нужны отдельные часы, минуты или секунды в кодеПримените функции Час(), Минута(), Секунда()
Нужно фильтровать или группировать в запросеИспользуйте ЧАС(), МИНУТУ(), РАЗНОСТЬДАТ в языке запросов

Типичные ошибки при работе со временем

Первая ошибка — сравнение дат без учёта времени. Условие «Дата1 = Дата2» ложно, если время различается хотя бы на секунду. Для сравнения по дню используйте НачалоДня() обеих дат, для сравнения по времени — выделенные компоненты.

Вторая — ожидание ведущих нулей от функций Час() и Минута(). Функции возвращают числа, и строка «9:5» вместо «09:05» появляется именно из-за конкатенации чисел без форматирования.

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

Типичные ошибки
01
Сравнение дат оператором «=» без НачалоДня() — совпадение ломается из-за разного времени
02
Шаблон «ДФ=ЧЧ:ММ» — вместо минут выводится номер месяца
03
Склейка строки из Час() и Минута() без форматирования — получается «9:5» вместо «09:05»
04
Фильтр по ЧАС(Дата) в запросе к большой таблице — условие не использует индекс и тормозит выборку
05
Использование ТекущаяДата() сервера без учёта часового пояса пользователя

Проверка результата и границы применения

Любой из описанных приёмов проверяется на контрольном значении. Возьмите дату с известным временем, например 01.01.2000 23:59:59, и убедитесь: Час() вернул 23, форматная строка дала «23:59:59», разность с началом дня — 86399 секунд. Если хотя бы один результат отличается, ищите ошибку в шаблоне или порядке вычислений.

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

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

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

Час(Дата) для 23:59:59
Норма

Возвращает число 23

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

Возвращает строку или неверное число

Формат(Дата, "ДФ=ЧЧ:мм:сс")
Норма

Строка вида «23:59:59» с ведущими нулями

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

Вместо минут подставлен месяц или пропущены нули

Дата - НачалоДня(Дата)
Норма

Число секунд от 0 до 86399

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

Отрицательное значение или значение больше суток

Итог

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

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

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

Можно ли создать в 1С реквизит типа «время» без даты?

Нет, такого типа в платформе не существует. Практические обходные пути: хранить дату с фиксированным днём и использовать только её временную часть либо хранить число — количество секунд от полуночи — и преобразовывать его при выводе.

Как получить время в формате «09:05» с ведущими нулями?

Проще всего через Формат(Дата, "ДФ=ЧЧ:мм") — шаблон сам добавит нули. Если собираете строку из Час() и Минута(), оберните каждое число в Формат(Значение, "ЧЦ=2; ЧВН=").

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

Приведите обе даты к секундам от начала суток: Дата1 - НачалоДня(Дата1) и Дата2 - НачалоДня(Дата2), затем сравните полученные числа. Либо сравните по компонентам — сначала часы, потом минуты.

Почему в запросе условие по ЧАС(Дата) работает медленно?

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

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

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

Как вывести в отчёте на СКД группировку продаж по часам?

Добавьте в набор данных вычисляемое поле с выражением ЧАС(Дата) или создайте вычисляемое поле в настройках СКД, затем включите его в группировку строк отчёта. Платформа сгруппирует записи по значению часа без дополнительного кода.