В процессе разработки периодически возникает задача определить объект метаданных (например, конкретный справочник или документ), зная только его пользовательское наименование или текстовое представление, отображаемое в интерфейсе. Рассмотрим, как устроена работа с представлениями в платформе 1С:Предприятие, с какими техническими ограничениями сталкивается разработчик и как наиболее эффективно реализовать подобный поиск.
Выясним, почему поиск объекта по представлению не всегда является простой задачей. В платформе 1С существуют важные нюансы хранения и обработки пользовательских наименований:
ПредставлениеОбъекта задается в дереве метаданных и может отличаться от свойства Синоним или Имя. Кроме того, представление может переопределяться динамически в модуле менеджера объекта.Метаданные.НайтиПоПолномуИмени() и Метаданные.НайтиПоТипу(), однако специализированного метода для прямого поиска по строке представления не существует.Если задача требует находить объект метаданных именно по строковому представлению, выполним однократный обход дерева метаданных и сохраним результаты в кэш. Перебор метаданных при каждом обращении снижает производительность, поэтому обход логично обернуть в функцию общего модуля с режимом "Повторное использование возвращаемых значений" (на время сеанса).
Проанализируем пример кода, который формирует соответствие представлений объектам метаданных для справочников:
Функция ПолучитьКэшСправочниковПоПредставлению() Экспорт
Результат = Новый Соответствие;
Для Каждого ОписаниеСправочника Из Метаданные.Справочники Цикл
// Определяем приоритетное представление объекта
ТекПредставление = ОписаниеСправочника.ПредставлениеОбъекта;
Если Не ЗначениеЗаполнено(ТекПредставление) Тогда
ТекПредставление = ОписаниеСправочника.Синоним;
КонецЕсли;
Если Не ЗначениеЗаполнено(ТекПредставление) Тогда
ТекПредставление = ОписаниеСправочника.Имя;
КонецЕсли;
// Фиксируем соответствие строки представлению и метаданным
Результат.Вставить(СокрЛП(ТекПредставление), ОписаниеСправочника);
КонецЦикла;
Возврат Результат;
КонецФункции
Посмотрим, как использовать сформированный кэш в прикладном коде для быстрого поиска:
СоответствиеМетаданных = ПолучитьКэшСправочниковПоПредставлению();
ИскомоеПредставление = "Подразделение";
ОбъектМетаданных = СоответствиеМетаданных.Получить(ИскомоеПредставление);
Если ОбъектМетаданных <> Неопределено Тогда
ПолноеИмя = ОбъектМетаданных.ПолноеИмя();
// Дальнейшая работа с найденным объектом метаданных
КонецЕсли;
Чтобы избежать рисков, связанных с изменением синонимов или представлений при обновлениях конфигурации, разберем более надежные подходы к проектированию системы:
"Подразделение" передавайте и храните полное имя объекта, например "Справочник.ПодразделенияОрганизаций". Для получения метаданных по такому имени используется быстрое системное обращение:
ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени("Справочник.ПодразделенияОрганизаций");
ИдентификаторыОбъектовМетаданных. Ссылку на элемент этого справочника можно безопасно передавать между функциями и получать объект метаданных с помощью метода Метаданные.НайтиПоТипу().