Разработка и Конфигурация · 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).
Если Час(ДатаДокумента) >= 9 И Час(ДатаДокумента) < 18 Тогда
// операция внутри рабочего дня
КонецЕсли;Получение времени как числа секунд от начала дня
Когда время нужно сравнивать или сортировать как единое значение, удобнее представить его числом — количеством секунд с начала суток. Для этого из даты вычитают её начало дня. В 1С при вычитании дат результатом является число секунд между ними.
ДатаДокумента = Документ.Дата;
ВремяВСекундах = ДатаДокумента - НачалоДня(ДатаДокумента);
// для 14:35:20 результат — 52520
Число секунд легко сравнивать: условие «позже 12:00» записывается как ВремяВСекундах > 12 * 3600. Это надёжнее, чем цепочка сравнений по часам и минутам, особенно когда граница задана с точностью до минуты — например, 14:30 соответствует 52 200 секундам.
Обратное преобразование тоже простое: чтобы присоединить время к другой дате, прибавьте секунды к началу нужного дня: НоваяДата = НачалоДня(ДругаяДата) + ВремяВСекундах. Так переносят время документа на другой день без ручного разбора на часы и минуты.
Вывод времени строкой через Формат
Если время нужно показать пользователю или записать в текстовое поле, используйте функцию Формат() с форматной строкой ДФ. Для времени применяются шаблоны ЧЧ (часы 00–23), мм (минуты) и сс (секунды).
СтрокаВремени = Формат(ДатаДокумента, "ДФ=ЧЧ:мм:сс"); // "14:35:20"
СтрокаКороткая = Формат(ДатаДокумента, "ДФ=ЧЧ:мм"); // "14:35"
Типичная ошибка здесь — перепутать регистр букв: «ММ» означает месяц, а «мм» — минуты. Если вместо минут выводится номер месяца, проверьте регистр в форматной строке. Также учтите, что параметр ДФ работает с локальным представлением; для независимости от региональных настроек шаблон лучше задавать явно, как в примерах выше.
Выделение времени в запросе
В языке запросов 1С есть собственные функции ЧАС, МИНУТА и СЕКУНДА, которые применяются к полю типа Дата и возвращают число. Они работают и в списке выборки, и в условии ГДЕ.
ВЫБРАТЬ
Реализация.Ссылка КАК Документ,
ЧАС(Реализация.Дата) КАК ЧасДокумента,
МИНУТА(Реализация.Дата) КАК МинутаДокумента
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
ЧАС(Реализация.Дата) >= 9
И ЧАС(Реализация.Дата) < 18
Для сравнения по времени с точностью до минуты в запросе удобно вычислять выражение ЧАС(Дата) 60 + МИНУТА(Дата) — это минуты от начала суток. Условие «после 14:30» тогда выглядит как ЧАС(Дата) 60 + МИНУТА(Дата) > 870.
Учтите ограничение: функции ЧАС, МИНУТА, СЕКУНДА применимы только к полям типа Дата. Если поле составного типа или хранит строку, сначала потребуется приведение, иначе запрос вернёт ошибку ещё на этапе выполнения конструктора.
Проверка результата и границы применения
После реализации проверьте вычисления на граничных значениях: полночь (00:00:00 даёт 0 секунд и нулевые компоненты), 23:59:59 (86399 секунд) и пустая дата. Пустая дата не вызовет исключения, но вернёт нулевое время — если это нежелательно, добавьте явную проверку Если Не ЗначениеЗаполнено(Дата).
Как проверить результат
Секунды от начала дня = 0, Час() = 0
Отрицательное число или ошибка преобразования
Час=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 нет: выделяйте компоненты функциями Час(), Минута(), Секунда(), считайте секунды от начала дня для сравнений, выводите строкой через Формат с шаблоном ДФ=ЧЧ:мм:сс, а в запросах применяйте функции ЧАС, МИНУТА, СЕКУНДА. Следите за регистром букв в форматной строке и проверяйте пустые даты.