1с запрос как проверить на пустую ссылку в запросе

Устали ловить ошибки? Узнайте секретный способ проверки пустой ссылки в запросе 1С за минуту. Код, примеры и ни воды — только суть!

Бесплатная консультация юриста

+7 (800) 302-87-29

Реклама jurik.ru

Работа с пустыми ссылками, одна из базовых, но критически важных задач при написании запросов в 1С:Предприятие 8.3. Неправильная обработка пустых ссылок приводит к ошибкам в отчетах, некорректным остаткам и логическим ошибкам в бизнес-процессах. В этой статье подробно разберем все способы проверки на пустую ссылку в языке запросов 1С, их нюансы и лучшие практики.

Что такое пустая ссылка в 1С?

Пустая ссылка (Значение(Справочник.Номенклатура.ПустаяСсылка) или просто ПустаяСсылка в контексте запроса) — это специальное значение, обозначающее отсутствие ссылки на объект метаданных (справочник, документ, план видов характеристик и т.д.). В базе данных это обычно хранится как NULL или специальный GUID, состоящий из нулей.

Важно: Пустая ссылка не равна NULL в строгом SQL-понимании, хотя и часто ведет себя похоже. В 1С они являются разными значениями, и проверка Поле IS NULL не сработает для пустой ссылки (и наоборот).

Основные способы проверки

Функция ЗНАЧЕНИЕ — классический стандарт

Самый распространенный и читаемый способ — сравнение с константой пустой ссылки через функцию ЗНАЧЕНИЕ.

ВЫБРАТЬ
 Товары.Ссылка,
 Товары.Наименование
ИЗ
 Справочник.Номенклатура КАК Товары
ГДЕ
 Товары.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
  • Плюсы: Явное указание типа метаданных (Справочник.Номенклатура), что повышает читаемость и позволяет платформе контролировать типы на этапе компиляции.
  • Минусы: Нужно знать точное имя метаданных.

Ключевое слово ПУСТАЯССЫЛКА (доступно с недавних версий)

В современных версиях платформы (начиная с 8.3.10+) можно использовать ключевое слово ПУСТАЯССЫЛКА без указания типа. Платформа сама определит тип по контексту (левой части сравнения).

ВЫБРАТЬ
 Документы.Ссылка
ИЗ
 Документ.РеализацияТоваровУслуг КАК Документы
ГДЕ
 Документы.ДоговорКонтрагента = ПУСТАЯССЫЛКА
  • Плюсы: Лаконично, не нужно писать полный путь к метаданным.
  • Минусы: В сложных запросах с объединениями (ОБЪЕДИНИТЬ) или подзапросами платформа может не определить тип неявно, что приведет к ошибке компиляции. В таких случаях лучше использовать ЗНАЧЕНИЕ.

Функция ЕСТЬNULL, замена на альтернативное значение

Часто нужно не просто отфильтровать, а заменить пустую ссылку на какое-то значение (например, «Не заполнено» или другую ссылку).

ВЫБРАТЬ
 Контрагенты.Наименование,
 ЕСТЬNULL(Контрагенты.Ответственный, ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)) КАК Ответственный
ИЗ
 Справочник.Контрагенты КАК Контрагенты

Также можно использовать для подстановки «заглушки»:

ВЫБРАТЬ
 Номенклатура.Наименование,
 ВЫБОР
 КОГДА Номенклатура.ВидНоменклатуры = ПУСТАЯССЫЛКА ТОГДА "Без вида"
 ИНАЧЕ Номенклатура.ВидНоменклатуры.Наименование
 КОНЕЦ КАК Вид
ИЗ
 Справочник.Номенклатура КАК Номенклатура

Конструкция ВЫБОР … КОГДА … ТОГДА

Позволяет реализовать сложную логику ветвления в зависимости от пустоты ссылки.

