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

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

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

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

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

Если сравнивать даты напрямую, документ от 15.03.2026 14:32:17 не будет равен дате 15.03.2026 00:00:00, хотя для пользователя это один и тот же день. Из-за этого «пропадают» строки в отчётах, не срабатывают отборы и ломаются итоги. Решение — привести значение к началу дня или отформатировать его при выводе.

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

Почему в 1С дата всегда содержит время

Тип «Дата» в платформе 1С хранит значение в виде календарной даты и времени с точностью до секунды. Это единый тип: нельзя объявить переменную, которая хранила бы только число, месяц и год без времени. Даже конструктор Дата(2026, 3, 15) создаёт значение 15.03.2026 00:00:00 — время присутствует, просто равно полуночи.

Из этого следует главное практическое правило: «дата без времени» в 1С — это дата с нулевым временем. Все сравнения, отборы и группировки по «чистой» дате сводятся к тому, чтобы привести значение к началу суток. Если хотя бы одна из сравниваемых величин содержит ненулевое время, равенство не выполнится.

Способ 1. Функция НачалоДня() в коде

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

ДатаДокумента = ДокументОбъект.Дата; // 15.03.2026 14:32:17

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

Если НачалоДня(ДатаДокумента) = НачалоДня(ТекущаяДатаСеанса()) Тогда

// документ оформлен сегодня

КонецЕсли;

Обратите внимание: при сравнении с текущей датой приводить к началу дня нужно обе стороны. Функция ТекущаяДатаСеанса() возвращает дату с текущим временем, поэтому сравнение НачалоДня(ДатаДокумента) = ТекущаяДатаСеанса() почти всегда даст «Ложь».

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

bsl
ДатаБезВремени = НачалоДня(ДатаСВременем); // сбрасывает время в 00:00:00

Способ 2. Дата без времени в запросе

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

ВЫБРАТЬ

НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ) КАК День,

СУММА(Продажи.Сумма) КАК Сумма

ИЗ

РегистрНакопления.Продажи КАК Продажи

СГРУППИРОВАТЬ ПО

НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ)

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

Учтите, что отбор через НАЧАЛОПЕРИОДА в секции ГДЕ не использует индекс по полю даты и на больших таблицах работает медленнее. Быстрее передать в запрос два параметра — начало и конец дня (или начало следующего дня) — и написать условие Документ.Дата МЕЖДУ &НачалоДня И &КонецДня, вычислив границы в коде до выполнения запроса.

Сравнение вариантов

НачалоДня() в коде

Подходит для сравнений и присвоений в модуле. Не работает внутри текста запроса.

НАЧАЛОПЕРИОДА(..., ДЕНЬ)

Единственный способ привести дату в запросе и СКД. Может замедлять отбор по индексированному полю.

Формат() с ДЛФ=D

Только для отображения пользователю: возвращает строку, сравнивать и сортировать по ней нельзя.

Способ 3. Отображение без времени через Формат()

Если задача — только показать пользователю дату без времени (в сообщении, печатной форме, заголовке), приводить значение к началу дня не обязательно. Достаточно отформатировать его функцией Формат() с параметром ДЛФ=D (локальный длинный формат даты):

СтрокаДляВывода = Формат(Документ.Дата, "ДЛФ=D"); // "15.03.2026"

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

Для табличных полей, колонок отчётов и реквизитов формы время можно скрыть без кода: в свойствах элемента или поля компоновки задайте строку формата «ДЛФ=D» (или «ДФ=dd.MM.yyyy»). Значение в данных при этом останется полной датой с временем, что безопасно для дальнейшей логики.

Способ 4. Дата без времени в СКД и отчётах

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

Чтобы в самом отчёте время не отображалось, откройте настройку поля на закладке «Наборы данных» или в пользовательских настройках и укажите формат «ДЛФ=D». Это особенно актуально для полей типа «Дата» из документов, где по умолчанию выводится дата с временем.

При передаче параметров отбора в СКД помните про границы: если пользователь выбирает «дату окончания» как 15.03.2026, в отбор попадёт значение 15.03.2026 00:00:00, и документы этого дня с ненулевым временем будут отсечены. Правильный приём — приводить окончание периода к КонецДня() или использовать стандартный параметр «Период» типа СтандартныйПериод, который платформа обрабатывает корректно.

Типичные ошибки
01
Сравнение даты документа с ТекущаяДатаСеанса() без НачалоДня — условие почти никогда не выполняется из-за ненулевого времени.
02
Использование Формат() для сравнения дат — строки сравниваются лексикографически, и '01.02.2026' окажется 'меньше' '31.01.2026' не так, как ожидается при разных форматах.
03
Отбор в запросе через НАЧАЛОПЕРИОДА в секции ГДЕ на большой таблице — индекс не используется, запрос замедляется.
04
Передача даты окончания периода без КонецДня — последний день периода частично выпадает из отчёта.

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

Проверить, что значение действительно приведено к дате без времени, можно простым сравнением: НачалоДня(Значение) = Значение. Если равенство истинно — время уже нулевое. Для отладки выведите значение полностью: Формат(Значение, "ДФ='dd.MM.yyyy HH:mm:ss'") покажет и дату, и время.

Отдельный граничный случай — пустая дата. Значение Дата(1,1,1) (01.01.0001 00:00:00) считается пустым, и НачалоДня() от него вернёт ту же пустую дату. Если логика подразумевает «дата не заполнена», проверяйте это явно через ЗначениеЗаполнено() или сравнение с '00010101', иначе пустые даты могут попасть в группировки и отборы как отдельная строка.

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

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

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

Значение после обработки
Норма

НачалоДня(Значение) = Значение, время 00:00:00

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

Время отлично от 00:00:00 — приведение не выполнено

Группировка в отчёте
Норма

Одна строка на каждый календарный день

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

Несколько строк на один день — группировка идёт по дате с временем

Отбор за конкретный день
Норма

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

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

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

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

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

Нет, отдельного типа «дата без времени» в платформе не существует. Тип Дата всегда включает время. Общепринятая практика — хранить и передавать значение, приведённое к началу дня (00:00:00), и договорённость в коде трактовать его как дату без времени.

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

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

Как получить дату без времени в запросе, если НачалоДня там недоступна?

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

Почему в отчёт не попадают документы последнего дня периода?

Почти всегда причина в том, что дата окончания передаётся как 00:00:00 последнего дня. Документы этого дня с ненулевым временем оказываются больше границы и отсекаются. Решение — приводить окончание к КонецДня() или сравнивать с началом следующего дня по условию «меньше».

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

Используйте Формат(Дата, "ДЛФ=D") при заполнении параметров макета — получите строку вида «15.03.2026». Сами данные при этом не изменяются, что безопасно: форматирование применяется только к выводимому тексту.

Что вернёт НачалоДня от пустой даты?

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

Итог

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

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