
В запросах 1С часто требуется указать дату, которая будет интерпретироваться как «пустая». Внутри платформы для этого используется специальное значение – Неопределено или Дата(0001,01,01), в зависимости от контекста. Неправильная передача значения может привести к некорректной выборке данных или ошибкам выполнения запроса.
В текстах запросов можно применять функцию ЗНАЧЕНИЕ(ДАТАВРЕМЯ(…)), чтобы явно задать минимальную дату. Например: ЗНАЧЕНИЕ(ДАТАВРЕМЯ(0001,1,1)) создаёт корректный маркер «пустой даты». Важно учитывать, что для сравнения в условиях WHERE нужно использовать оператор РАВНО или НЕ РАВНО с этим значением, чтобы отбор сработал корректно.
Для оптимизации рекомендуется сравнивать дату не с литералом, а с параметром запроса. Параметр можно заранее установить в коде как Дата(0001,01,01). Такой подход снижает нагрузку на сервер запросов и повышает читаемость кода.
Если выборка данных должна учитывать как заполненные, так и пустые даты, полезно комбинировать проверку с условием ИЛИ Дата ЕСТЬ NULL. Это позволяет корректно обработать ситуации, когда в базе встречаются NULL-значения вместо минимальной даты.
Как задать пустую дату в запросе 1С
В 1С пустая дата представляется как Дата(0001,01,01). При формировании запроса важно явно сравнивать поле с этой константой, иначе результат будет некорректным.
- Для отбора записей без даты используйте условие:
ГДЕ Таблица.Дата = ДАТАВРЕМЯ(0001, 1, 1) - Чтобы исключить пустые даты:
ГДЕ Таблица.Дата <> ДАТАВРЕМЯ(0001, 1, 1) - В параметрах запроса можно задать значение пустой даты:
Запрос.УстановитьПараметр("ПустаяДата", Дата("00010101"));
Если используется СКД, рекомендуется в источнике данных применять выражение ЕСТЬNULL(Таблица.Дата, ДАТАВРЕМЯ(0001,1,1)), чтобы избежать ошибок при сравнении.
Для гибкой фильтрации удобно проверять заполненность даты функцией НЕЗАПОЛНЕНО() в модуле, передавая результат как параметр в запрос:
- В модуле:
Запрос.УстановитьПараметр("ДатаПуста", НЕЗАПОЛНЕНО(ПеременнаяДата)); - В тексте запроса:
ГДЕ (&ДатаПуста И Таблица.Дата = ДАТАВРЕМЯ(0001,1,1))
ИЛИ (НЕ &ДатаПуста И Таблица.Дата = &ПеременнаяДата)
Такой подход позволяет гибко формировать выборку, учитывая возможность пустого значения без изменения текста запроса.
Что считается пустой датой в 1С и как она хранится

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

В языке запросов 1С пустая дата задаётся как ДатаВремя(0001, 01, 01). Это единственный корректный способ указать значение, эквивалентное отсутствию даты.
Пример условия отбора: Где Документы.Дата = ДатаВремя(0001, 01, 01). Такой фильтр вернёт строки, в которых дата не заполнена.
Для сравнения дат используйте оператор = или НЕ РАВНО, так как NULL в 1С не применяется к датам. Ошибкой будет использование строковых значений вида '0001-01-01' или числовых выражений.
При вставке пустой даты в результат запроса используйте ВЫРАЗИТЬ(ДатаВремя(0001,01,01) КАК ДАТА), чтобы обеспечить корректное приведение типов.
Оптимально выносить выражение ДатаВремя(0001,01,01) в параметр запроса для повышения читаемости и облегчения поддержки кода.
Пример фильтрации записей по пустой дате
В запросах 1С пустая дата обозначается значением Дата(0001, 01, 01). Чтобы получить только записи без заполненной даты, используйте условие сравнения.
Пример запроса:
ВЫБРАТЬ
Документы.Ссылка,
Документы.ДатаЗаполнения
ИЗ
Справочник.Документы КАК Документы
ГДЕ
Документы.ДатаЗаполнения = ДАТАВРЕМЯ(0001, 1, 1, 0, 0, 0)
Такой фильтр вернет только те элементы, у которых поле ДатаЗаполнения не заполнено. Если требуется исключить пустые даты, используйте оператор <> вместо равенства.
При работе с виртуальными таблицами запросов также допустимо использовать функцию ПУСТАЯДАТА(), что упрощает чтение кода:
ГДЕ Документы.ДатаЗаполнения = ПУСТАЯДАТА()
Этот подход удобен при написании универсальных обработок, где важно быстро отобрать незаполненные значения без дополнительных проверок.
Сравнение пустой даты с конкретной датой в запросе

