Как найти элемент справочника по значению дополнительного реквизита в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В современных конфигурациях 1С, построенных на базе Библиотеки стандартных подсистем (БСП), таких как «Бухгалтерия предприятия 3.0», «Управление торговлей 11» или «ERP», механизмы хранения дополнительных данных реализованы через два основных инструмента: дополнительные реквизиты и дополнительные сведения. Часто перед разработчиком встает задача: найти объект (например, подразделение или номенклатуру), зная только значение этого расширенного свойства. Рассмотрим подробно, как это сделать правильно и эффективно.

Различие между дополнительными реквизитами и сведениями

Прежде чем приступать к написанию кода, проанализируем, где именно хранятся данные. Это критически важно для составления корректного запроса:

  1. Дополнительные реквизиты — хранятся непосредственно внутри объекта (справочника или документа) в специальной табличной части ДополнительныеРеквизиты.
  2. Дополнительные сведения — хранятся во внешнем по отношению к объекту регистре сведений ДополнительныеСведения.

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

Вариант 1: Поиск по дополнительному реквизиту (в табличной части)

Если нам нужно найти подразделение в «Бухгалтерии предприятия 3.0», у которого заполнен реквизит «Мерт», мы должны обращаться к табличной части справочника. Разберем по шагам пример кода, предложенный в обсуждении.

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


Функция НайтиОбъектПоДопРеквизиту(ЗначениеПоиска)
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |	ПодразделенияОрганизацийДополнительныеРеквизиты.Ссылка КАК Ссылка
    |ИЗ
    |	Справочник.ПодразделенияОрганизаций.ДополнительныеРеквизиты КАК ПодразделенияОрганизацийДополнительныеРеквизиты
    |ГДЕ
    |	ПодразделенияОрганизацийДополнительныеРеквизиты.Свойство.Имя = &ИмяСвойства
    |	И ПодразделенияОрганизацийДополнительныеРеквизиты.Значение = &Значение";
    
    // В параметре "Имя" указываем именно внутреннее имя, заданное в карточке реквизита
    Запрос.УстановитьПараметр("ИмяСвойства", "Мерт"); 
    Запрос.УстановитьПараметр("Значение", ЗначениеПоиска);
    
    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Пока Выборка.Следующий() Цикл
            Возврат Выборка.Ссылка; // Возвращаем первого найденного владельца
        КонецЦикла;
    КонецЕсли;
    
    Возврат Справочники.ПодразделенияОрганизаций.ПустаяСсылка();
КонецФункции

Важный нюанс: Чтобы этот поиск сработал, в настройках дополнительного реквизита (в ПВХ «Дополнительные реквизиты и сведения») в поле «Имя для разработчиков» (внизу карточки) должно быть прописано соответствующее значение (в нашем примере — Мерт).

Вариант 2: Поиск по дополнительным сведениям (в регистре)

Если же данные хранятся как дополнительные сведения, нам нужно анализировать регистр. Посмотрим на пример ситуации, когда используется оператор ПОДОБНО для поиска по части строки (хотя для точного поиска лучше использовать равенство):


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	ДопСведения.Объект КАК Владелец
|ИЗ
|	РегистрСведений.ДополнительныеСведения КАК ДопСведения
|ГДЕ
|	ДопСведения.Свойство = &Свойство
|	И ДопСведения.Значение ПОДОБНО &Значение";

// Здесь лучше передавать ссылку на свойство из ПВХ, а не искать по имени
Запрос.УстановитьПараметр("Свойство", СсылкаНаЭлементПВХ); 
Запрос.УстановитьПараметр("Значение", "%" + ИскомаяСтрока + "%");

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

Анализ проблем производительности и типичных ошибок

Проанализируем ситуацию, описанную в Сообщении 12, где запрос не возвращает данные в УТ 11.4. Одной из частых причин является использование составных типов данных в поле Значение. Поле Значение в табличной части имеет тип Характеристика.ДополнительныеРеквизитыИСведения. Если вы ищете ссылку (например, на другой справочник), передавайте в параметр именно Ссылку, а не строку с наименованием. Для контроля эффективности таких конструкций подойдёт обработка для проверки запросов на лишнюю выборку и разыменование составных полей.

Также рассмотрим архитектурные особенности БСП:

Рекомендация по обработке результатов

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


Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
    // Используйте обращение по имени поля для надежности
    НайденныйВладелец = Выборка.Ссылка; 
    // Дальнейшая логика обработки
КонецЦикла;

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

Таким образом, мы выяснили, что ключ к успешному поиску — это точное определение места хранения данных (ТЧ или Регистр) и использование индексируемых полей в условиях запроса. Для составления и быстрой отладки таких запросов можно использовать инженерную консоль запросов для 1С.

← На главную