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