В 1С пустая дата представляется значением Дата('0001-01-01'). Для корректного сравнения в запросах необходимо учитывать, что обычные операторы равенства возвращают результат только при точном совпадении значений.
- Для проверки на пустую дату используйте конструкцию
Поле = Дата('0001-01-01'). - Чтобы исключить пустые даты при сравнении, применяйте условие
Поле <> Дата('0001-01-01'). - При сравнении с конкретной датой, например
Дата('2023-01-01'), используйте фильтр видаПоле = Дата('2023-01-01'), предварительно исключив пустые значения.
Рекомендуемый шаблон фильтрации:
ГДЕ
Поле <> Дата('0001-01-01')
И Поле >= Дата('2023-01-01')
Такой подход гарантирует, что выборка не будет содержать записей с незаполненной датой и корректно сравнит только актуальные значения.
Использование функции ПустаяДата() в выражениях
Функция ПустаяДата() возвращает значение типа «Дата», которое считается пустым. В запросах 1С она используется для фильтрации записей, где дата не задана, а также для сравнения с реальными значениями дат.
Пример использования в условии выборки:
ВЫБРАТЬ *
ИЗ Документ.Заказы КАК Заказы
ГДЕ Заказы.ДатаОтгрузки = ПустаяДата()
В этом запросе будут возвращены все заказы, у которых дата отгрузки не установлена. Если использовать NULL вместо ПустаяДата(), результат будет некорректным, так как в 1С NULL и пустая дата обрабатываются по-разному.
Функция полезна в выражениях с операторами выбора и в вычисляемых полях. Например, для замены пустой даты на текущую:
ВЫБРАТЬ
CASE WHEN Заказы.ДатаОплаты = ПустаяДата() THEN ТекущаяДата()
ELSE Заказы.ДатаОплаты END КАК ДатаОплатыОбработанная
ИЗ Документ.Заказы КАК Заказы
При объединении таблиц через JOIN также удобно проверять пустые даты:
ВЫБРАТЬ Заказы.Ссылка, Платежи.ДатаПлатежа
ИЗ Документ.Заказы КАК Заказы
ЛЕВОЕ СОЕДИНЕНИЕ Документ.Платежи КАК Платежи
ПО Заказы.Ссылка = Платежи.Заказ
И Платежи.ДатаПлатежа <> ПустаяДата()
| Сценарий | Рекомендация |
|---|---|
| Фильтрация по отсутствию даты | Использовать = ПустаяДата(), а не NULL |
| Подстановка текущей даты вместо пустой | Применять конструкцию CASE WHEN ... THEN ТекущаяДата() |
| Объединение таблиц с проверкой даты | Использовать условия <> ПустаяДата() в JOIN |
Функция ПустаяДата() работает только с полями типа «Дата», поэтому для строковых или числовых значений использовать её нельзя. При использовании в выражениях с датой и временем учитывается только дата, время приравнивается к 00:00:00.
Обработка пустых дат в условиях ИЛИ и И