ВЫБРАТЬ
 Заказ.Ссылка,
 ВЫБОР
 КОГДА Заказ.Клиент = ПУСТАЯССЫЛКА ТОГДА "Розничный покупатель"
 ИНАЧЕ Заказ.Клиент.Наименование
 КОНЕЦ КАК КлиентНаименование
ИЗ
 Документ.ЗаказКлиента КАК Заказ

Проверка на пустую ссылку в соединениях (LEFT JOIN)

Это самый частый сценарий: поиск записей, у которых нет соответствия в присоединяемой таблице.

ВЫБРАТЬ
 Товары.Наименование,
 Остатки.КоличествоОстаток
ИЗ
 Справочник.Номенклатура КАК Товары
 ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(
 ,
 Номенклатура В ИЕРАРХИИ (&Номенклатура)
 ) КАК Остатки
 ПО Товары.Ссылка = Остатки.Номенклатура
ГДЕ
 Остатки.Номенклатура = ПУСТАЯССЫЛКА
 // Или: Остатки.КоличествоОстаток ЕСТЬ NULL

Нюанс: При левом соединении поля присоединяемой таблицы для несовпавших строк заполняются значениями NULL (для примитивов) или пустыми ссылками (для ссылочных типов). Поэтому проверка Остатки.Номенклатура = ПУСТАЯССЫЛКА абсолютно корректна и является стандартом де-факто.

Пустая ссылка vs NULL: в чем разница?

Характеристика Пустая ссылка (EmptyRef) NULL
Тип данных Ссылочный (конкретного вида метаданных) Неопределенный (отсутствие значения)
Проверка в запросе Поле = ПУСТАЯССЫЛКА или Поле = ЗНАЧЕНИЕ(...) Поле ЕСТЬ NULL / Поле НЕ ЕСТЬ NULL
Результат LEFT JOIN (нет совпадения) Для полей-ссылок Для полей-примитивов (Число, Строка, Дата, Булево)
Сравнение с самим собой ПУСТАЯССЫЛКА = ПУСТАЯССЫЛКА -> Истина NULL = NULL -> Ложь (в SQL/1С NULL не равен NULL)

Проверка на пустую ссылку во временных таблицах и параметрах

Параметры запроса

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

// В коде 1С:
Запрос.УстановитьПараметр("МойПараметр", Справочники.Номенклатура.ПустаяСсылка);

// В тексте запроса:
ГДЕ
 Товары.Вид = &МойПараметр
 // Сработает корректно: отберет товары с пустым видом

Временные таблицы (ВЫБРАТЬ … ПОМЕСТИТЬ ВТ_Таблица)

При создании временной таблицы поля-ссылки, не имеющие значения, автоматически получают значение пустой ссылки соответствующего типа.

ВЫБРАТЬ
 Номенклатура.Ссылка КАК Товар,
 Номенклатура.Родитель КАК Родитель
ПОМЕСТИТЬ ВТ_Товары
ИЗ
 Справочник.Номенклатура КАК Номенклатура

// Далее проверка:
ВЫБРАТЬ * ИЗ ВТ_Товары ГДЕ Родитель = ПУСТАЯССЫЛКА

Производительность и индексы

Проверка на пустую ссылку (Поле = ПУСТАЯССЫЛКА) обычно не использует индексы эффективно в большинстве СУБД (PostgreSQL, MS SQL, Oracle), так как селективность такого условия крайне низка (большинство записей обычно имеют заполненную ссылку).

Советы по оптимизации:

  1. Избегайте фильтрации по пустой ссылке в больших таблицах (движения регистров, большие справочники) без дополнительных условий.
  2. Используйте составные индексы (в конфигураторе на закладке «Индексы» таблицы), если часто фильтруете по паре: «Заполненное поле + Пустая ссылка».
  3. Переносите проверку в HAVING при группировке, если это позволяет отсечь группы раньше, но чаще всего WHERE эффективнее.
  4. Для поиска «незаполненных» реквизитов объектов лучше использовать настройку «Проверка заполнения» на уровне метаданных (реквизита/табличной части), чем запрос.

