Разработка и Конфигурация · 10 мин
Как в запросе 1С обратиться к элементу справочника
Способы обратиться к элементу справочника в запросе 1С: ссылка, наименование, код, реквизиты, предопределённые элементы, параметры и типичные ошибки с примерами кода.
В языке запросов 1С обращение к элементу справочника — одна из самых частых операций: по нему фильтруют документы, соединяют таблицы, получают значения реквизитов. При этом у разработчиков регулярно возникают вопросы: чем отличается ссылка от наименования, как передать элемент параметром и как получить предопределённый элемент без обращения к менеджеру справочника.
Ключевой принцип: в запросе элемент справочника идентифицируется ссылкой, а не наименованием или кодом. Сравнение по наименованию работает медленнее и ненадёжно, потому что наименования могут совпадать, а ссылка уникальна всегда. Поэтому правильный подход — получить ссылку заранее и передать её в запрос параметром.
Ниже разобраны основные способы обращения к элементу справочника: через параметр-ссылку, через функцию ЗНАЧЕНИЕ для предопределённых элементов, через точку к реквизитам, а также типичные ошибки и способы проверить результат.
Как передать элемент справочника параметром запроса
Самый надёжный способ — передать ссылку на элемент через параметр. Ссылку получают заранее: из реквизита документа, из формы, через метод НайтиПоНаименованию или НайтиПоКоду менеджера справочника.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Номенклатура,
| Товары.Количество
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Товары
|ГДЕ
| Товары.Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", СсылкаНаЭлемент);
Результат = Запрос.Выполнить();
Параметр объявляется в тексте запроса через символ амперсанда (&), а значение устанавливается методом УстановитьПараметр до выполнения. Если параметр не установлен, запрос выдаст ошибку «Переменная не определена» — это одна из самых частых причин сбоев у начинающих разработчиков.
Проверить, что ссылка корректна, можно через ПроверкаЗаполненности: если СсылкаНаЭлемент.Пустая() возвращает Истина, запрос вернёт пустой результат, и это нужно обработать в коде до выполнения.
- 1Получите ссылку на элемент: из реквизита объекта или через Справочники.Имя.НайтиПоНаименованию()
- 2Проверьте, что ссылка не пустая: НЕ Ссылка.Пустая()
- 3В тексте запроса укажите условие Поле = &ИмяПараметра
- 4Вызовите Запрос.УстановитьПараметр с тем же именем
- 5Выполните запрос и проверьте, что результат не пустой
Как обратиться к предопределённому элементу через ЗНАЧЕНИЕ
Если элемент предопределённый (создан в конфигураторе), обращаться к нему можно прямо в тексте запроса функцией ЗНАЧЕНИЕ, без параметров и без обращения к базе средствами встроенного языка.
ВЫБРАТЬ
Контрагенты.Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.Ссылка = ЗНАЧЕНИЕ(Справочник.Контрагенты.РозничныйПокупатель)
После слова Справочник указывается имя справочника, затем имя предопределённого элемента — ровно так, как оно задано в конфигураторе, с учётом регистра. Ошибка в имени приведёт к ошибке компиляции запроса ещё до выполнения.
Важное ограничение: ЗНАЧЕНИЕ работает только для предопределённых элементов и значений перечислений. Обычный элемент, созданный пользователем в режиме предприятия, так получить нельзя — только через параметр-ссылку или поиск по реквизитам.
Как получить реквизиты элемента через точку
Когда в запросе есть поле ссылочного типа, к его реквизитам обращаются через точку — это называется разыменованием. Например, из табличной части документа можно сразу получить наименование, код и любой реквизит номенклатуры.
ВЫБРАТЬ
Товары.Номенклатура КАК Номенклатура,
Товары.Номенклатура.Наименование КАК Наименование,
Товары.Номенклатура.Артикул КАК Артикул,
Товары.Номенклатура.Родитель КАК Группа
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
Технически платформа при разыменовании выполняет неявное соединение с таблицей справочника. Один-два уровня разыменования — нормальная практика, но цепочки вида Поле.Реквизит.Реквизит.Реквизит замедляют запрос и затрудняют чтение. При глубоких обращениях лучше явно соединять таблицы через ЛЕВОЕ СОЕДИНЕНИЕ.
Если ссылка в поле пустая, разыменованные реквизиты вернут NULL. Это нужно учитывать в условиях: сравнение с NULL всегда даёт ложь, поэтому для проверки используют конструкцию ЕСТЬ NULL.
Поиск элемента по наименованию, коду и реквизитам в запросе
Иногда ссылки нет, и элемент нужно найти прямо в запросе — например, при сопоставлении загруженных из файла данных со справочником. Тогда фильтр строят по наименованию, коду или уникальному реквизиту.
ВЫБРАТЬ
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Наименование = &Наименование
И НЕ Номенклатура.ПометкаУдаления
При поиске по наименованию учитывайте три момента. Во-первых, сравнение в запросах 1С нечувствительно к регистру, но чувствительно к пробелам и скрытым символам — данные из Excel часто содержат неразрывные пробелы. Во-вторых, наименования могут дублироваться, поэтому надёжнее искать по коду или уникальному реквизиту (ИНН для контрагентов, штрихкод для товаров). В-третьих, всегда добавляйте отбор по пометке удаления, иначе найдёте удалённый элемент.
Для неточного поиска используется оператор ПОДОБНО с шаблоном: Наименование ПОДОБНО "%текст%". Такой запрос не использует индекс и на больших справочниках работает медленно — применяйте его только когда точного совпадения добиться нельзя.
Обращение к элементу в иерархическом справочнике
В иерархических справочниках часто нужно отобрать элементы, входящие в конкретную группу со всеми подгруппами. Для этого используется оператор В ИЕРАРХИИ с параметром-ссылкой на группу.
ВЫБРАТЬ
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)
И НЕ Номенклатура.ЭтоГруппа
Условие НЕ ЭтоГруппа исключает из выборки сами группы, если нужны только элементы. Учтите, что в справочниках с иерархией элементов (а не групп и элементов) поля ЭтоГруппа нет, и условие будет лишним.
Обратная задача — получить родителя элемента — решается разыменованием: Номенклатура.Родитель.Наименование. Уровень вложенности через Родитель.Родитель и дальше достижим, но для обхода глубокой иерархии запросом так делать не стоит — используйте В ИЕРАРХИИ или итоги по иерархии.
Как выбрать способ обращения
Как проверить результат запроса
После выполнения запроса убедитесь, что обращение к элементу сработало корректно. Первый признак проблемы — пустой результат там, где данные должны быть. Чаще всего причина в пустой ссылке-параметре, несовпадении типов или лишних пробелах в строке поиска.
Для отладки используйте консоль запросов в режиме предприятия: она показывает фактические значения параметров и результат до выборки в коде. Проверьте тип значения параметра — для ссылки он должен отображаться как «СправочникСсылка.ИмяСправочника», а не «Строка».
В коде результат проверяют методом Пустой(): Если Результат.Пустой() Тогда — и далее обработка ситуации «элемент не найден». Не обращайтесь к полям выборки без проверки, иначе при пустом результате получите ошибку или значения по умолчанию.
Как проверить результат
СправочникСсылка с нужным видом справочника
Строка или Неопределено — сравнение не сработает
Ссылка заполнена, Пустая() = Ложь
Пустая ссылка — результат гарантированно пустой
Результат.Пустой() = Ложь, поля заполнены
Пустой результат или NULL в разыменованных полях
Не помечен на удаление, не группа (если нужны элементы)
ПометкаУдаления = Истина или найдена группа
Частые вопросы
Можно ли в запросе сравнить ссылку с наименованием напрямую?
Нет. Ссылка и строка — разные типы, сравнение Поле = "Текст" вернёт ложь даже при совпадающем наименовании. Сначала найдите ссылку через НайтиПоНаименованию или отдельным запросом, затем используйте её как параметр.
Чем ЗНАЧЕНИЕ отличается от параметра?
ЗНАЧЕНИЕ встроено в текст запроса и работает только для предопределённых элементов и перечислений. Параметр универсальнее: через него передаётся любая ссылка, полученная в коде, включая обычные элементы, созданные пользователями.
Почему разыменование через точку возвращает NULL?
Потому что сама ссылка в поле пустая — разыменовывать нечего. Обработайте это через ЕСТЬ NULL или функцию ЕСТЬNULL(Поле.Реквизит, ЗначениеПоУмолчанию), чтобы заменить NULL на понятное значение.
Как в запросе проверить, что элемент помечен на удаление?
Через поле ПометкаУдаления: условие ГДЕ НЕ Номенклатура.ПометкаУдаления исключит помеченные элементы. Это булево поле есть у всех справочников и документов.
Можно ли обратиться к элементу справочника по УИД?
В языке запросов нет функции поиска по уникальному идентификатору. Ссылку по УИД получают в коде методом ПолучитьСсылку(Новый УникальныйИдентификатор(...)) менеджера справочника, а затем передают в запрос параметром.
Что быстрее: фильтр по ссылке или по наименованию?
По ссылке. Поле ссылки индексировано, а поиск по наименованию требует сравнения строк. На больших таблицах разница во времени выполнения заметна, поэтому всегда старайтесь свести условие к сравнению ссылок.
Что важно запомнить
Элемент справочника в запросе идентифицируется ссылкой: передавайте её параметром, предопределённые элементы указывайте через ЗНАЧЕНИЕ, реквизиты получайте разыменованием через точку, а иерархию фильтруйте оператором В ИЕРАРХИИ. Избегайте сравнения по наименованию и всегда проверяйте параметр на пустую ссылку, а результат — на NULL.