Разработка и Конфигурация · 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Определите, какие границы нужны: конкретные даты или начало/конец периода.
- 2Добавьте в текст запроса параметры &НачалоПериода и &КонецПериода с условием МЕЖДУ.
- 3В коде передайте значения типа Дата через УстановитьПараметр, при необходимости применив НачалоДня() и КонецДня().
- 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.
Проверка результата и отладка
После написания запроса проверьте его в консоли запросов: большинство типовых конфигураций и инструментов разработчика позволяют выполнить запрос интерактивно и увидеть переданные параметры. Убедитесь, что граничные документы — первый и последний в периоде — попадают в выборку.
Если выборка пуста, первым делом проверьте тип и значение параметра. Выведите его в сообщение перед выполнением: Сообщить(ПараметрДата) покажет и дату, и время. Частая ситуация — в параметре начало дня, а документы проведены в течение дня, поэтому условие «МЕЖДУ &Начало И &Конец» фактически охватывает одну секунду.
Как проверить результат
Тип «Дата», значение содержит нужное время
Строка или дата без учёта времени
Первый и последний документы периода в выборке
Граничные документы отсутствуют
Совпадают с отчётом по регистру на конец дня
Расхождение на сумму дневных движений
Частые вопросы
Как передать в запрос только дату без времени?
Тип «Дата» в 1С всегда содержит время. Чтобы «обрезать» время, используйте НачалоДня(Дата) в коде или НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) в тексте запроса. Для вывода даты без времени в результате применяйте форматирование при выводе, а не в запросе.
Можно ли написать дату строкой прямо в запросе, как в SQL?
Нет. Язык запросов 1С не преобразует строки в даты неявно. Единственный способ задать дату прямо в тексте — литерал ДАТАВРЕМЯ(год, месяц, день, часы, минуты, секунды).
Почему условие "Дата = &Дата" не находит документ?
Почти всегда причина во времени: документ проведён, например, в 14:25:31, а в параметре передано начало дня 00:00:00. Используйте диапазон МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата, ДЕНЬ) вместо точного равенства.
Как получить остатки на конкретный документ?
Создайте объект Граница: Новый Граница(Документ.МоментВремени(), ВидГраницы.Включая) и передайте его в параметр виртуальной таблицы остатков. Тогда движения самого документа будут учтены в остатках.
Чем отличается ТекущаяДата() от ТекущаяДатаСеанса()?
ТекущаяДата() возвращает дату компьютера, на котором выполняется код, а ТекущаяДатаСеанса() — дату сервера с учётом часового пояса сеанса. В клиент-серверном режиме для запросов рекомендуется ТекущаяДатаСеанса(), чтобы избежать расхождений между клиентом и сервером.
Как сравнить только даты, игнорируя время, для группировки по дням?
Используйте НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) в полях выборки и группируйте по этому выражению. Все документы одного дня попадут в одну группу независимо от времени проведения.
Что важно запомнить
Передавайте даты в запрос параметрами типа «Дата», для фиксированных границ используйте литерал ДАТАВРЕМЯ, а для периодов — НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА. Виртуальные таблицы фильтруйте через их параметры, а не через ГДЕ. Помните, что сравнение на равенство с датой без времени почти всегда является ошибкой.