При разработке универсальных механизмов загрузки, обмена данными или обработки разнородных документов разработчики часто сталкиваются с ситуацией, когда имя объекта метаданных не зашито в программном коде жестко, а хранится в строковой переменной. В таких случаях классическое обращение через точку вида Справочники.Номенклатура не подходит. Разберем по шагам, как правильно обратиться к менеджеру справочника по текстовому имени и корректно выполнить поиск нужного элемента.
В платформе 1С:Предприятие глобальная коллекция Справочники поддерживает доступ к своим элементам не только через точку по идентификатору, но и по индексу с использованием квадратных скобок. В качестве индекса может выступать строковая переменная с точным именем справочника, как оно задано в дереве конфигурации.
Посмотрим на базовый пример обращения и вызова стандартного метода поиска:
ИмяСправочника = "Контрагенты";
ИскомоеНаименование = "ООО Ромашка";
СсылкаНаОбъект = Справочники[ИмяСправочника].НайтиПоНаименованию(ИскомоеНаименование, Истина);
Такой синтаксис полностью аналогичен прямому обращению через точку, но дает возможность динамически подставлять имя целевого объекта во время выполнения кода.
Проанализируем потенциальную проблему: если строковая переменная с именем справочника получена из внешнего источника (файла Excel, XML, JSON) или введена пользователем в интерфейсе, в ней может оказаться опечатка или имя несуществующего объекта. Прямое обращение Справочники[ИмяСправочника] в этом случае немедленно вызовет исключение времени выполнения.
Чтобы избежать аварийного завершения работы алгоритма, разберем прием предварительной проверки через коллекцию метаданных:
Если Метаданные.Справочники.Найти(ИмяСправочника) <> Неопределено Тогда
Менеджер = Справочники[ИмяСправочника];
СсылкаНаОбъект = Менеджер.НайтиПоНаименованию(ИскомоеНаименование, Истина);
Иначе
// Обработка ситуации, когда указанный справочник отсутствует в конфигурации
ВызватьИсключение "Справочник с именем """ + ИмяСправочника + """ не найден в метаданных!";
КонецЕсли;
Метод менеджера НайтиПоНаименованию прост в использовании, однако при его применении важно учитывать следующие критические нюансы:
ТочноеСоответствие) по умолчанию имеет значение Ложь. Это означает, что платформа ищет элемент по вхождению с начала строки. Например, при попытке найти «Кабель» метод может вернуть «Кабель силовой 3х1.5». Чтобы найти строгое совпадение, всегда явно передавайте вторым параметром Истина.Родитель) или четвертого (Владелец) параметров выполняется по всей таблице без учета структуры.Наименование, строка поиска автоматически усекается до максимальной длины.Когда требуется обойти ограничения стандартного метода, исключить удаленные объекты или выявить дубликаты, рассмотрим построение динамического запроса. В тексте запроса имя таблицы конкатенируется с переменной имени справочника:
Если Метаданные.Справочники.Найти(ИмяСправочника) <> Неопределено Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Спр.Ссылка КАК Ссылка
|ИЗ
| Справочник." + ИмяСправочника + " КАК Спр
|ГДЕ
| Спр.Наименование = &Наименование
| И НЕ Спр.ПометкаУдаления";
Запрос.УстановитьПараметр("Наименование", ИскомоеНаименование);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
СсылкаНаОбъект = Выборка.Ссылка;
Иначе
СсылкаНаОбъект = Справочники[ИмяСправочника].ПустаяСсылка();
КонецЕсли;
КонецЕсли;
Использование запроса дает разработчику полный контроль над условиями отбора, позволяя проверить количество найденных записей или дополнительно отфильтровать элементы по нужным реквизитам.
Выясним причину возможного замедления работы системы при частом поиске по наименованию. Скорость выполнения операции (как через метод менеджера, так и через запрос) напрямую зависит от свойств метаданных справочника:
Наименование.