Разработка и Конфигурация · 9 мин
1С: как получить дату без времени (дата-время как дата)
Как в 1С получить дату без времени: НАЧАЛОПЕРИОДА в запросе, НачалоДня в коде, сравнение дат с временем, типичные ошибки и готовые примеры.
В 1С реквизиты типа «Дата» почти всегда хранят и дату, и время — даже если пользователь видит на форме только число. Из-за этого типовая задача «сравнить две даты» или «сгруппировать по дням» неожиданно ломается: два документа за один день, но с разным временем, воспринимаются как разные значения. Решение — привести дату-время к «чистой» дате, то есть отбросить время.
Способ зависит от того, где вы работаете: в языке запросов используется функция НАЧАЛОПЕРИОДА, во встроенном языке — функция НачалоДня(), а в СКД и динамических списках есть свои нюансы. Ниже разобраны все рабочие варианты с примерами кода, ограничениями и типичными ошибками.
Почему дата в 1С содержит время и когда это мешает
Тип «Дата» в платформе 1С всегда включает время с точностью до секунды. Состав даты (только дата, только время или дата и время) задаётся в свойствах реквизита, но влияет в основном на отображение и ввод, а не на физическое хранение. Даже у реквизита с составом «Дата» время существует — просто равно 00:00:00.
Проблемы возникают в трёх типовых ситуациях. Первая — сравнение: условие Док.Дата = &Дата не сработает, если в параметре передано начало дня, а у документа время 14:32:17. Вторая — группировка в запросе: записи одного календарного дня распадаются на множество строк, потому что секунды различаются. Третья — соединения таблиц по дате, например документов с табличной частью, где дата указана без времени.
Дата без времени в запросе: НАЧАЛОПЕРИОДА
В языке запросов для отсечения времени служит функция НАЧАЛОПЕРИОДА(<Дата>, <Периодичность>). Для получения «чистой» даты используется периодичность ДЕНЬ:
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(Реализация.Дата, ДЕНЬ) КАК День,
СУММА(Реализация.Сумма) КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(Реализация.Дата, ДЕНЬ)
Такой запрос корректно сгруппирует все документы по календарным дням независимо от времени их проведения. Аналогично функция применяется в условии ГДЕ, если нужно сравнить дату документа с параметром-днём: ГДЕ НАЧАЛОПЕРИОДА(Реализация.Дата, ДЕНЬ) = &День.
У функции есть и другие значения периодичности — НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД. Они полезны, когда нужно агрегировать данные не по дням, а по более крупным периодам. Парная функция КОНЕЦПЕРИОДА возвращает конец периода (для дня — 23:59:59), что удобно для построения интервалов.
ВЫБРАТЬ * ИЗ Документ.РеализацияТоваровУслуг КАК Док ГДЕ Док.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата, ДЕНЬ)Сравнение через интервал вместо приведения
Альтернатива — не трогать поле даты, а сравнивать его с границами суток: Док.Дата >= &НачалоДня И Док.Дата <= &КонецДня. Такой вариант часто работает быстрее на больших таблицах, потому что индекс по полю «Дата» продолжает использоваться, тогда как обёртка поля функцией НАЧАЛОПЕРИОДА в условии может мешать оптимизатору. На небольших выборках разница незаметна, но в отчётах по миллионам записей это имеет значение.
Дата без времени во встроенном языке: НачалоДня()
Во встроенном языке 1С есть пара симметричных функций. НачалоДня(Дата) возвращает ту же дату с временем 00:00:00, а КонецДня(Дата) — с временем 23:59:59. Результат имеет тип «Дата», поэтому его можно сразу сравнивать, присваивать реквизитам и передавать в запросы.
ДатаДокумента = ДокументОбъект.Дата;
Если НачалоДня(ДатаДокумента) = НачалоДня(ТекущаяДатаСеанса()) Тогда
// документ датирован сегодняшним днём
КонецЕсли;
Обратите внимание: сравнивать с текущей датой напрямую (ДатаДокумента = ТекущаяДатаСеанса()) почти всегда бессмысленно — совпадение до секунды практически невозможно. Корректный приём — привести обе стороны к началу дня, как в примере выше.
Для проверки «входит ли дата в сегодня» во встроенном языке также удобен интервал: ДатаДокумента >= НачалоДня(ТекущаяДатаСеанса()) И ДатаДокумента <= КонецДня(ТекущаяДатаСеанса()). Это тот же принцип границ, что и в запросе.
Форматирование: вывести дату без времени строкой
Если задача не вычислительная, а представительская — показать пользователю дату без времени — правильный инструмент функция Формат() с форматной строкой ДЛФ=D (длинный формат даты) или ДФ=dd.MM.yyyy:
СтрокаДаты = Формат(ДокументОбъект.Дата, "ДЛФ=D"); // 12 марта 2026 г.
СтрокаДаты = Формат(ДокументОбъект.Дата, "ДФ=dd.MM.yyyy"); // 12.03.2026
Ключевое ограничение: результат — строка, а не дата. Сравнивать такие строки как даты, складывать с числами или передавать в параметр запроса типа «Дата» нельзя. Форматирование применяйте только на финальном этапе — при выводе в сообщение, печатную форму или поле отчёта.
Почему нельзя превращать дату в строку и обратно
Распространённая ошибка новичков — «обрезать» время через строку: сформатировать дату, а потом распарсить обратно. Это медленно, зависит от региональных настроек и ломается на нестандартных форматах. Для вычислений всегда используйте НачалоДня() или НАЧАЛОПЕРИОДА — они работают с типом «Дата» напрямую и не зависят от локали.
Дата без времени в СКД, динамических списках и на форме
В СКД приведение делается тем же НАЧАЛОПЕРИОДА в тексте запроса набора данных. Дополнительно у поля можно настроить «Выражение представления» для красивого вывода, а в настройках отчёта — формат поля через условное оформление, чтобы пользователь видел только дату, хотя вычисления идут с полным значением.
В динамическом списке отбор по дню без времени настраивается через произвольное условие: либо НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) = &День, либо два условия на границы интервала. Второй вариант предпочтительнее для списков с большим числом строк — по той же причине сохранения индексного поиска.
На управляемой форме для реквизита типа «Дата» состав отображения задаётся в свойствах элемента: если нужно показать только дату, установите формат ДЛФ=D или выберите в свойстве «Формат» нужный шаблон. Это влияет только на отображение и ввод — в базе время по-прежнему хранится.
Сравнение вариантов
Универсально для группировок и представлений; в условии ГДЕ по большим таблицам может замедлять выборку
Простое приведение значения типа «Дата» во встроенном языке; не работает внутри текста запроса
Самый быстрый вариант фильтрации по дню на больших данных; требует двух параметров или двух условий
Только для вывода пользователю; результат — строка, непригодная для вычислений
Проверка результата и граничные случаи
После доработки проверьте три вещи. Во-первых, возьмите документ с ненулевым временем (например, 14:32:17) и убедитесь, что он попадает в выборку за свой день. Во-вторых, проверьте документы на границах суток: проведённый в 00:00:00 и в 23:59:59 — оба должны относиться к одному дню. В-третьих, убедитесь, что группировка по дням в отчёте даёт одну строку на календарный день, а не несколько.
Отдельный граничный случай — пустая дата. НАЧАЛОПЕРИОДА для пустой даты (01.01.0001 00:00:00) вернёт её же, а не NULL, поэтому фильтр «дата не заполнена» пишется отдельно: Док.Дата = ДАТАВРЕМЯ(1,1,1) или проверка на NULL для необязательных соединений.
Как проверить результат
Документ найден
Документ не попадает в выборку — сравнение идёт без приведения к началу дня
Одна строка на календарный день
Несколько строк на день — группировка идёт по полной дате с временем
Обрабатывается отдельным условием
Пустые даты смешиваются с реальными или дают неожиданные строки
Часто задаваемые вопросы
Чем НАЧАЛОПЕРИОДА отличается от КОНЕЦПЕРИОДА?
Первая функция возвращает начало указанного периода (для дня — 00:00:00), вторая — конец (для дня — 23:59:59). Для отсечения времени используется НАЧАЛОПЕРИОДА, а КОНЕЦПЕРИОДА нужна для построения включительных интервалов «по день».
Можно ли хранить в реквизите действительно только дату без времени?
Физически тип «Дата» всегда содержит время. Состав даты «Дата» в свойствах реквизита ограничивает ввод и отображение, а время при этом остаётся равным 00:00:00 — для большинства задач этого достаточно.
Как сравнить две даты без учёта времени в коде?
Приведите обе к началу дня: НачалоДня(Дата1) = НачалоДня(Дата2). Если нужно сравнение «раньше/позже» по календарным дням, используйте те же приведённые значения с операторами < и >.
Почему отбор в динамическом списке по конкретному дню ничего не находит?
Скорее всего, в параметр передано начало дня (00:00:00), а условие стоит на равенство с полной датой документа. Замените условие на интервал от начала до конца дня либо на равенство по НАЧАЛОПЕРИОДА(Дата, ДЕНЬ).
Работает ли НачалоДня() в тонком клиенте и на сервере?
Да, функции НачалоДня() и КонецДня() доступны во всех контекстах исполнения встроенного языка. Но внутри текста запроса они не работают — там используется НАЧАЛОПЕРИОДА.
Что важно запомнить
Время в дате 1С отсекается двумя способами: НАЧАЛОПЕРИОДА(Поле, ДЕНЬ) в запросах и НачалоДня() в коде. Для фильтрации по дню на больших таблицах сравнивайте с границами интервала, а Формат() применяйте только для вывода пользователю.