К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как в запросе 1С обратиться к элементу справочника

Способы обратиться к элементу справочника в запросе 1С: ссылка, наименование, код, реквизиты, предопределённые элементы, параметры и типичные ошибки с примерами кода.

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

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

Ниже разобраны основные способы обращения к элементу справочника: через параметр-ссылку, через функцию ЗНАЧЕНИЕ для предопределённых элементов, через точку к реквизитам, а также типичные ошибки и способы проверить результат.

Как передать элемент справочника параметром запроса

Самый надёжный способ — передать ссылку на элемент через параметр. Ссылку получают заранее: из реквизита документа, из формы, через метод НайтиПоНаименованию или НайтиПоКоду менеджера справочника.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Товары.Номенклатура,

| Товары.Количество

|ИЗ

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

|ГДЕ

| Товары.Номенклатура = &Номенклатура";

Запрос.УстановитьПараметр("Номенклатура", СсылкаНаЭлемент);

Результат = Запрос.Выполнить();

Параметр объявляется в тексте запроса через символ амперсанда (&), а значение устанавливается методом УстановитьПараметр до выполнения. Если параметр не установлен, запрос выдаст ошибку «Переменная не определена» — это одна из самых частых причин сбоев у начинающих разработчиков.

Проверить, что ссылка корректна, можно через ПроверкаЗаполненности: если СсылкаНаЭлемент.Пустая() возвращает Истина, запрос вернёт пустой результат, и это нужно обработать в коде до выполнения.

Порядок действий
  1. 1
    Получите ссылку на элемент: из реквизита объекта или через Справочники.Имя.НайтиПоНаименованию()
  2. 2
    Проверьте, что ссылка не пустая: НЕ Ссылка.Пустая()
  3. 3
    В тексте запроса укажите условие Поле = &ИмяПараметра
  4. 4
    Вызовите Запрос.УстановитьПараметр с тем же именем
  5. 5
    Выполните запрос и проверьте, что результат не пустой

Как обратиться к предопределённому элементу через ЗНАЧЕНИЕ

Если элемент предопределённый (создан в конфигураторе), обращаться к нему можно прямо в тексте запроса функцией ЗНАЧЕНИЕ, без параметров и без обращения к базе средствами встроенного языка.

ВЫБРАТЬ

Контрагенты.Ссылка

ИЗ

Справочник.Контрагенты КАК Контрагенты

ГДЕ

Контрагенты.Ссылка = ЗНАЧЕНИЕ(Справочник.Контрагенты.РозничныйПокупатель)

После слова Справочник указывается имя справочника, затем имя предопределённого элемента — ровно так, как оно задано в конфигураторе, с учётом регистра. Ошибка в имени приведёт к ошибке компиляции запроса ещё до выполнения.

Важное ограничение: ЗНАЧЕНИЕ работает только для предопределённых элементов и значений перечислений. Обычный элемент, созданный пользователем в режиме предприятия, так получить нельзя — только через параметр-ссылку или поиск по реквизитам.

Как получить реквизиты элемента через точку

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

ВЫБРАТЬ

Товары.Номенклатура КАК Номенклатура,

Товары.Номенклатура.Наименование КАК Наименование,

Товары.Номенклатура.Артикул КАК Артикул,

Товары.Номенклатура.Родитель КАК Группа

ИЗ

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

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

Если ссылка в поле пустая, разыменованные реквизиты вернут NULL. Это нужно учитывать в условиях: сравнение с NULL всегда даёт ложь, поэтому для проверки используют конструкцию ЕСТЬ NULL.

Поиск элемента по наименованию, коду и реквизитам в запросе

Иногда ссылки нет, и элемент нужно найти прямо в запросе — например, при сопоставлении загруженных из файла данных со справочником. Тогда фильтр строят по наименованию, коду или уникальному реквизиту.

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

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

И НЕ Номенклатура.ПометкаУдаления

При поиске по наименованию учитывайте три момента. Во-первых, сравнение в запросах 1С нечувствительно к регистру, но чувствительно к пробелам и скрытым символам — данные из Excel часто содержат неразрывные пробелы. Во-вторых, наименования могут дублироваться, поэтому надёжнее искать по коду или уникальному реквизиту (ИНН для контрагентов, штрихкод для товаров). В-третьих, всегда добавляйте отбор по пометке удаления, иначе найдёте удалённый элемент.

Для неточного поиска используется оператор ПОДОБНО с шаблоном: Наименование ПОДОБНО "%текст%". Такой запрос не использует индекс и на больших справочниках работает медленно — применяйте его только когда точного совпадения добиться нельзя.

