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

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

1С: как получить дату без времени (дата-время как дата)

Как в 1С получить дату без времени: НАЧАЛОПЕРИОДА в запросе, НачалоДня в коде, сравнение дат с временем, типичные ошибки и готовые примеры.

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

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

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

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

Проблемы возникают в трёх типовых ситуациях. Первая — сравнение: условие Док.Дата = &Дата не сработает, если в параметре передано начало дня, а у документа время 14:32:17. Вторая — группировка в запросе: записи одного календарного дня распадаются на множество строк, потому что секунды различаются. Третья — соединения таблиц по дате, например документов с табличной частью, где дата указана без времени.

Дата без времени в запросе: НАЧАЛОПЕРИОДА

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

ВЫБРАТЬ

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

СУММА(Реализация.Сумма) КАК Сумма

ИЗ

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

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

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

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

У функции есть и другие значения периодичности — НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД. Они полезны, когда нужно агрегировать данные не по дням, а по более крупным периодам. Парная функция КОНЕЦПЕРИОДА возвращает конец периода (для дня — 23:59:59), что удобно для построения интервалов.

bsl
ВЫБРАТЬ * ИЗ Документ.РеализацияТоваровУслуг КАК Док ГДЕ Док.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата, ДЕНЬ)

Сравнение через интервал вместо приведения

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

Дата без времени во встроенном языке: НачалоДня()

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

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

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

// документ датирован сегодняшним днём

КонецЕсли;

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

Для проверки «входит ли дата в сегодня» во встроенном языке также удобен интервал: ДатаДокумента >= НачалоДня(ТекущаяДатаСеанса()) И ДатаДокумента <= КонецДня(ТекущаяДатаСеанса()). Это тот же принцип границ, что и в запросе.

Форматирование: вывести дату без времени строкой

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

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

СтрокаДаты = Формат(ДокументОбъект.Дата, "ДФ=dd.MM.yyyy"); // 12.03.2026

Ключевое ограничение: результат — строка, а не дата. Сравнивать такие строки как даты, складывать с числами или передавать в параметр запроса типа «Дата» нельзя. Форматирование применяйте только на финальном этапе — при выводе в сообщение, печатную форму или поле отчёта.

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

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

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

Дата без времени в СКД, динамических списках и на форме

В СКД приведение делается тем же НАЧАЛОПЕРИОДА в тексте запроса набора данных. Дополнительно у поля можно настроить «Выражение представления» для красивого вывода, а в настройках отчёта — формат поля через условное оформление, чтобы пользователь видел только дату, хотя вычисления идут с полным значением.

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

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

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

НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) в запросе

Универсально для группировок и представлений; в условии ГДЕ по большим таблицам может замедлять выборку

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

Простое приведение значения типа «Дата» во встроенном языке; не работает внутри текста запроса

Сравнение с границами интервала

Самый быстрый вариант фильтрации по дню на больших данных; требует двух параметров или двух условий

Формат() с ДЛФ или ДФ

Только для вывода пользователю; результат — строка, непригодная для вычислений

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

После доработки проверьте три вещи. Во-первых, возьмите документ с ненулевым временем (например, 14:32:17) и убедитесь, что он попадает в выборку за свой день. Во-вторых, проверьте документы на границах суток: проведённый в 00:00:00 и в 23:59:59 — оба должны относиться к одному дню. В-третьих, убедитесь, что группировка по дням в отчёте даёт одну строку на календарный день, а не несколько.

Отдельный граничный случай — пустая дата. НАЧАЛОПЕРИОДА для пустой даты (01.01.0001 00:00:00) вернёт её же, а не NULL, поэтому фильтр «дата не заполнена» пишется отдельно: Док.Дата = ДАТАВРЕМЯ(1,1,1) или проверка на NULL для необязательных соединений.

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

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

Документ с временем 14:32:17 в выборке за свой день
Норма

Документ найден

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

Документ не попадает в выборку — сравнение идёт без приведения к началу дня

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

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

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

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

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

Обрабатывается отдельным условием

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

Пустые даты смешиваются с реальными или дают неожиданные строки

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

Чем НАЧАЛОПЕРИОДА отличается от КОНЕЦПЕРИОДА?

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

Можно ли хранить в реквизите действительно только дату без времени?

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

Как сравнить две даты без учёта времени в коде?

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

Почему отбор в динамическом списке по конкретному дню ничего не находит?

Скорее всего, в параметр передано начало дня (00:00:00), а условие стоит на равенство с полной датой документа. Замените условие на интервал от начала до конца дня либо на равенство по НАЧАЛОПЕРИОДА(Дата, ДЕНЬ).

Работает ли НачалоДня() в тонком клиенте и на сервере?

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

Итог

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

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