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