Типичные ошибки
01
Сравнение ссылки со строкой: Поле = "Товар 1" никогда не сработает — ссылка и строка разных типов
02
Поиск по наименованию без отсева помеченных на удаление — находится неактуальный элемент
03
Игнорирование NULL при разыменовании — записи с пустой ссылкой молча выпадают из результата
04
Опечатка в имени предопределённого элемента в ЗНАЧЕНИЕ — запрос падает при выполнении
05
Передача в параметр объекта вместо ссылки — ошибка несоответствия типов

Обращение к элементу в иерархическом справочнике

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

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

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

И НЕ Номенклатура.ЭтоГруппа

Условие НЕ ЭтоГруппа исключает из выборки сами группы, если нужны только элементы. Учтите, что в справочниках с иерархией элементов (а не групп и элементов) поля ЭтоГруппа нет, и условие будет лишним.

Обратная задача — получить родителя элемента — решается разыменованием: Номенклатура.Родитель.Наименование. Уровень вложенности через Родитель.Родитель и дальше достижим, но для обхода глубокой иерархии запросом так делать не стоит — используйте В ИЕРАРХИИ или итоги по иерархии.

Маршрут решения

Как выбрать способ обращения

Ссылка известна заранее (из формы, документа, кода)Передавайте её параметром &Ссылка — это самый быстрый вариант
Элемент предопределённый в конфигуратореИспользуйте ЗНАЧЕНИЕ(Справочник.Имя.ИмяЭлемента) прямо в тексте запроса
Есть только наименование или код из файлаИщите в запросе по реквизиту с отсевом помеченных на удаление
Нужны все элементы группы и подгруппПрименяйте В ИЕРАРХИИ(&Группа)
Нужны реквизиты элемента из другой таблицыИспользуйте разыменование через точку, не более 2–3 уровней

Как проверить результат запроса

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

Для отладки используйте консоль запросов в режиме предприятия: она показывает фактические значения параметров и результат до выборки в коде. Проверьте тип значения параметра — для ссылки он должен отображаться как «СправочникСсылка.ИмяСправочника», а не «Строка».

В коде результат проверяют методом Пустой(): Если Результат.Пустой() Тогда — и далее обработка ситуации «элемент не найден». Не обращайтесь к полям выборки без проверки, иначе при пустом результате получите ошибку или значения по умолчанию.

Контрольные точки

Как проверить результат

Тип параметра в консоли запросов
Норма

СправочникСсылка с нужным видом справочника

Тревожный признак

Строка или Неопределено — сравнение не сработает

Значение ссылки перед запросом
Норма

Ссылка заполнена, Пустая() = Ложь

Тревожный признак

Пустая ссылка — результат гарантированно пустой

Результат запроса
Норма

Результат.Пустой() = Ложь, поля заполнены

Тревожный признак

Пустой результат или NULL в разыменованных полях

Найденный элемент
Норма

Не помечен на удаление, не группа (если нужны элементы)

Тревожный признак

ПометкаУдаления = Истина или найдена группа

Частые вопросы

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

Нет. Ссылка и строка — разные типы, сравнение Поле = "Текст" вернёт ложь даже при совпадающем наименовании. Сначала найдите ссылку через НайтиПоНаименованию или отдельным запросом, затем используйте её как параметр.

Чем ЗНАЧЕНИЕ отличается от параметра?

ЗНАЧЕНИЕ встроено в текст запроса и работает только для предопределённых элементов и перечислений. Параметр универсальнее: через него передаётся любая ссылка, полученная в коде, включая обычные элементы, созданные пользователями.

Почему разыменование через точку возвращает NULL?

Потому что сама ссылка в поле пустая — разыменовывать нечего. Обработайте это через ЕСТЬ NULL или функцию ЕСТЬNULL(Поле.Реквизит, ЗначениеПоУмолчанию), чтобы заменить NULL на понятное значение.

Как в запросе проверить, что элемент помечен на удаление?

Через поле ПометкаУдаления: условие ГДЕ НЕ Номенклатура.ПометкаУдаления исключит помеченные элементы. Это булево поле есть у всех справочников и документов.

Можно ли обратиться к элементу справочника по УИД?

В языке запросов нет функции поиска по уникальному идентификатору. Ссылку по УИД получают в коде методом ПолучитьСсылку(Новый УникальныйИдентификатор(...)) менеджера справочника, а затем передают в запрос параметром.

Что быстрее: фильтр по ссылке или по наименованию?

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

Итог

Что важно запомнить

Элемент справочника в запросе идентифицируется ссылкой: передавайте её параметром, предопределённые элементы указывайте через ЗНАЧЕНИЕ, реквизиты получайте разыменованием через точку, а иерархию фильтруйте оператором В ИЕРАРХИИ. Избегайте сравнения по наименованию и всегда проверяйте параметр на пустую ссылку, а результат — на NULL.