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

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

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

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

Пустая дата в 1С — это не NULL и не строка «01.01.0001», а особое значение типа Дата, равное началу отсчёта календаря: 1 января 0001 года, 0 часов 0 минут 0 секунд. В языке запросов её нельзя записать литералом напрямую, поэтому разработчики регулярно сталкиваются с вопросом, как сравнить поле с пустой датой, подставить её в параметр виртуальной таблицы или вернуть её через ВЫБОР.

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

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

Что такое пустая дата в 1С

Значение «пустая дата» соответствует Дата(1, 1, 1, 0, 0, 0) — полуночи 1 января 0001 года. Именно такое значение получает реквизит типа Дата, если пользователь его не заполнил, и именно оно хранится в базе данных. Важно не путать его с NULL: NULL возникает только в результатах запросов при соединениях, когда у записи нет соответствия в присоединяемой таблице, и обрабатывается отдельно через ЕСТЬ NULL и ЕСТЬNULL().

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

Способ 1: функция ДАТАВРЕМЯ(1, 1, 1) в тексте запроса

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

Пример отбора документов, у которых не заполнена дата оплаты:

ВЫБРАТЬ

Реализация.Ссылка КАК Документ,

Реализация.ДатаОплаты КАК ДатаОплаты

ИЗ

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

ГДЕ

Реализация.ДатаОплаты = ДАТАВРЕМЯ(1, 1, 1)

Обратный случай — выбрать только заполненные даты:

ГДЕ

Реализация.ДатаОплаты > ДАТАВРЕМЯ(1, 1, 1)

Функцию можно использовать и в конструкции ВЫБОР, чтобы подставить пустую дату в результат запроса, и в секции ИМЕЮЩИЕ. Это делает её универсальным инструментом, не требующим подготовки параметров в коде модуля.

Способ 2: передача пустой даты через параметр

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

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

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

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

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

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

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

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

ДАТАВРЕМЯ(1, 1, 1) в тексте

Подходит для статических запросов и условий в СКД. Не требует кода в модуле, но значение жёстко зашито в текст.

Параметр Дата(1, 1, 1)

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

Пустая дата в ВЫБОР, объединениях и виртуальных таблицах

Подстановка пустой даты через ВЫБОР

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

ВЫБРАТЬ

ВЫБОР

КОГДА Заказ.Закрыт

ТОГДА ДАТАВРЕМЯ(1, 1, 1)

ИНАЧЕ Заказ.ДатаОтгрузки

КОНЕЦ КАК ДатаОтгрузки

ИЗ

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

Пустая дата в параметрах виртуальных таблиц

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

Отличие от NULL при соединениях

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

ГДЕ

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

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

Проверка результата и типичные ошибки

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

Частая ошибка — сравнение даты со строкой «01.01.0001» или попытка привести её через ВЫРАЗИТЬ к строке. Язык запросов не выполняет неявное сравнение даты со строкой, и запрос либо вернёт пустой результат, либо выдаст ошибку типов. Сравнивать нужно только дату с датой.

Типичные ошибки
01
Сравнение Поле = "01.01.0001" строкой — запрос не находит записи или падает с ошибкой несоответствия типов.
02
Смешение пустой даты и NULL при соединениях — записи без пары в правой таблице выпадают из выборки.
03
Использование >= ДАТАВРЕМЯ(1,1,1) для отбора заполненных дат — условие всегда истинно и бесполезно; нужно строгое сравнение > или <>.
04
Передача в параметр Неопределено вместо Дата(1,1,1) — сравнение с Неопределено не эквивалентно пустой дате.
Контрольные точки

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

Записи в выборке
Норма

У всех строк поле даты отображается пустым

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

Есть строки с заполненной датой — условие составлено неверно

Записи после левого соединения
Норма

NULL-значения обработаны через ЕСТЬ NULL

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

Строки без пары потеряны или смешаны с пустыми датами

Тип параметра
Норма

В параметр передано значение типа Дата

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

Передано Неопределено или строка — сравнение работает непредсказуемо

Когда пустую дату лучше не использовать

В ряде задач опора на пустую дату — признак слабого дизайна. Если по бизнес-логике дата обязательна, надёжнее включить проверку заполнения реквизита на уровне конфигурации (свойство «Проверка заполнения»), чем потом фильтровать пустые значения в каждом отчёте. Это убирает целый класс ошибок в запросах.

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

FAQ

Чем ДАТАВРЕМЯ(1,1,1) отличается от Дата(1,1,1)?

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

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

Нет, пустая дата по определению равна 01.01.0001 00:00:00. Вызов ДАТАВРЕМЯ(1, 1, 1, 12, 0, 0) вернёт уже заполненную дату, которая не будет равна пустой.

Почему условие «Дата = ДАТАВРЕМЯ(1,1,1)» не находит записи после соединения?

Потому что при отсутствии пары в присоединённой таблице поле содержит NULL, а NULL не равен никакому значению, включая пустую дату. Добавьте условие ИЛИ Поле ЕСТЬ NULL.

Как в СКД отобрать записи с пустой датой без изменения запроса?

В настройках отбора выберите вид сравнения «Не заполнено» для поля даты — компоновка сама построит корректное условие. Программно можно передать параметр со значением Дата(1,1,1) и отбор по равенству.

Что вернёт запрос, если сравнить дату с Неопределено?

Сравнение с Неопределено в запросе не эквивалентно сравнению с пустой датой: такие условия обычно не отбирают записей с незаполненной датой. Всегда передавайте в параметр именно значение типа Дата.

Итог

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

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