При разработке конфигураций на платформе 1С:Предприятие программисты часто сталкиваются с необходимостью фильтрации данных в запросах. Одной из самых распространенных задач является отбор записей, где ссылка на конкретный документ или справочник не заполнена. Понимание разницы между значением NULL и типом ПустаяСсылка критически важно для корректной работы базы данных.
Неправильная интерпретация пустых значений может привести к тому, что важные документы не попадут в отчеты, или, наоборот, в выборку включатся мусорные данные. В данной статье мы детально разберем синтаксис оператора ЕСТЬ NULL и ЕСТЬ ПУСТАЯ ССЫЛКА, а также рассмотрим нюансы работы с ними в различных версиях платформы.
Рассмотрим практические примеры написания запросов, которые помогут вам избежать типичных ошибок и оптимизировать производительность ваших выборок. Мы также затронем тему преобразования типов данных и способы обработки таких ситуаций непосредственно в коде на встроенном языке.
Природа пустых ссылок в платформе 1С
В архитектуре 1С существует фундаментальное различие между отсутствием значения и ссылкой на несуществующий объект. Тип данных Ссылка может принимать специальное значение, которое называется ПустаяСсылка. Это не то же самое, что NULL в классических реляционных базах данных, хотя визуально в интерфейсе они могут выглядеть одинаково.
Когда вы создаете новый документ и не заполняете поле типа "Ссылка", система присваивает ему значение ПустаяСсылка. Однако при выгрузке данных или в некоторых специфических сценариях обмена может возникнуть ситуация, когда в поле действительно записан NULL. Понимание этой разницы позволяет писать более надежный код.
Для проверки наличия значения в языке запросов 1С предусмотрены специальные конструкции. Использование стандартных операторов сравнения, таких как = или <>, в данном случае недопустимо и приведет к ошибке выполнения или неверному результату. Необходимо использовать специализированный синтаксис платформы.
⚠️ Внимание: Попытка сравнить поле типа Ссылка с константой "ПустаяСсылка" через оператор равно (=) вызовет ошибку синтаксиса. Всегда используйте конструкцию ЕСТЬ ПУСТАЯ ССЫЛКА.
Используйте типизированные параметры в запросах, чтобы платформа автоматически приводила пустые значения к корректному типу ПустаяСсылка нужного объекта.
Синтаксис оператора проверки в языке запросов
Основным инструментом для фильтрации записей с незаполненными ссылками является выражение ЕСТЬ ПУСТАЯ ССЫЛКА. Этот оператор возвращает истину, если значение поля является пустой ссылкой на объект метаданных. Синтаксис предельно прост и читается интуитивно.
Рассмотрим базовый пример использования данного оператора в конструкции ВЫБРАТЬ. Допустим, нам нужно найти все заказы покупателей, в которых не указан договор. Запрос будет выглядеть следующим образом:
ВЫБРАТЬ
ЗаказыПокупателей.Ссылка,
ЗаказыПокупателей.Номер,
ЗаказыПокупателей.Договор
ИЗ
Документ.ЗаказПокупателя КАК ЗаказыПокупателей
ГДЕ
ЕСТЬ ПУСТАЯ ССЫЛКА (ЗаказыПокупателей.Договор)
Важно отметить, что оператор ЕСТЬ ПУСТАЯ ССЫЛКА работает только с полями, имеющими тип Ссылка. Если вы попытаетесь применить его к числовому полю или строке, система выдаст ошибку компиляции запроса. Для проверки других типов данных используются иные методы, например, сравнение с пустой строкой.
Оператор ЕСТЬ ПУСТАЯ ССЫЛКА является единственным корректным способом фильтрации незаполненных ссылок в языке запросов 1С.
Различия между NULL и ПустойСсылкой
Частой причиной путаницы среди разработчиков становится смешение понятий NULL и ПустаяСсылка. В контексте СУБД, на которой работает 1С (например, MS SQL или PostgreSQL), NULL означает отсутствие любого значения. В то же время, внутри платформы 1С пустая ссылка — это полноценное значение специального типа.
В стандартных запросах 1С оператор ЕСТЬ NULL также существует, но его поведение может отличаться в зависимости от контекста и версии платформы. Как правило, для полей метаданных типа "Ссылка" платформа internally преобразует NULL в ПустуюСсылку. Однако при работе с виртуальными таблицами или регистрами могут возникать нюансы.
Ниже приведена таблица, демонстрирующая основные различия в поведении этих значений при различных операциях:
| Характеристика | ПустаяСсылка | NULL (в СУБД) | Пустая строка |
|---|---|---|---|
| Тип данных 1С | Ссылка | Неопределено | Строка |
| Проверка в запросе | ЕСТЬ ПУСТАЯ ССЫЛКА | ЕСТЬ NULL | = "" |
| Сравнение в коде | Значение = ПустаяСсылка | Значение = Неопределено | СтрДлина(Значение) = 0 |
| Возможность метода | Есть методы объекта | Нет методов | Есть методы строки |
При написании сложных запросов с объединениями (ОБЪЕДИНИТЬ) убедитесь, что типы полей в выборках совпадают. Если в одной части запроса приходит NULL, а в другой ПустаяСсылка, это может привести к непредсказуемому поведению при последующей обработке результата.
⚠️ Внимание: При прямой работе с SQL через внешние обработки помните, что 1С может мапить NULL базы данных в ПустаяСсылка при чтении, но обратное преобразование требует явного указания.
Практические примеры фильтрации документов
Рассмотрим более сложный сценарий, где требуется отобрать документы не только с пустой ссылкой, но и с определенными атрибутами. Часто возникает задача найти "проблемные" документы, где не заполнен контрагент или номенклатура. Такие запросы незаменимы при проведении аудита базы данных.
Предположим, мы хотим найти все поступления товаров, где не заполнен склад. Это критическая ошибка учета, которую необходимо исправить. Запрос будет использовать комбинацию условий:
ВЫБРАТЬ
ПоступленияТоваров.Ссылка,
ПоступленияТоваров.Дата,
ПоступленияТоваров.Ответственный
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступленияТоваров
ГДЕ
ЕСТЬ ПУСТАЯ ССЫЛКА (ПоступленияТоваров.Склад)
И ПоступленияТоваров.Проведен = ИСТИНА
В данном примере мы используем логическое И для уточнения выборки. Также стоит обратить внимание на то, что проверка на пустую ссылку выполняется до проверки других условий, что может повлиять на план выполнения запроса сервером. Индексы базы данных обычно хорошо оптимизированы для таких проверок.
Еще один важный аспект — работа с составными типами. Если поле может содержать ссылку на несколько разных объектов (например, Договор или Контрагент), оператор ЕСТЬ ПУСТАЯ ССЫЛКА сработает корректно только если значение пусто для любого из допустимых типов. Если же там записан объект другого типа из списка допустимых, условие вернет Ложь.
Обработка пустых ссылок во встроенном языке
После получения данных запроса часто требуется программная обработка результатов. Во встроенном языке 1С проверка на пустую ссылку выполняется путем сравнения значения с константой ПустаяСсылка. При этом важно учитывать тип ссылки, так как пустые ссылки на разные объекты не равны между собой в строгом смысле, хотя платформа часто приводит их к общему знаменателю.
Для безопасной работы рекомендуется использовать функцию ПустаяСсылка() с указанием типа или сравнивать с заранее полученной пустой ссылкой нужного типа. Пример кода обработки результата запроса:
Если ЗаписьСправочника.Родитель = ПустаяСсылка(Справочники.Номенклатура) Тогда
Сообщить("Элемент находится в корне справочника");
КонецЕсли;
Также существует метод Пустая() у объектов ссылки, который возвращает Булево значение. Этот метод удобен тем, что не требует знания конкретного типа пустой ссылки для сравнения, он проверяет внутреннее состояние объекта.
- 🔍 Используйте метод
Пустая()для универсальной проверки в циклах. - ⚡ Сравнение с
ПустаяСсылка(Тип)работает быстрее в строгих условиях. - 🛡 Всегда проверяйте тип значения перед приведением, чтобы избежать ошибок.
Помните, что попытка вызвать метод объекта у пустой ссылки (например, ПустаяСсылка.ПолучитьНаименование()) приведет к ошибке выполнения. Поэтому проверка на пустоту является обязательным этапом перед обращением к свойствам объекта.
Особенности составных типов
Если поле имеет составной тип (СправочникСсылка.Номенклатура или СправочникСсылка.Услуги), то ПустаяСсылка должна соответствовать конкретному типу в момент сравнения, либо используйте универсальный метод Пустая().
Оптимизация производительности запросов
При работе с большими объемами данных проверка на пустую ссылку может влиять на скорость выполнения запроса. Сервер 1С использует индексы базы данных для ускорения таких операций. Однако, если условие ЕСТЬ ПУСТАЯ ССЫЛКА используется в сочетании с функциями над полями, индекс может не примениться.
Старайтесь избегать вычисляемых полей в условии ГДЕ. Например, конструкция ЕСТЬ ПУСТАЯ ССЫЛКА (ВЫБОР...) будет работать медленнее, чем прямая проверка поля таблицы. Если возможно, вынесите сложные вычисления в отдельные вложенные запросы или временные таблицы.
Анализ плана выполнения запроса через консоль запросов или технологический журнал поможет выявить узкие места. Часто оказывается, что отсутствие индекса на проверяемом поле является причиной долгой работы отчета.
⚠️ Внимание: На больших базах данных (миллионы записей) отсутствие индекса на полях, по которым идет частая фильтрация на пустоту, может увеличивать время формирования отчета в десятки раз.
☑️ Оптимизация запроса
Частые ошибки и способы их устранения
Разработчики часто допускают ошибку, пытаясь использовать оператор IS NULL в текстах запросов 1С, полагаясь на знание SQL. Платформа 1С имеет свой синтаксис, и использование SQL-терминов внутри текста запроса 1С приведет к ошибке парсинга. Используйте только конструкции языка 1С.
Еще одна распространенная проблема возникает при использовании параметров запроса. Если вы передаете в параметр значение Неопределено, а в запросе сравниваете его с полем типа Ссылка, результат может быть непредсказуемым. Лучше явно передавать ПустаяСсылка нужного типа в параметр.
При динамическом формировании запроса убедитесь, что имена полей указаны верно. Опечатка в имени поля может привести к тому, что запрос будет искать несуществующее поле или, в случае использования псевдонимов, проверять не тот столбец.
- ❌ Не используйте
IS NULLв тексте запроса 1С. - ✅ Всегда проверяйте типы передаваемых параметров.
- ⚠️ Остерегайтесь неявного приведения типов в составных полях.
Для отладки сложных условий рекомендуется выводить текст сформированного запроса в консоль или журнал регистрации перед его выполнением. Это позволяет увидеть реальную структуру условия и найти логические несоответствия.
Можно ли использовать оператор "ЕСТЬ NULL" вместо "ЕСТЬ ПУСТАЯ ССЫЛКА"?
Технически оператор ЕСТЬ NULL существует, но он предназначен для проверки значения Неопределено в контексте СУБД. Для полей типа Ссылка в 1С корректнее и надежнее использовать ЕСТЬ ПУСТАЯ ССЫЛКА, так как это гарантирует работу с типизированными данными платформы, а не сырыми данными базы.
Что вернет запрос, если поле составного типа и одна из ссылок пустая?
Если поле имеет составной тип, условие ЕСТЬ ПУСТАЯ ССЫЛКА вернет Истину только в том случае, если значение является пустой ссылкой для всех допустимых типов или если значение действительно не инициализировано. Если там хранится объект одного из допустимых типов, условие вернет Ложь.
Как проверить пустую ссылку в СКД (Система Компоновки Данных)?
В настройках отборов СКД необходимо выбрать поле, в операции выбрать "Пустая ссылка" (или ввести вручную выражение ЕСТЬ ПУСТАЯ ССЫЛКА в режиме расширенного редактирования). Не используйте операцию "Равно" со значением пустой строки.
Влияет ли проверка на пустую ссылку на блокировку записей?
Сама по себе проверка в операторе ГДЕ не устанавливает блокировок. Блокировки зависят от режима транзакции и наличия оператора ДЛЯ ИЗМЕНЕНИЯ. Однако, если запрос выполняется с блокировками, строки, удовлетворяющие условию (в том числе с пустыми ссылками), будут заблокированы.