В запросах 1С пустые даты представляются значением NULL. При использовании условий ИЛИ и И необходимо учитывать особенности обработки NULL, иначе фильтрация может работать некорректно.
Для условий ИЛИ логика должна проверять каждую ветку отдельно на NULL. Пример:
Где (ДатаДокумента = &ДатаИлиNull Или ДатаДокумента = &ДатаДругая). Если одна из переменных равна NULL, условие ИЛИ продолжит работать корректно, возвращая строки, где другая дата совпадает.
Для условий И проверка на NULL обязательна для каждой даты. Пример:
Где ДатаДокумента = &ДатаИлиNull И ДатаПланируемая = &ДатаПлан. Если &ДатаИлиNull равна NULL, строка не будет включена в результат, даже если &ДатаПлан совпадает. Чтобы включить пустые даты, добавляют явное условие:
Где (ДатаДокумента = &ДатаИлиNull Или ДатаДокумента Пустая()) И ДатаПланируемая = &ДатаПлан.
Для динамических фильтров рекомендуется использовать функцию Пустая() в комбинации с параметрами. Это позволяет однозначно обрабатывать NULL без ошибок сравнения и обеспечивает корректную работу как ИЛИ, так и И.
При объединении нескольких условий с разными датами лучше строить запрос с вложенными скобками, чтобы порядок обработки И и ИЛИ был явным. Пример:
Где ((ДатаДокумента = &Дата1 Или ДатаДокумента Пустая()) И (ДатаПланируемая = &Дата2 Или ДатаПланируемая Пустая())). Такой подход исключает пропуск строк из-за пустых дат.
Пустая дата в параметрах запроса из кода 1С
В 1С для передачи пустой даты в запрос используют значение ДатаНеопределена(). Оно эквивалентно SQL NULL и позволяет корректно фильтровать записи по необязательным датам.
Пример задания пустой даты в параметре запроса:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ * ИЗ Справочник.Номенклатура ГДЕ ДатаИзменения = &ДатаПараметр";
Запрос.УстановитьПараметр("ДатаПараметр", ДатаНеопределена());
Если использовать Неопределено вместо ДатаНеопределена(), запрос может работать некорректно, так как тип значения не будет соответствовать типу поля даты. Для фильтров с диапазоном лучше использовать проверку на пустую дату через конструкцию ЕСЛИ &ДатаПараметр = ДатаНеопределена() ТО....
В динамических запросах, где условие на дату зависит от значения параметра, рекомендуется формировать часть запроса через конкатенацию строки:
Условие = "1=1";
Если ПараметрДата <> ДатаНеопределена() Тогда
Условие = "ДатаИзменения = &ПараметрДата";
КонецЕсли;
Запрос.Текст = "ВЫБРАТЬ * ИЗ Справочник.Номенклатура ГДЕ " + Условие;
Использование ДатаНеопределена() обеспечивает правильную типизацию и предотвращает ошибки выполнения запроса при передаче пустых значений даты из кода 1С. Это особенно важно при массовых обновлениях данных и интеграции с внешними источниками, где даты могут быть не указаны.
Отладка запроса с условием на пустую дату
Для проверки работы запроса с условием на пустую дату используйте оператор `IS NULL` или сравнение с `ДАТА(0)`, в зависимости от версии 1С. Например, в запросе к справочнику «Контрагенты» условие `Где ДатаРегистрации IS NULL` вернет все записи без даты.
При отладке используйте режим «Выполнить запрос» в конфигураторе и внимательно проверяйте структуру выборки. Если пустая дата не возвращается, проверьте тип поля: у полей типа `Дата` пустое значение хранится как `NULL`, а у строковых представлений дат – как пустая строка.
Для пошаговой отладки добавляйте промежуточные поля в выборку: `Выбрать ДатаРегистрации, ?(ДатаРегистрации IS NULL, ‘Пусто’, ‘Есть дата’) КАК Статус`. Это позволяет увидеть, какие записи реально пустые, без необходимости анализа всего результата.
Используйте фильтр по диапазону дат вместе с условием на пустую дату: `Где (ДатаРегистрации IS NULL) ИЛИ (ДатаРегистрации МЕЖДУ &НачДата И &КонДата)`. Такой подход выявляет случаи, когда пустая дата смешана с диапазоном, что часто вызывает ошибки выборки.
При тестировании запросов с пустыми датами учитывайте, что некоторые методы объектов 1С автоматически заменяют `NULL` на текущую дату. Для проверки корректности используйте прямое выполнение SQL-запроса через механизм `Запрос.Выполнить().Выгрузить()`.
Если результаты запроса не совпадают с ожиданиями, создайте временный отчет с группировкой по дате и фильтром `IS NULL`. Это позволяет увидеть, сколько записей действительно не имеют даты, и избежать логических ошибок при дальнейшей обработке.
Вопрос-ответ:
Как в 1С задать условие, когда дата может быть пустой?
В 1С можно использовать специальное значение ПустаяДата(), которое позволяет задавать фильтр для полей типа Дата/Время, когда они могут быть не заполнены. В запросе это выглядит так: <условие>ДатаДокумента = &ПараметрДата ИЛИ &ПараметрДата = ПустаяДата()условие>. Таким образом, запрос корректно обработает как конкретную дату, так и случай, когда дата отсутствует.
Можно ли сравнивать дату с пустым значением в условиях отбора?
Да, сравнение возможно. Для этого используется функция ПустаяДата() либо проверка через ИЛИ с NULL. Например, можно написать условие WHERE ДатаДокумента = &Дата ИЛИ ДатаДокумента = ПустаяДата(). Это особенно полезно, если отчет должен выводить документы, где дата может быть не указана.
Как передавать пустую дату через параметры запроса в 1С?
При использовании параметров запроса можно присвоить переменной значение ПустаяДата(). Например, если у вас есть параметр &ДатаДок, то его можно установить так: ПараметрЗапроса.Установить(«ДатаДок», ПустаяДата()). После этого запрос будет корректно обрабатывать строки с отсутствующей датой, не вызывая ошибок.
Что делать, если нужно выбрать все записи, где дата не задана?
Для этого в запросе используют проверку на пустую дату. В тексте запроса пишется условие WHERE ДатаДокумента = ПустаяДата(). Это позволяет отобрать только те записи, у которых поле даты не заполнено. Если нужно сочетать с другими фильтрами, достаточно добавить логические операторы И или ИЛИ.
Есть ли особенности работы с пустыми датами в объединении нескольких таблиц?
Да, при объединении таблиц нужно учитывать, что ПустаяДата() не равна обычному NULL в базе. При объединении LEFT JOIN или INNER JOIN можно использовать конструкцию COALESCE(ДатаДокумента, ПустаяДата()), чтобы унифицировать пустые значения. Это позволяет корректно фильтровать и группировать данные даже при наличии незаполненных дат.
Как задать пустую дату в запросе 1С, чтобы отфильтровать записи без значения?
В 1С можно использовать конструкцию «Дата = Неопределено» в условиях запроса. Это позволит выбрать записи, у которых поле даты не заполнено. Например, в тексте запроса это будет выглядеть так: «Где Документ.Дата = Неопределено». Если нужно проверить несколько полей даты одновременно, можно использовать логическое ИЛИ: «Документ.Дата = Неопределено ИЛИ Документ.ДатаИсправления = Неопределено». При этом важно учитывать, что стандартные фильтры в интерфейсе 1С могут не распознавать «Неопределено» как значение даты, поэтому проверка через запрос более надёжна.
