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