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

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

Как в 1С указать дату без времени

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

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

Проблема времени в датах — один из самых частых источников ошибок в отчётах и запросах. Документ проведён в 14:35:12, а пользователь отбирает данные «за 15 марта», указывая дату 15.03 с нулевым временем. Сравнение на равенство не срабатывает, документ «пропадает» из выборки, и бухгалтер видит расхождения в отчётах. Понимание того, как платформа хранит и сравнивает даты, позволяет избежать таких ситуаций.

Материал охватывает работу с датами во встроенном языке 1С, в языке запросов, в форматировании вывода и в типовых сценариях отбора по периоду. Приёмы одинаково применимы в конфигурациях на управляемых и обычных формах — различий в работе самих функций даты между ними нет.

Как платформа 1С хранит дату и почему время всегда присутствует

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

Из этого следует важное правило сравнения: две даты равны, только если совпадают и календарная часть, и время с точностью до секунды. Значение 15.03.2026 00:00:00 не равно 15.03.2026 09:15:00, хотя для пользователя это «один и тот же день». Все приёмы работы с датами без времени сводятся к тому, чтобы привести сравниваемые значения к единому виду — обычно к началу дня.

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

Основной инструмент — функция НачалоДня(). Она принимает любую дату и возвращает ту же дату с временем 00:00:00. Функция работает и с переменными, и с реквизитами объектов.

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

ДатаБезВремени = НачалоДня(ДатаДокумента); // 15.03.2026 00:00:00

Второй способ — конструктор даты. Если при создании значения указать только год, месяц и день, время автоматически станет нулевым:

НоваяДата = Дата(2026, 3, 15); // 15.03.2026 00:00:00

ТекущаяДатаБезВремени = НачалоДня(ТекущаяДатаСеанса());

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

Как получить дату без времени в коде
  1. 1
    Определите исходное значение даты — реквизит объекта, параметр или ТекущаяДатаСеанса()
  2. 2
    Примените НачалоДня(ИсходнаяДата) — время обнулится до 00:00:00
  3. 3
    Для конца периода используйте КонецДня(ИсходнаяДата), а не НачалоДня
  4. 4
    Проверьте результат выводом: Сообщить(НачалоДня(Дата)) — должно отобразиться время 0:00:00

Дата без времени в запросах 1С

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

ВЫБРАТЬ

НАЧАЛОПЕРИОДА(Реализация.Дата, ДЕНЬ) КАК ДатаБезВремени

ИЗ

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

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

ГДЕ

Реализация.Дата МЕЖДУ &НачалоДня И &КонецДня

// Параметры в коде:

// Запрос.УстановитьПараметр("НачалоДня", НачалоДня(ДатаОтбора));

// Запрос.УстановитьПараметр("КонецДня", КонецДня(ДатаОтбора));

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

Способы отбора за один день

МЕЖДУ НачалоДня И КонецДня

Быстро работает на больших таблицах, использует индекс. Требует передачи двух параметров или одного параметра-границы.

НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) = &Дата

Проще читается, один параметр. Минус — вычисление для каждой строки, на больших таблицах запрос может замедлиться.

Равенство с датой без времени напрямую

Не используйте: документы с ненулевым временем не попадут в выборку, ошибка проявится только в отчётности.

Вывод даты без времени: форматирование

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

СтрокаДаты = Формат(Документ.Дата, "ДЛФ=D"); // "15 марта 2026 г."

КороткаяДата = Формат(Документ.Дата, "ДФ=dd.MM.yyyy"); // "15.03.2026"

Параметр ДЛФ=D выводит длинную дату без времени, ДФ позволяет задать произвольный шаблон. Важно понимать разницу: форматирование меняет только представление, само значение даты со временем остаётся прежним. Если дальше эта дата участвует в сравнениях, время по-прежнему учитывается.

В макетах табличных документов и схемах компоновки данных формат задаётся в свойствах поля или параметра вывода — там же доступна форматная строка даты. Это удобно, когда отчёт строится без написания кода.

Дата без времени в реквизитах и на формах

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

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

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

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

Самая распространённая ошибка — сравнение даты документа с датой без времени на равенство. Пока разработчик тестирует на документах, введённых ровно в полночь (что бывает при загрузке), всё работает; на реальных данных отбор перестаёт находить записи.

Вторая ошибка — использование НачалоДня() для правой границы периода. Отчёт «с 1 по 31 марта» с условием «Дата <= НачалоДня(31.03)» фактически включает только 30 марта полностью. Правильная правая граница — КонецДня(ДатаОкончания) или начало следующего дня со строгим неравенством.

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

Типичные ошибки
01
Сравнение Дата = НачалоДня(&Дата) — документы с ненулевым временем теряются из выборки
02
Правая граница через НачалоДня вместо КонецДня — последний день периода выпадает из отчёта
03
Присвоение результата Формат() реквизиту типа «Дата» — строка не преобразуется обратно корректно
04
Использование ТекущаяДата() в серверном коде — при разных часовых поясах дата может сместиться на сутки

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

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

Для проверки корректности отбора за период сравните количество документов за день двумя способами: через «МЕЖДУ начало и конец дня» и через условие на равенство усечённой даты. Совпадение результата подтверждает, что границы заданы верно.

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

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

Значение даты в отладчике или сообщении
Норма

Время равно 0:00:00

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

Время отлично от нуля — НачалоДня не применено

Отбор документов за один день
Норма

Находятся все документы дня независимо от времени проведения

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

Часть документов не попадает в выборку

Период отчёта
Норма

Документы последнего дня периода присутствуют

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

Последний день пустой — граница задана через НачалоДня

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

Можно ли вообще убрать время из значения типа «Дата»?

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

Чем отличается НачалоДня от КонецДня?

НачалоДня возвращает 00:00:00 указанных суток, КонецДня — 23:59:59. Первая функция нужна для дат без времени и левой границы периода, вторая — для правой границы, чтобы включить весь день целиком.

Как вывести дату без времени в печатной форме?

Используйте Формат(Дата, "ДЛФ=D") для полного написания или Формат(Дата, "ДФ=dd.MM.yyyy") для числового. В макете табличного документа формат можно задать в свойствах параметра без кода.

Почему запрос не находит документы за выбранный день?

Чаще всего дата документа сравнивается на равенство с датой без времени. Документ проведён, например, в 10:20:00 и не равен полуночи. Замените условие на «МЕЖДУ НачалоДня И КонецДня» или сравнение через НАЧАЛОПЕРИОДА.

Что выбрать в свойстве «Состав даты» для даты рождения?

Значение «Дата». Время для таких реквизитов не нужно, а состав «Дата» исключает случайное появление ненулевого времени и упрощает сравнения и поиск.

Как получить текущую дату без времени на сервере?

Используйте НачалоДня(ТекущаяДатаСеанса()). Функция ТекущаяДатаСеанса() учитывает часовой пояс сеанса, поэтому результат не сместится на соседние сутки, в отличие от клиентской ТекущаяДата().

Итог

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

Дата в 1С всегда содержит время; «дата без времени» — это значение с нулевым временем. Получайте его функцией НачалоДня(), для правой границы периода берите КонецДня(), для вывода — Формат() с ДЛФ или ДФ, а для реквизитов без времени настраивайте состав даты «Дата». Никогда не сравнивайте дату документа на равенство с датой без времени.