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

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

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

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

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

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

Как записать дату литералом через ДАТАВРЕМЯ

В языке запросов нельзя написать дату в кавычках, как строку — конструкция вида ГДЕ Документ.Дата = "15.01.2026" вызовет ошибку. Для фиксированной даты используется функция ДАТАВРЕМЯ, которая принимает числовые аргументы: год, месяц, день, а затем необязательные час, минута и секунда.

ГДЕ РеализацияТоваров.Дата >= ДАТАВРЕМЯ(2026, 1, 1, 0, 0, 0)

Если время не указано, оно считается равным 00:00:00. Это важно: условие Дата <= ДАТАВРЕМЯ(2026, 1, 15) отберёт документы только до начала 15 января, а все документы, проведённые в течение 15 января, в выборку не попадут. Чтобы включить весь день, либо указывайте 23:59:59, либо используйте функцию КОНЕЦПЕРИОДА.

Месяц и день пишутся числами без ведущего нуля, допустимы оба варианта: ДАТАВРЕМЯ(2026, 1, 5) и ДАТАВРЕМЯ(2026, 01, 05) эквивалентны. Год указывается полностью, четырьмя цифрами.

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

Когда дата вычисляется в коде — например, выбрана пользователем в отчёте — её передают через параметр. В тексте запроса параметр начинается с символа амперсанда, а значение устанавливается методом УстановитьПараметр.

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

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

| РеализацияТоваров.Дата МЕЖДУ &НачалоПериода И &КонецПериода";

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

Запрос.УстановитьПараметр("КонецПериода", КонецДня(ДатаОкончания));

Обратите внимание на функции НачалоДня() и КонецДня() встроенного языка: они приводят дату к 00:00:00 и 23:59:59 соответственно. Если передать дату «как есть», в неё может оказаться текущее время, и границы периода сместятся — часть документов потеряется из выборки.

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

Порядок действий при передаче даты параметром
  1. 1
    Сформируйте значение даты во встроенном языке
  2. 2
    Приведите границы через НачалоДня() и КонецДня()
  3. 3
    Добавьте параметр с амперсандом в текст запроса
  4. 4
    Вызовите УстановитьПараметр с тем же именем
  5. 5
    Выполните запрос и проверьте число строк результата

Как задать пустую дату и проверить на неё

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

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

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

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

ДАТАВРЕМЯ(2026, 1, 15)

Константная дата, известная на момент написания запроса. Не подходит для динамических значений.

Параметр &Дата

Дата вычисляется в коде или выбирается пользователем. Универсальный вариант для отчётов и обработок.

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

Округление поля даты до границы дня, месяца, квартала, года. Нужна для группировок и сравнений без учёта времени.

ДОБАВИТЬКДАТЕ

Сдвиг даты на заданное число дней, месяцев и т.д. Используется для скользящих периодов.

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

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

ГДЕ НАЧАЛОПЕРИОДА(РеализацияТоваров.Дата, ДЕНЬ) = ДАТАВРЕМЯ(2026, 1, 15)

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

Для диапазонов надёжнее конструкция Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата2, ДЕНЬ) — она корректно включает обе граничные даты целиком, независимо от времени в параметрах.

Типичные ошибки
01
Сравнение даты документа на равенство без НАЧАЛОПЕРИОДА — выборка пустая, потому что время не совпадает
02
Верхняя граница ДАТАВРЕМЯ(год, месяц, день) без времени — весь последний день периода выпадает из выборки
03
Подстановка даты в текст запроса конкатенацией строк — ошибка формата при смене региональных настроек
04
Проверка необязательной даты на NULL вместо ДАТАВРЕМЯ(1,1,1) — незаполненные поля не находятся
05
Передача в параметр даты с текущим временем вместо НачалоДня/КонецДня — сдвиг границ периода

Как прибавить или вычесть время: ДОБАВИТЬКДАТЕ и РАЗНОСТЬДАТ

Для арифметики с датами в языке запросов есть две функции. ДОБАВИТЬКДАТЕ(Дата, ТипПериода, Количество) сдвигает дату вперёд или назад: ДОБАВИТЬКДАТЕ(&ТекущаяДата, ДЕНЬ, -7) вернёт дату неделю назад. Отрицательное количество работает как вычитание.

РАЗНОСТЬДАТ(Дата1, Дата2, ТипПериода) возвращает число — сколько единиц периода помещается между датами. Типичное применение — найти документы с истёкшим сроком оплаты: ГДЕ РАЗНОСТЬДАТ(Заказ.Дата, &ТекущаяДата, ДЕНЬ) > 14.

Учитывайте, что РАЗНОСТЬДАТ считает в целых единицах указанного периода: разница между 23:59 и 00:01 следующего дня в днях равна единице, хотя прошло две минуты. Для точных расчётов используйте более мелкий тип периода — часы или секунды.

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

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

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

Для таблицы Обороты параметры идут в порядке: начало периода, конец периода, периодичность, условие. СрезПоследних принимает период и условие. Если передать в параметр периода дату с временем, срез или остатки будут рассчитаны строго на этот момент — для отчётов «на конец дня» передавайте КонецДня(Дата) или границу периода.

Альтернатива — тип Граница во встроенном языке с видом «Включая» или «Исключая». Она важна для регистров, где несколько документов могут иметь одинаковую дату-время: граница «Исключая» отсекает движения самого граничного документа.

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

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

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

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

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

Документы после 00:00:00 последнего дня отсутствуют

Границы периода в консоли запросов
Норма

Начало 00:00:00, конец 23:59:59

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

В параметрах стоит текущее время

Пустые даты
Норма

Находятся условием = ДАТАВРЕМЯ(1,1,1)

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

Записи с незаполненной датой не попадают в результат

Как отладить запрос с датами

Быстрее всего проверить условия по датам в консоли запросов — внешней обработке, которая позволяет выполнить запрос с произвольными параметрами и посмотреть значения параметров до выполнения. Убедитесь, что параметры содержат ожидаемые дату и время, а затем поэтапно упрощайте условие ГДЕ, пока не найдёте отсекающий фрагмент.

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

Итог

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

Фиксированную дату пишите через ДАТАВРЕМЯ, вычисляемую — передавайте параметром с НачалоДня/КонецДня. Для сравнения по дню округляйте поле через НАЧАЛОПЕРИОДА, пустая дата — это ДАТАВРЕМЯ(1,1,1), а NULL проверяется отдельно.

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

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

В языке запросов нет функции «текущая дата». Получите её во встроенном языке функцией ТекущаяДатаСеанса() и передайте в запрос параметром. Использовать ТекущаяДата() в клиентском коде не рекомендуется — время клиента может отличаться от серверного.

Почему условие по дате не находит документы, хотя они есть?

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

Как отобрать документы за текущий месяц?

Передайте параметрами НачалоМесяца(ТекущаяДатаСеанса()) и КонецМесяца(ТекущаяДатаСеанса()) и используйте условие МЕЖДУ. Либо сравнивайте НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ) с НАЧАЛОПЕРИОДА(&ТекущаяДата, МЕСЯЦ).

Чем отличается период в СрезПоследних от обычного условия?

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

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

Нет, язык запросов не форматирует даты в строки. Получите дату в результате запроса и отформатируйте во встроенном языке функцией Формат(Дата, "ДЛФ=D") или в макете СКД через настройки оформления поля.

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

Выньте время через РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(Дата, ДЕНЬ), Дата, СЕКУНДА) — получите число секунд от начала дня, которое можно сравнивать с нужным порогом. Прямого типа «время» в запросах нет.