Типичные ошибки и как их избежать

Ошибка 1: Сравнение с NULL

// НЕПРАВИЛЬНО
ГДЕ Товары.Родитель ЕСТЬ NULL

// ПРАВИЛЬНО
ГДЕ Товары.Родитель = ПУСТАЯССЫЛКА

Ошибка 2: Использование ВЫРАЗИТЬ КАК для приведения типа к пустой ссылке

Нельзя написать: ВЫРАЗИТЬ(ПУСТАЯССЫЛКА КАК Справочник.Номенклатура). Функция ВЫРАЗИТЬ работает только с примитивными типами (Строка, Число, Дата, Булево). Для ссылок используйте только ЗНАЧЕНИЕ или неявное приведение через ПУСТАЯССЫЛКА.

Ошибка 3: Проверка поля, которое не может быть пустой ссылкой

Некоторые системные поля (например, Ссылка у справочника/документа, Период у регистра) никогда не могут быть пустой ссылкой или NULL. Проверка таких полей на пустоту бессмысленна и только замедляет запрос.

Ошибка 4: Неявное приведение типов в ВЫБОРЕ

// ОШИБКА: Типы несовместимы (Ссылка и Строка)
ВЫБОР КОГДА Товары.Родитель = ПУСТАЯССЫЛКА ТОГДА "Корень" ИНАЧЕ Товары.Родитель КОНЕЦ

// ПРАВИЛЬНО: Приводим к строке явно
ВЫБОР 
 КОГДА Товары.Родитель = ПУСТАЯССЫЛКА ТОГДА "Корень" 
 ИНАЧЕ ВЫРАЗИТЬ(Товары.Родитель КАК СТРОКА(100)) 
КОНЕЦ

Практический пример: Комплексный отчет

Задача: Получить список номенклатуры, у которой не заполнен «Вид номенклатуры» ИЛИ не заполнена «Базовая единица измерения», с указанием проблемы.

ВЫБРАТЬ
 Номенклатура.Наименование КАК Товар,
 ВЫБОР
 КОГДА Номенклатура.ВидНоменклатуры = ПУСТАЯССЫЛКА 
 ТОГДА "Не заполнен Вид"
 КОГДА Номенклатура.БазоваяЕдиницаИзмерения = ПУСТАЯССЫЛКА 
 ТОГДА "Не заполнена Ед; изм."
 ИНАЧЕ "ОК"
 КОНЕЦ КАК СтатусЗаполнения
ИЗ
 Справочник.Номенклатура КАК Номенклатура
ГДЕ
 Номенклатура.ВидНоменклатуры = ПУСТАЯССЫЛКА
 ИЛИ Номенклатура.БазоваяЕдиницаИзмерения = ПУСТАЯССЫЛКА
УПОРЯДОЧИТЬ ПО
 СтатусЗаполнения УБЫВ,
 Товар

Резюме: Чек-лист лучших практик

  • Используйте ПУСТАЯССЫЛКА для краткости в простых запросах с явным контекстом типа.
  • Используйте ЗНАЧЕНИЕ(Метаданные.ПустаяСсылка) в сложных запросах, подзапросах, объединениях и когда нужно явно задать тип.
  • Для LEFT JOIN всегда проверяйте поле-ключ присоединяемой таблицы на = ПУСТАЯССЫЛКА.
  • Не путайте с NULL. Для ссылок — = ПУСТАЯССЫЛКА, для примитивов (после LEFT JOIN) — ЕСТЬ NULL.
  • Используйте ЕСТЬNULL для подстановки значений по умолчанию в списке выборки.
  • Помните о производительности: фильтр по пустой ссылке на больших таблицах дает полное сканирование (Full Scan).

Грамотная работа с пустыми ссылками — залог чистых данных и быстрых отчетов. Следуя этим правилам, вы избежите большинства типичных ошибок новичков и напишете профессиональный, надежный код на языке запросов 1С.