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

Ошибки в синтаксисе при сравнении ссылок часто приводят к тому, что запрос возвращает пустой результат или, что хуже, выбирает лишние данные. Механизм работы с ссылками имеет свои нюансы, отличающиеся от работы с примитивными типами, такими как Число или Строка. В этой статье мы детально разберем синтаксические конструкции для выборки по ссылкам.

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

Синтаксис сравнения с конкретной ссылкой

Самый распространенный случай — необходимость выбрать записи, где поле-ссылка соответствует конкретному объекту метаданных. В языке запросов для этого используется оператор =. Значение ссылки должно быть заключено в кавычки, а перед ним обязательно указывается тип данных.

Синтаксическая конструкция выглядит следующим образом: ИмяПоля = &ПараметрСсылки или прямое указание в тексте запроса. При прямом указании важно соблюдать формат Справочник.ИмяСправочника.НаименованиеЭлемента. Это позволяет платформе однозначно идентифицировать объект.

Обратите внимание, что сравнение ссылок происходит по внутреннему уникальному идентификатору (UUID), а не по наименованию или коду объекта. Поэтому даже если вы меняете имя элемента в базе, запрос продолжит работать корректно, так как UUID остается неизменным.

ВЫБРАТЬ

РеализацияТоваровУслуг.Ссылка,

РеализацияТоваровУслуг.Контрагент

ИЗ

Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

ГДЕ

РеализацияТоваровУслуг.Контрагент = &Контрагент

Использование параметра &Контрагент в примере выше является предпочтительным способом. Это позволяет передавать ссылку из кода 1С, не hard-coding значения прямо в текст запроса. Такой подход делает код более гибким и защищенным от инъекций.

💡

Всегда используйте параметры запроса для передачи ссылок вместо подстановки значений напрямую в текст. Это улучшает читаемость и позволяет механизму кэширования запросов работать эффективнее.

Проверка на пустое значение ссылки

Часто возникает задача отфильтровать записи, у которых не заполнено ссылочное поле. В 1С пустое значение ссылки — это не NULL в классическом понимании SQL, а специальное значение ЗНАЧЕНИЕ(Справочник.ПустаяСсылка).

Для проверки на заполненность используется оператор ЕСТЬ NULL или сравнение с пустой ссылкой. Однако в контексте платформы 1С правильнее и понятнее использовать явное сравнение с константой пустой ссылки. Это гарантирует корректную работу независимо от настроек конкретной конфигурации.

Условия могут быть инвертированы. Если вам нужно найти только те документы, где контрагент указан, вы используете оператор <> (не равно). Логика остается прозрачной: мы сравниваем поле со специальным маркером "пустоты".

  • 🔍 Используйте ЕСТЬ NULL для быстрой проверки на отсутствие значения в индексных полях.
  • 🛡️ Сравнение с ЗНАЧЕНИЕ(Справочник.ПустаяСсылка) более явно отражает намерения разработчика.
  • ⚡ Оптимизация: проверка на пустоту часто использует индексы быстрее, чем сложные вычисления.
⚠️ Внимание: Не путайте пустую строку и пустую ссылку. Для типа Ссылка значение "" (пустая строка) недопустимо и вызовет ошибку выполнения запроса.
📊 Как вы чаще проверяете ссылку на заполненность?
Через ЕСТЬ NULL
Через ЗНАЧЕНИЕ(ПустаяСсылка)
Через НЕ ПустаяСсылка
Зависит от ситуации

Выборка по списку ссылок (оператор В)

Когда требуется выбрать объекты, относящиеся к группе элементов, используется оператор В. Это аналог SQL IN. Аргументом оператора может служить список значений, перечисленных через запятую, или временная таблица.

Список ссылок в условии В должен быть однородным. Вы не можете смешивать ссылки на разные справочники в одном списке без явного приведения типов, хотя на практике такие ситуации встречаются редко. Платформа строго следит за соответствием типов данных.

Пример использования списка значений непосредственно в тексте запроса допустим для небольших наборов данных. Однако при большом количестве элементов (более 50-100) производительность может падать. В таких случаях эффективнее использовать временные таблицы.

ВЫБРАТЬ

Номенклатура.Ссылка,

Номенклатура.Наименование

ИЗ

Справочник.Номенклатура КАК Номенклатура

ГДЕ

Номенклатура.Ссылка В (&СписокНоменклатуры)

Переменная &СписокНоменклатуры в коде 1С должна быть объявлена как СписокЗначений или массив ссылок. Платформа автоматически преобразует этот массив в набор данных для оператора В.

☑️ Оптимизация выборки по списку

