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

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

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

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

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

Ниже разобраны рабочие приёмы для модуля и для языка запросов, типичные ошибки при сравнении времени и способы проверить, что результат получен корректно. Все примеры применимы к платформе 8.3 и, с минимальными оговорками, к 8.2.

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

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

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

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

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

ДатаДокумента = Документ.Дата; // например, 15.03.2026 14:35:20

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

Минуты = Минута(ДатаДокумента); // 35

Секунды = Секунда(ДатаДокумента); // 20

Этот вариант удобен, когда компоненты нужны по отдельности — например, чтобы проверить, попадает ли операция в рабочий интервал с 9:00 до 18:00, или чтобы собрать собственное строковое представление. Функции не изменяют исходное значение и безопасны для любых дат, включая пустую (для пустой даты все три функции вернут 0).

bsl
Если Час(ДатаДокумента) >= 9 И Час(ДатаДокумента) < 18 Тогда
    // операция внутри рабочего дня
КонецЕсли;

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

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

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

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

// для 14:35:20 результат — 52520

Число секунд легко сравнивать: условие «позже 12:00» записывается как ВремяВСекундах > 12 * 3600. Это надёжнее, чем цепочка сравнений по часам и минутам, особенно когда граница задана с точностью до минуты — например, 14:30 соответствует 52 200 секундам.

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

Вывод времени строкой через Формат

Если время нужно показать пользователю или записать в текстовое поле, используйте функцию Формат() с форматной строкой ДФ. Для времени применяются шаблоны ЧЧ (часы 00–23), мм (минуты) и сс (секунды).

СтрокаВремени = Формат(ДатаДокумента, "ДФ=ЧЧ:мм:сс"); // "14:35:20"

СтрокаКороткая = Формат(ДатаДокумента, "ДФ=ЧЧ:мм"); // "14:35"

Типичная ошибка здесь — перепутать регистр букв: «ММ» означает месяц, а «мм» — минуты. Если вместо минут выводится номер месяца, проверьте регистр в форматной строке. Также учтите, что параметр ДФ работает с локальным представлением; для независимости от региональных настроек шаблон лучше задавать явно, как в примерах выше.

Типичные ошибки
01
Написать ДФ=ЧЧ:ММ — вместо минут выводится номер месяца
02
Сравнивать даты напрямую, забыв, что сравнивается и время: Дата1 = Дата2 ложно при разном времени
03
Присвоить результат вычитания дат (число секунд) реквизиту типа Дата
04
Использовать в запросе функции встроенного языка Час() вместо ЧАС() языка запросов

Выделение времени в запросе

В языке запросов 1С есть собственные функции ЧАС, МИНУТА и СЕКУНДА, которые применяются к полю типа Дата и возвращают число. Они работают и в списке выборки, и в условии ГДЕ.

ВЫБРАТЬ

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

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

МИНУТА(Реализация.Дата) КАК МинутаДокумента

ИЗ

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

ГДЕ

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

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

Для сравнения по времени с точностью до минуты в запросе удобно вычислять выражение ЧАС(Дата) 60 + МИНУТА(Дата) — это минуты от начала суток. Условие «после 14:30» тогда выглядит как ЧАС(Дата) 60 + МИНУТА(Дата) > 870.

Учтите ограничение: функции ЧАС, МИНУТА, СЕКУНДА применимы только к полям типа Дата. Если поле составного типа или хранит строку, сначала потребуется приведение, иначе запрос вернёт ошибку ещё на этапе выполнения конструктора.

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

После реализации проверьте вычисления на граничных значениях: полночь (00:00:00 даёт 0 секунд и нулевые компоненты), 23:59:59 (86399 секунд) и пустая дата. Пустая дата не вызовет исключения, но вернёт нулевое время — если это нежелательно, добавьте явную проверку Если Не ЗначениеЗаполнено(Дата).

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

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

Полночь 00:00:00
Норма

Секунды от начала дня = 0, Час() = 0

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

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

Время 14:35:20
Норма

Час=14, Минута=35, секунд от начала дня 52520

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

Минута() возвращает номер месяца — перепутан регистр в Формат

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

Все функции возвращают 0, исключения нет

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

Падение кода из-за отсутствия проверки заполненности

Отдельная граница — часовые пояса. Реквизиты документов обычно хранят дату сеанса, и функции Час/Минута/Секунда работают с ней как есть. Если в базе используются даты UTC или даты других часовых поясов, выделенное «время» будет соответствовать той зоне, в которой записано значение, — приведение пояса нужно выполнять отдельно, до выделения времени.

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

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

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

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

Можно ли сохранить только время в реквизит типа Дата?

Нет, тип Дата всегда содержит и день, и время. Обычно время хранят как число секунд от начала дня либо как строку «ЧЧ:мм:сс», если оно нужно только для отображения.

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

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

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

Вычислите для каждой даты секунды от начала дня (Дата - НачалоДня(Дата)) и сравните полученные числа. Либо сравните комбинацию Час()*3600 + Минута()*60 + Секунда().

Работают ли функции Час() и Минута() с пустой датой?

Да, исключения не будет: для пустой даты ('00010101000000') все функции вернут 0. Если нулевое время недопустимо по логике, проверяйте дату через ЗначениеЗаполнено() заранее.

Как в запросе отобрать документы за интервал времени, например с 12:00 до 13:00?

Используйте условие по минутам от начала суток: ГДЕ ЧАС(Дата) 60 + МИНУТА(Дата) >= 720 И ЧАС(Дата) 60 + МИНУТА(Дата) < 780. Это охватывает интервал с 12:00:00 до 12:59:59 включительно.

Чем отличается вычитание дат от функции РазностьДат?

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

Итог

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

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