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

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

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

Как указать пустую дату в запросе 1С через ДАТАВРЕМЯ(1,1,1), проверить на пустоту, сравнить с параметром. Примеры кода, ошибки и FAQ.

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

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

Что такое пустая дата в 1С и как она хранится

В платформе 1С:Предприятие у типа «Дата» нет отдельного «незаполненного» состояния, как NULL в классических СУБД. Вместо этого используется значение по умолчанию — 1 января 0001 года, 0 часов 0 минут 0 секунд. Если пользователь не заполнил поле даты, в базе физически хранится именно эта отметка времени.

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

Литерал ДАТАВРЕМЯ(1,1,1) — основной способ

Прямо в тексте запроса пустая дата записывается так:

ВЫБРАТЬ

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

Заказ.ДатаОтгрузки

ИЗ

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

ГДЕ

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

Такой запрос вернёт все заказы, у которых дата отгрузки не заполнена. Обратное условие — отобрать только заполненные даты — записывается через неравенство или сравнение «больше»:

ГДЕ

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

Литерал ДАТАВРЕМЯ допускает и полную форму с временем: ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0). Оба варианта эквивалентны, поскольку незаполненная дата всегда имеет нулевое время.

Проверка на пустую дату в условиях и в ЕСТЬ NULL

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

Надёжный шаблон, покрывающий оба случая, выглядит так:

ГДЕ

Оплата.Дата ЕСТЬ NULL

ИЛИ Оплата.Дата = ДАТАВРЕМЯ(1, 1, 1)

Если нужно вывести в отчёт вместо пустой даты понятное представление, используйте конструкцию ВЫБОР:

ВЫБОР

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

ТОГДА "Не указана"

ИНАЧЕ """"

КОНЕЦ КАК Комментарий

Передача пустой даты через параметр запроса

Когда условие формируется динамически, пустую дату удобнее передавать параметром. Во встроенном языке пустая дата создаётся литералом '00010101' или конструктором Дата(1,1,1):

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

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

| Заказ.ДатаОтгрузки = &ПустаяДата";

Запрос.УстановитьПараметр("ПустаяДата", Дата(1, 1, 1));

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

Также корректно сработает присваивание Запрос.УстановитьПараметр("ПустаяДата", '00010101'); — строковый литерал даты платформа автоматически преобразует в тип «Дата». Передавать параметр как строку "01.01.0001" или пустую строку нельзя: тип не совпадёт, и сравнение даст пустой результат либо ошибку.

Порядок действий
  1. 1
    Определите, где нужна пустая дата: прямо в тексте запроса или через параметр
  2. 2
    Для текста запроса напишите условие Реквизит = ДАТАВРЕМЯ(1, 1, 1)
  3. 3
    Для параметра передайте значение Дата(1,1,1) или '00010101' через УстановитьПараметр
  4. 4
    Выполните запрос в консоли запросов и проверьте, что отобрались записи с незаполненной датой
  5. 5
    Если используется соединение таблиц, добавьте проверку ЕСТЬ NULL для отсутствующих строк

Пустая дата в СКД и в консоли запросов

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

Если отчёт на СКД должен реагировать на незаполненный параметр периода, типовой приём — сравнение параметра с пустой датой в условии:

ГДЕ

(&Период = ДАТАВРЕМЯ(1, 1, 1)

ИЛИ Документ.Дата >= &Период)

Такое условие означает: если период не задан, отбор по дате не применяется. В консоли запросов пустая дата вводится в таблице параметров с типом «Дата» и значением 01.01.0001.

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

ДАТАВРЕМЯ(1,1,1) в тексте запроса

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

Параметр со значением Дата(1,1,1)

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

Проверка ЕСТЬ NULL

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

Типичные ошибки и как их избежать

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

Вторая ошибка — передача в параметр строки или числа вместо даты. Из-за несовпадения типов СУБД может не использовать индекс и вернуть неверный результат. Третья — попытка сравнить дату документа с пустой датой, когда реквизит имеет составной тип (например, «Дата или строка»): тогда часть значений хранится как строки и сравнение не сработает без приведения типов.

Типичные ошибки
01
Сравнение Реквизит = NULL вместо ДАТАВРЕМЯ(1,1,1) — условие никогда не срабатывает
02
Передача в параметр пустой строки вместо Дата(1,1,1) — несовпадение типов и пустой результат
03
Игнорирование NULL при соединениях — часть документов без связанных записей выпадает из отбора
04
Сравнение даты со временем без учёта времени: ДАТАВРЕМЯ(1,1,1,0,0,0) и ДАТАВРЕМЯ(1,1,1) равны, но реквизит с незаполненной датой всегда имеет нулевое время

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

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

ВЫБОР

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

ТОГДА ИСТИНА

ИНАЧЕ ЛОЖЬ

КОНЕЦ КАК ДатаПустая

Если поле «ДатаПустая» показывает ИСТИНА для записей, где дата визуально не заполнена, условие корректно. Если запрос возвращает пустой результат, хотя незаполненные даты в базе точно есть, проверьте тип реквизита в конфигураторе: возможно, это строка или составной тип, а не дата.

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

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

Запрос с условием = ДАТАВРЕМЯ(1,1,1)
Норма

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

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

Пустой результат при наличии таких записей — проверьте тип реквизита

Вычисляемое поле-признак пустой даты
Норма

ИСТИНА соответствует пустым датам в выборке

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

Везде ЛОЖЬ — значение хранится иначе или реквизит составного типа

Соединение таблиц
Норма

Учтены и NULL, и пустая дата через ИЛИ

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

Часть документов без связанных строк теряется

Итог

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

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

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

Чем пустая дата отличается от NULL в запросе 1С?

Пустая дата — это конкретное значение 01.01.0001 00:00:00, которое хранится в заполненном реквизите типа «Дата». NULL возникает только при соединениях таблиц, когда строки нет вовсе. Проверяются они по-разному: пустая дата — через сравнение с ДАТАВРЕМЯ(1,1,1), NULL — через оператор ЕСТЬ NULL.

Можно ли написать ДАТАВРЕМЯ(0,0,0) вместо ДАТАВРЕМЯ(1,1,1)?

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

Как отобрать документы, где дата заполнена?

Используйте условие Реквизит <> ДАТАВРЕМЯ(1,1,1) или Реквизит > ДАТАВРЕМЯ(1,1,1). Оба варианта вернут записи, где дата указана. Если поле может быть NULL из-за соединения, добавьте условие НЕ Реквизит ЕСТЬ NULL.

Как передать пустую дату в параметр виртуальной таблицы регистра?

Так же, как в обычный параметр: через Запрос.УстановитьПараметр со значением Дата(1,1,1) или '00010101'. Для параметров периода виртуальных таблиц пустая дата обычно означает отсутствие ограничения по периоду.

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

Чаще всего реквизит имеет составной тип или тип «Строка», а не «Дата» — тогда пустое значение хранится как пустая строка. Проверьте тип реквизита в конфигураторе и при необходимости используйте сравнение с пустой строкой или приведение типа через ВЫРАЗИТЬ.

Работает ли ДАТАВРЕМЯ(1,1,1) в СКД и в расширении запроса?

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