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

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

Как в запросе 1С вывести дату без времени

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

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

Задача возникает постоянно: сгруппировать документы по дням, сравнить дату документа с датой без учёта времени, вывести в отчёт колонку без «0:00:00». Если не обрезать время, группировка разваливается на отдельные строки для каждой секунды, а сравнение Дата = &Дата перестаёт находить документы, проведённые в середине дня.

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

Почему в запросе 1С нельзя просто «отрезать» время

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

Поэтому «вывести дату без времени» означает одно из двух действий. Первое — привести значение к началу суток, чтобы время стало 00:00:00 и перестало влиять на группировки и сравнения. Второе — оставить значение как есть, но отформатировать его при выводе так, чтобы время не отображалось. Это разные задачи, и путать их — частая причина ошибок.

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

Основной способ: функция НАЧАЛОПЕРИОДА с периодом ДЕНЬ

Функция вызывается с двумя аргументами: выражение типа «Дата» и тип периода. Для обрезки времени период — ДЕНЬ. Результат можно выводить в поле, использовать в группировке, соединениях и условиях.

ВЫБРАТЬ

НАЧАЛОПЕРИОДА(РеализацияТоваровУслуг.Дата, ДЕНЬ) КАК День,

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

ИЗ

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

ГДЕ

РеализацияТоваровУслуг.Проведен

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

НАЧАЛОПЕРИОДА(РеализацияТоваровУслуг.Дата, ДЕНЬ)

УПОРЯДОЧИТЬ ПО

День

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

Тот же приём работает для других периодов: НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ) даст первое число месяца, НАЧАЛОПЕРИОДА(Дата, НЕДЕЛЯ) — понедельник соответствующей недели. Это удобно для отчётов с детализацией по месяцам или неделям.

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

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

Вторая типовая задача — выбрать документы за один день, когда в параметр передаётся дата без времени. Условие Дата = &Дата не сработает: у документов время отличается от 00:00:00, и равенство не выполнится. Правильный вариант — диапазон от начала до конца дня.

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

РеализацияТоваровУслуг.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата, ДЕНЬ)

Функция КОНЕЦПЕРИОДА возвращает последнюю секунду периода — 23:59:59 для дня. Пара НАЧАЛОПЕРИОДА ... КОНЕЦПЕРИОДА надёжно охватывает весь день независимо от времени документов.

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

Сравнение вариантов отбора за день

Дата МЕЖДУ НАЧАЛОПЕРИОДА И КОНЕЦПЕРИОДА

Рекомендуемый вариант: условие накладывается на само поле, может использоваться индекс, работает быстро на больших таблицах.

НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) = &ДатаБезВремени

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

Дата = &Дата

Работает только если время документа в точности равно времени параметра. Для реальных документов почти всегда даёт пустой результат — так писать не следует.

Форматирование даты при выводе в отчёт

Если время в данных не мешает логике, а нужно только убрать «0:00:00» из отображения, запрос менять не обязательно. В СКД для поля можно задать формат на закладке «Наборы данных» (колонка «Оформление»/параметры поля) или через настройки: форматная строка ДФ=dd.MM.yyyy выведет только дату.

При обработке результата запроса в коде используется функция Формат():

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

СтрокаДаты = Формат(Выборка.Дата, "ДЛФ=D"); // "15.03.2026"

// или Формат(Выборка.Дата, "ДФ='dd.MM.yyyy'")

КонецЦикла;

Важно понимать: Формат() возвращает строку, а не дату. Если результат потом нужно сравнивать, сортировать как даты или передавать в другой запрос, форматировать следует в самый последний момент — непосредственно перед выводом пользователю.

Соединение таблиц по дате без времени

При соединении таблиц по датам (например, продажи с курсами валют, действующими на день) время тоже мешает: совпадений по полному значению даты-времени практически нет. Решение — привести обе стороны к началу дня в условии соединения.

ВЫБРАТЬ

Продажи.Номенклатура КАК Номенклатура,

Продажи.Количество КАК Количество

ИЗ

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

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК Курсы

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

Такое соединение корректно с точки зрения логики, но тяжёлое для СУБД: функции над полями в условии связи не дают использовать индексы. На больших регистрах лучше сначала собрать во временную таблицу нужный диапазон с уже приведёнными датами, а соединение выполнять по ней.