Выполнено: 0 / 4

Использование временных таблиц для сложных условий

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

Сначала данные помещаются во временную таблицу, а затем эта таблица используется в операторе В или соединяется (ЛЕВОЕ СОЕДИНЕНИЕ) с основной таблицей. Такой подход особенно актуален, когда список ссылок формируется на основе других расчетов.

Временные таблицы в 1С хранятся в памяти или во временных файлах СУБД, что обеспечивает высокую скорость доступа. Кроме того, они позволяют применять дополнительную фильтрацию или группировку перед основной выборкой.

Метод Производительность Читаемость Рекомендуемый объем данных
Список в параметре Средняя Высокая До 100 элементов
Временная таблица Высокая Средняя Любой объем
Вложенный запрос Низкая/Средняя Низкая Малый объем

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

Как создать временную таблицу ссылок?

В коде 1С используйте метод Новый Запрос().МенеджерВременныхТаблиц.Создать(). Заполните её данными через Выгрузить() или добавить строки циклом.

Особенности работы с иерархическими справочниками

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

Для решения этой задачи используется специальная конструкция В ИЕРАРХИИ. Она позволяет рекурсивно обойти дерево справочника, начиная с указанной ссылки-родителя. Это мощный инструмент для аналитических отчетов.

Синтаксис предполагает указание поля иерархии (обычно это Ссылка или специальное поле Родитель) и ссылки на верхнеуровневый элемент. Платформа сама построит необходимый набор идентификаторов.

ВЫБРАТЬ

Номенклатура.Ссылка

ИЗ

Справочник.Номенклатура КАК Номенклатура

ГДЕ

Номенклатура.Ссылка В ИЕРАРХИИ &РодительскаяГруппа

Использование В ИЕРАРХИИ существенно упрощает код, избавляя от необходимости писать рекурсивные функции на стороне клиента. Однако стоит помнить, что на очень глубоких деревьях это может потребовать дополнительных ресурсов СУБД.

⚠️ Внимание: Конструкция В ИЕРАРХИИ работает только со справочниками, у которых в свойствах метаданных включена опция "Иерархический справочник". Для плоских списков она неприменима.
💡

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

Типичные ошибки и способы их устранения

Разработчики часто сталкиваются с ситуацией, когда запрос syntactically верен, но не возвращает данных. Частая причина — несоответствие типов. Например, попытка сравнить ссылку на "Номенклатуру" со ссылкой на "ХарактеристикиНоменклатуры" без явного приведения.

Еще одна ошибка — использование строкового представления ссылки вместо объектного. Платформа 1С строго типизирована, и строка "Справочник.Объект" не равна самой ссылке на объект. Всегда передавайте в запрос объекты типа СправочникСсылка.

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

  • ❌ Ошибка: Передача строки вместо объекта ссылки в параметр запроса.
  • ❌ Ошибка: Сравнение ссылок на разные виды объектов без приведения к общему типу.
  • ✅ Решение: Используйте метод ТипЗнч() для отладки и проверки типов передаваемых переменных.

Для отладки сложных запросов используйте консоль запросов. Она позволяет визуально увидеть сформированный текст запроса с подставленными параметрами, что часто сразу указывает на ошибку в формате ссылки.

ℹ️ Примечание: Интерфейс и возможности консоли запросов могут отличаться в разных версиях платформы 1С. Рекомендуется сверять актуальные горячие клавиши и функции в справке вашей версии конфигуратора.
💡

При отладке запроса выведите текст запроса с подставленными параметрами в журнал регистрации. Это поможет увидеть, какое именно значение ссылки было передано в СУБД.

Можно ли сравнивать ссылки на разные справочники?

Прямое сравнение ссылок на разные справочники (например, Контрагенты и Номенклатура) в условии = всегда вернет Ложь, так как их внутренние идентификаторы принадлежат разным пространствам имен. Для сравнения нужно приводить их к общему типу СправочникСсылка, но логический смысл такого сравнения обычно отсутствует.

Что будет, если передать в запрос несуществующую ссылку?

Запрос выполнится без ошибок, но результат выборки будет пустым. Платформа 1С корректно обрабатывает ссылки на удаленные объекты, просто не находя соответствий в таблицах базы данных. Ошибка возникнет только при попытке обратиться к реквизитам такой ссылки в коде после выборки.

Как ускорить выборку по большому списку ссылок?

Наиболее эффективный способ — загрузка списка ссылок во временную таблицу с последующим соединением (JOIN). Оператор В с большим массивом параметров может замедлять работу из-за ограничения на длину текста запроса и сложности плана выполнения СУБД.