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

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

Как указать дату в запросе 1С

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

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

Чаще всего проблемы возникают из-за трёх причин: передачи даты в неправильном формате, сравнения даты со временем без учёта секунд и попытки использовать строковое представление вместо типа «Дата». Ниже разобраны все рабочие способы указать дату в запросе, с примерами кода и типичными ошибками.

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

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

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

Сравнение способов

Параметр запроса

Универсальный вариант для любых дат из кода. Требует вызова УстановитьПараметр перед выполнением.

Литерал ДАТАВРЕМЯ

Только для постоянных дат, зашитых в текст запроса. Нельзя подставить переменную.

НАЧАЛОПЕРИОДА / КОНЕЦПЕРИОДА

Для округления даты до границы периода. Работает только с полями и параметрами типа Дата.

Как передать дату через параметр запроса

Параметр в тексте запроса обозначается символом «&» перед именем. Значение присваивается в коде до вызова метода Выполнить. Тип значения должен быть «Дата» — строка вида "15.01.2026" не будет автоматически преобразована.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| РеализацияТоваровУслуг.Ссылка,

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

|ИЗ

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

|ГДЕ

| РеализацияТоваровУслуг.Дата >= &НачалоПериода";

Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ТекущаяДатаСеанса()));

Результат = Запрос.Выполнить();

Если нужно получить дату из строки, используйте функцию Дата() встроенного языка: она принимает строку в формате «ГГГГММДДччммсс» или отдельные числовые аргументы. Передавать в параметр строку «15.01.2026» нельзя — сравнение с полем типа «Дата» не сработает или выдаст ошибку несоответствия типов.

Литерал ДАТАВРЕМЯ в тексте запроса

Литерал ДАТАВРЕМЯ записывается в тексте запроса в формате ДАТАВРЕМЯ(Год, Месяц, День, Час, Минута, Секунда). Время можно опустить — тогда оно будет равно 00:00:00. Это удобно для постоянных границ, например «все документы с начала 2020 года».

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

Заказ.Дата >= ДАТАВРЕМЯ(2020, 1, 1)

Ограничение литерала очевидно: в него нельзя подставить переменную или выражение. Если дата вычисляется в коде, используйте параметр. Также помните, что ДАТАВРЕМЯ(2026, 1, 15) — это начало дня 15 января, то есть документы, проведённые 15-го числа в 10:30, условию «Дата = ДАТАВРЕМЯ(2026, 1, 15)» не удовлетворяют.

Функции НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА

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

ВЫБРАТЬ

ПлатежноеПоручение.Ссылка

ИЗ

Документ.ПлатежноеПоручение КАК ПлатежноеПоручение

ГДЕ

ПлатежноеПоручение.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ)

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

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

Порядок действий для фильтрации за период
  1. 1
    Определите, какие границы нужны: конкретные даты или начало/конец периода.
  2. 2
    Добавьте в текст запроса параметры &НачалоПериода и &КонецПериода с условием МЕЖДУ.
  3. 3
    В коде передайте значения типа Дата через УстановитьПараметр, при необходимости применив НачалоДня() и КонецДня().
  4. 4
    Выполните запрос и проверьте, что в выборку попали документы на границах периода.

Дата в виртуальных таблицах регистров

Виртуальные таблицы регистров накопления и сведений принимают дату как параметр самой таблицы, а не в секции ГДЕ. Например, остатки на конкретный момент получают через параметр Период в скобках после имени таблицы. Это важно для производительности: фильтрация в параметрах виртуальной таблицы выполняется до соединения, а не после.

ВЫБРАТЬ

Остатки.Номенклатура,

Остатки.КоличествоОстаток

ИЗ

РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков, ) КАК Остатки

Тонкость: остатки «на дату» физически хранятся на начало секунды. Если передать 15.01.2026 00:00:00, документы, проведённые 15 января днём, в остатки не попадут. Для получения остатков на конец дня используйте КонецДня(Дата) в коде или конструкцию с границей — объект Граница с видом «Включая», если нужно учесть движения конкретного документа.

Пустая дата и проверка на незаполненность

Пустая дата в 1С — это 01.01.0001 00:00:00. В запросе она сравнивается с литералом ДАТАВРЕМЯ(1, 1, 1). Типичная задача — найти документы, где реквизит даты не заполнен, например дата оплаты или отгрузки.

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

Заказ.ДатаОтгрузки = ДАТАВРЕМЯ(1, 1, 1)

Обратный случай — проверка «дата заполнена»: условие ДатаОтгрузки <> ДАТАВРЕМЯ(1, 1, 1). Помните, что NULL и пустая дата — разные вещи: NULL возникает при соединениях, когда записи не нашлось, и сравнение с ДАТАВРЕМЯ(1, 1, 1) для NULL вернёт не ИСТИНА, а NULL. Для таких случаев применяйте ЕСТЬ NULL или функцию ЕСТЬNULL.

Типичные ошибки
01
Передача строки "15.01.2026" в параметр вместо значения типа Дата — сравнение не сработает.
02
Сравнение даты документа на равенство с началом дня: документы со временем 10:30 не попадут в выборку.
03
Остатки на начало дня вместо конца дня — дневные движения теряются.
04
Забытый вызов УстановитьПараметр — запрос падает с ошибкой о незаполненном параметре.
05
Фильтрация виртуальной таблицы через ГДЕ вместо параметров — лишняя нагрузка на СУБД.

Проверка результата и отладка

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

Если выборка пуста, первым делом проверьте тип и значение параметра. Выведите его в сообщение перед выполнением: Сообщить(ПараметрДата) покажет и дату, и время. Частая ситуация — в параметре начало дня, а документы проведены в течение дня, поэтому условие «МЕЖДУ &Начало И &Конец» фактически охватывает одну секунду.

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

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

Тип значения параметра
Норма

Тип «Дата», значение содержит нужное время

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

Строка или дата без учёта времени

Границы периода
Норма

Первый и последний документы периода в выборке

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

Граничные документы отсутствуют

Остатки на дату
Норма

Совпадают с отчётом по регистру на конец дня

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

Расхождение на сумму дневных движений

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

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

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

Можно ли написать дату строкой прямо в запросе, как в SQL?

Нет. Язык запросов 1С не преобразует строки в даты неявно. Единственный способ задать дату прямо в тексте — литерал ДАТАВРЕМЯ(год, месяц, день, часы, минуты, секунды).

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

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

Как получить остатки на конкретный документ?

Создайте объект Граница: Новый Граница(Документ.МоментВремени(), ВидГраницы.Включая) и передайте его в параметр виртуальной таблицы остатков. Тогда движения самого документа будут учтены в остатках.

Чем отличается ТекущаяДата() от ТекущаяДатаСеанса()?

ТекущаяДата() возвращает дату компьютера, на котором выполняется код, а ТекущаяДатаСеанса() — дату сервера с учётом часового пояса сеанса. В клиент-серверном режиме для запросов рекомендуется ТекущаяДатаСеанса(), чтобы избежать расхождений между клиентом и сервером.

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

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

Итог

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

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