Порядок действий для отчёта по дням
  1. 1
    Определите, что нужно: изменить логику (группировка, отбор) или только внешний вид колонки.
  2. 2
    Для логики добавьте в запрос НАЧАЛОПЕРИОДА(Поле, ДЕНЬ) и используйте его в группировке или условии МЕЖДУ.
  3. 3
    Для внешнего вида задайте формат ДФ=dd.MM.yyyy в СКД или примените Формат() при выводе.
  4. 4
    Проверьте результат на дне, где есть документы с разным временем: они должны попасть в одну строку итога.

Типичные ошибки и как их распознать

Самая частая ошибка — сравнение даты документа с параметром на равенство. Запрос выполняется без ошибок, но возвращает пустой результат, потому что время документа не равно 00:00:00. Признак: запрос «не видит» документы, которые точно существуют за нужный день.

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

Третья группа ошибок связана с границами периода: использование <= &Дата вместо КОНЕЦПЕРИОДА отсекает все документы последнего дня после 00:00:00. Симметрично, ручное добавление 86399 секунд к дате через ДОБАВИТЬКДАТЕ работает, но менее читаемо, чем КОНЕЦПЕРИОДА, и легче приводит к ошибкам при правках.

Типичные ошибки
01
Условие Дата = &Дата — документы с ненулевым временем не попадают в выборку, запрос возвращает пустоту.
02
Группировка по полю Дата вместо НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) — итоги по дням дробятся на строки по секундам.
03
Верхняя граница &lt;= &Дата вместо КОНЕЦПЕРИОДА(&Дата, ДЕНЬ) — теряются все документы последнего дня, кроме проведённых ровно в полночь.
04
Форматирование даты функцией Формат() до сортировки или сравнения — строки сортируются как текст, а не как даты.

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

Проверить корректность просто: выберите день, в котором есть несколько документов с разным временем, и выполните запрос в консоли запросов. При группировке по НАЧАЛОПЕРИОДА должна получиться одна строка на день с корректной суммой. При отборе через МЕЖДУ — все документы дня, включая проведённые в 23:59.

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

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

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

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

Группировка по дням
Норма

Одна строка на календарный день, суммы сходятся с итогом за период

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

Несколько строк с одинаковой датой, но разным временем

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

В выборке все документы дня, включая вечерние

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

Документы после 00:00:00 нужной даты отсутствуют

Отображение в отчёте
Норма

Колонка показывает дату в нужном формате

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

После значения выводится 0:00:00

Итог

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

Дата без времени в запросе 1С — это НАЧАЛОПЕРИОДА(Дата, ДЕНЬ). Отбор за день делайте через МЕЖДУ НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА, а не через равенство. Для отображения без времени используйте форматирование в СКД или Формат(), не смешивая его с логикой запроса.

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

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

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

Почему условие Дата = &Дата не находит документы?

Потому что у реальных документов время обычно отлично от 00:00:00, а равенство проверяется с точностью до секунды. Используйте диапазон: Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата, ДЕНЬ).

Как убрать «0:00:00» в колонке отчёта на СКД?

Задайте для поля форматную строку, например ДФ=dd.MM.yyyy, в настройках поля набора данных или в пользовательских настройках оформления. Сам запрос и значение поля при этом менять не нужно.

Что быстрее: МЕЖДУ с НАЧАЛОПЕРИОДА или сравнение приведённых дат?

Вариант с МЕЖДУ по полю таблицы обычно быстрее, поскольку условие накладывается на само поле и может использовать индекс. Применение функции к полю в условии заставляет обрабатывать каждую строку и мешает индексному доступу.

Как сгруппировать данные по месяцам, а не по дням?

Тем же приёмом: НАЧАЛОПЕРИОДА(Поле, МЕСЯЦ) вернёт первое число месяца, и группировка по этому выражению даст одну строку на месяц. Аналогично работают периоды НЕДЕЛЯ, КВАРТАЛ и ГОД.

Можно ли обрезать время функцией ДОБАВИТЬКДАТЕ или РАЗНОСТЬДАТ?

Технически можно собрать дату из частей через ГОД, МЕСЯЦ, ДЕНЬ и функцию ДАТАВРЕМЯ, но это громоздко и не даёт преимуществ. НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) — стандартный и самый читаемый способ.