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