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