Работа с пустыми ссылками, одна из базовых, но критически важных задач при написании запросов в 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), так как селективность такого условия крайне низка (большинство записей обычно имеют заполненную ссылку).
Советы по оптимизации:
- Избегайте фильтрации по пустой ссылке в больших таблицах (движения регистров, большие справочники) без дополнительных условий.
- Используйте составные индексы (в конфигураторе на закладке «Индексы» таблицы), если часто фильтруете по паре: «Заполненное поле + Пустая ссылка».
- Переносите проверку в HAVING при группировке, если это позволяет отсечь группы раньше, но чаще всего WHERE эффективнее.
- Для поиска «незаполненных» реквизитов объектов лучше использовать настройку «Проверка заполнения» на уровне метаданных (реквизита/табличной части), чем запрос.
Типичные ошибки и как их избежать
Ошибка 1: Сравнение с NULL
// НЕПРАВИЛЬНО
ГДЕ Товары.Родитель ЕСТЬ NULL
// ПРАВИЛЬНО
ГДЕ Товары.Родитель = ПУСТАЯССЫЛКА
Ошибка 2: Использование ВЫРАЗИТЬ КАК для приведения типа к пустой ссылке
Нельзя написать: ВЫРАЗИТЬ(ПУСТАЯССЫЛКА КАК Справочник.Номенклатура). Функция ВЫРАЗИТЬ работает только с примитивными типами (Строка, Число, Дата, Булево). Для ссылок используйте только ЗНАЧЕНИЕ или неявное приведение через ПУСТАЯССЫЛКА.
Ошибка 3: Проверка поля, которое не может быть пустой ссылкой
Некоторые системные поля (например, Ссылка у справочника/документа, Период у регистра) никогда не могут быть пустой ссылкой или NULL. Проверка таких полей на пустоту бессмысленна и только замедляет запрос.
Ошибка 4: Неявное приведение типов в ВЫБОРЕ
// ОШИБКА: Типы несовместимы (Ссылка и Строка)
ВЫБОР КОГДА Товары.Родитель = ПУСТАЯССЫЛКА ТОГДА "Корень" ИНАЧЕ Товары.Родитель КОНЕЦ
// ПРАВИЛЬНО: Приводим к строке явно
ВЫБОР
КОГДА Товары.Родитель = ПУСТАЯССЫЛКА ТОГДА "Корень"
ИНАЧЕ ВЫРАЗИТЬ(Товары.Родитель КАК СТРОКА(100))
КОНЕЦ
Практический пример: Комплексный отчет
Задача: Получить список номенклатуры, у которой не заполнен «Вид номенклатуры» ИЛИ не заполнена «Базовая единица измерения», с указанием проблемы.
ВЫБРАТЬ
Номенклатура.Наименование КАК Товар,
ВЫБОР
КОГДА Номенклатура.ВидНоменклатуры = ПУСТАЯССЫЛКА
ТОГДА "Не заполнен Вид"
КОГДА Номенклатура.БазоваяЕдиницаИзмерения = ПУСТАЯССЫЛКА
ТОГДА "Не заполнена Ед; изм."
ИНАЧЕ "ОК"
КОНЕЦ КАК СтатусЗаполнения
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ВидНоменклатуры = ПУСТАЯССЫЛКА
ИЛИ Номенклатура.БазоваяЕдиницаИзмерения = ПУСТАЯССЫЛКА
УПОРЯДОЧИТЬ ПО
СтатусЗаполнения УБЫВ,
Товар
Резюме: Чек-лист лучших практик
- Используйте
ПУСТАЯССЫЛКАдля краткости в простых запросах с явным контекстом типа. - Используйте
ЗНАЧЕНИЕ(Метаданные.ПустаяСсылка)в сложных запросах, подзапросах, объединениях и когда нужно явно задать тип. - Для LEFT JOIN всегда проверяйте поле-ключ присоединяемой таблицы на
= ПУСТАЯССЫЛКА. - Не путайте с NULL. Для ссылок —
= ПУСТАЯССЫЛКА, для примитивов (после LEFT JOIN) —ЕСТЬ NULL. - Используйте
ЕСТЬNULLдля подстановки значений по умолчанию в списке выборки. - Помните о производительности: фильтр по пустой ссылке на больших таблицах дает полное сканирование (Full Scan).
Грамотная работа с пустыми ссылками — залог чистых данных и быстрых отчетов. Следуя этим правилам, вы избежите большинства типичных ошибок новичков и напишете профессиональный, надежный код на языке запросов 1С.