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

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

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

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

В языке запросов 1С значение типа «Дата» всегда содержит и дату, и время с точностью до секунды. Когда документ проведён в 14:35:27, его дата хранится именно с этим временем, и сравнение такой даты с константой вида «01.03.2026 0:00:00» даст «ложь», хотя календарный день совпадает. Из-за этого разработчику регулярно нужно «обрезать» время и работать только с календарной датой.

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

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

Как устроена дата в 1С и почему время мешает

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

Из-за этого типовые операции ломаются. Сравнение «ДатаДокумента = &Дата» не находит документы, проведённые в тот же день, но не в нулевую секунду. Группировка по полю «Дата» разваливает один календарный день на десятки строк — по одной на каждое уникальное время. Соединение таблиц по дате без приведения к началу дня даёт пустой результат, хотя данные визуально совпадают.

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

Функция НАЧАЛОПЕРИОДА: синтаксис и базовый пример

Функция принимает два параметра: выражение типа «Дата» и вид периода. Синтаксис: НАЧАЛОПЕРИОДА(<Дата>, <Период>). В качестве периода указывается одно из ключевых слов: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД. Для задачи «убрать время» нужен вариант ДЕНЬ.

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

ВЫБРАТЬ

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

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

ИЗ

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

В поле «ДатаБезВремени» для документа, проведённого 12.05.2026 в 14:35:27, окажется значение 12.05.2026 0:00:00. Обратите внимание: тип данных остаётся «Дата», время не удаляется физически — оно обнуляется. Это важно, потому что при выводе в отчёт поле всё равно может отображаться с «0:00:00», если не настроить формат.

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

Сравнение дат без учёта времени в условии ГДЕ

Самая частая практическая задача — отобрать документы за конкретный день. Наивный вариант ГДЕ Документ.Дата = &Дата работает только если параметр передан с тем же временем, что и у документа, чего на практике почти не бывает.

Правильные варианты два. Первый — привести дату документа к началу дня:

ВЫБРАТЬ

Заказ.Ссылка

ИЗ

Документ.ЗаказКлиента КАК Заказ

ГДЕ

НАЧАЛОПЕРИОДА(Заказ.Дата, ДЕНЬ) = НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ)

Второй — использовать интервал, который обычно эффективнее, потому что позволяет платформе задействовать индекс по полю «Дата»:

ГДЕ

Заказ.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ)

И КОНЕЦПЕРИОДА(&Дата, ДЕНЬ)

Функция КОНЕЦПЕРИОДА возвращает 23:59:59 указанного дня, поэтому интервал захватывает документы за весь календарный день. Если нужен полуинтервал без верхней границы, используют строгое сравнение: Заказ.Дата >= НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) И Заказ.Дата < ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ), ДЕНЬ, 1).

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

Вторая по частоте задача — свернуть обороты или документы по календарным дням. Если сгруппировать по сырому полю «Период», каждый документ с уникальным временем образует отдельную строку, и итог за день не получить.

Группировка по дате без времени выглядит так:

ВЫБРАТЬ

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

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

ИЗ

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

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

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

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

День

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

Альтернатива для оборотных регистров — виртуальные таблицы с параметром «Периодичность»: например, РегистрНакопления.Продажи.Обороты(&Начало, &Конец, День, ). Платформа сама сгруппирует обороты по дням, и дополнительно приводить период не нужно. Этот вариант часто проще и быстрее ручной группировки.

bsl
ВЫБРАТЬ НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ) КАК День, СУММА(Продажи.СуммаОборот) КАК Сумма ИЗ РегистрНакопления.Продажи.Обороты КАК Продажи СГРУППИРОВАТЬ ПО НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ)

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

Когда нужно связать две таблицы по календарному дню — например, документы и курсы валют, действующие на день документа, — прямое равенство дат не сработает из-за разного времени. Обе стороны соединения приводят к началу дня:

ВЫБРАТЬ

Док.Ссылка,

Движения.Сумма

ИЗ

Документ.Операция КАК Док

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Данные КАК Движения

ПО НАЧАЛОПЕРИОДА(Док.Дата, ДЕНЬ) = НАЧАЛОПЕРИОДА(Движения.Период, ДЕНЬ)

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

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

Отображение даты без времени: формат и представление

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

Корректный путь — задать формат на уровне компоновки. В СКД для поля на вкладке «Наборы данных» или в пользовательских настройках указывается форматная строка ДЛФ=D (краткая дата) или ДФ=dd.MM.yyyy. В динамических списках формат настраивается в свойствах колонки таблицы формы. В этом случае запрос можно вообще не менять — время обрежется только визуально.

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

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

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

Универсальный способ для сравнений, группировок и соединений. Минус: в условии ГДЕ слева от равенства теряется индекс.

Интервал МЕЖДУ НАЧАЛОПЕРИОДА И КОНЕЦПЕРИОДА

Оптимален для отбора документов за день: сохраняет использование индекса по полю Дата.

Виртуальная таблица с периодичностью День

Подходит для оборотов по дням без ручной группировки; работает только с регистрами, не с документами.

Форматная строка ДЛФ=D

Решает только визуальную задачу в отчётах и списках; на логику запроса не влияет.

Проверка результата и типичные ошибки

Проверить, что время действительно обрезано, проще всего в консоли запросов: выполните запрос и посмотрите значение поля. Корректный результат — дата вида «12.05.2026 0:00:00». Если время отлично от нуля, функция не применилась к тому полю или применена не к тому выражению.

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

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

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

Значение поля после НАЧАЛОПЕРИОДА
Норма

Время равно 0:00:00

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

Время отлично от нуля — функция применена не к тому полю

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

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

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

Попадают только документы с нулевым временем

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

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

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

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

Скорость запроса на больших данных
Норма

Отбор через интервал МЕЖДУ выполняется быстро

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

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

FAQ

Можно ли убрать время из даты без НАЧАЛОПЕРИОДА?

Для отбора за день — да: используйте интервал вида Дата МЕЖДУ началом и концом дня или сравнение с полуинтервалом. Для группировки оборотов — примените виртуальную таблицу с периодичностью «День». Для вывода на экран достаточно форматной строки ДЛФ=D. Но универсальным инструментом остаётся именно НАЧАЛОПЕРИОДА.

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

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

Почему после НАЧАЛОПЕРИОДА в отчёте всё равно видно «0:00:00»?

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

Работает ли НАЧАЛОПЕРИОДА в параметрах виртуальных таблиц?

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

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

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

Как сравнить только даты без времени в коде, а не в запросе?

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

Итог

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

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