Как получить объект метаданных по его представлению в 1С

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

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

Технические особенности и ограничения платформы

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

  1. Различие между синонимом и представлением: свойство ПредставлениеОбъекта задается в дереве метаданных и может отличаться от свойства Синоним или Имя. Кроме того, представление может переопределяться динамически в модуле менеджера объекта.
  2. Отсутствие встроенного метода: в платформе предусмотрены функции Метаданные.НайтиПоПолномуИмени() и Метаданные.НайтиПоТипу(), однако специализированного метода для прямого поиска по строке представления не существует.
  3. Неуникальность наименований: разные объекты (например, справочник и документ или два разных справочника) могут иметь одинаковое пользовательское представление или синоним. Поэтому поиск по строке принципиально не гарантирует получение единственного объекта.
  4. Мультиязычность и локализация: свойства представления зависят от языка сеанса текущего пользователя, что необходимо учитывать при сопоставлении строк.

Вариант 1. Построение кэша метаданных с повторным использованием

Если задача требует находить объект метаданных именно по строковому представлению, выполним однократный обход дерева метаданных и сохраним результаты в кэш. Перебор метаданных при каждом обращении снижает производительность, поэтому обход логично обернуть в функцию общего модуля с режимом "Повторное использование возвращаемых значений" (на время сеанса).

Проанализируем пример кода, который формирует соответствие представлений объектам метаданных для справочников:


Функция ПолучитьКэшСправочниковПоПредставлению() Экспорт

    Результат = Новый Соответствие;

    Для Каждого ОписаниеСправочника Из Метаданные.Справочники Цикл
        
        // Определяем приоритетное представление объекта
        ТекПредставление = ОписаниеСправочника.ПредставлениеОбъекта;
        Если Не ЗначениеЗаполнено(ТекПредставление) Тогда
            ТекПредставление = ОписаниеСправочника.Синоним;
        КонецЕсли;
        
        Если Не ЗначениеЗаполнено(ТекПредставление) Тогда
            ТекПредставление = ОписаниеСправочника.Имя;
        КонецЕсли;

        // Фиксируем соответствие строки представлению и метаданным
        Результат.Вставить(СокрЛП(ТекПредставление), ОписаниеСправочника);

    КонецЦикла;

    Возврат Результат;

КонецФункции

Посмотрим, как использовать сформированный кэш в прикладном коде для быстрого поиска:


СоответствиеМетаданных = ПолучитьКэшСправочниковПоПредставлению();
ИскомоеПредставление = "Подразделение";

ОбъектМетаданных = СоответствиеМетаданных.Получить(ИскомоеПредставление);

Если ОбъектМетаданных <> Неопределено Тогда
    ПолноеИмя = ОбъектМетаданных.ПолноеИмя();
    // Дальнейшая работа с найденным объектом метаданных
КонецЕсли;

Вариант 2. Альтернативные архитектурные решения

Чтобы избежать рисков, связанных с изменением синонимов или представлений при обновлениях конфигурации, разберем более надежные подходы к проектированию системы:

  1. Передача полного имени метаданных: вместо пользовательской строки "Подразделение" передавайте и храните полное имя объекта, например "Справочник.ПодразделенияОрганизаций". Для получения метаданных по такому имени используется быстрое системное обращение:
    
    ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени("Справочник.ПодразделенияОрганизаций");
    
  2. Использование Библиотеки Стандартных Подсистем (БСП): в типовых конфигурациях (например, 1С:Бухгалтерия) используется справочник ИдентификаторыОбъектовМетаданных. Ссылку на элемент этого справочника можно безопасно передавать между функциями и получать объект метаданных с помощью метода Метаданные.НайтиПоТипу().
  3. Явное сопоставление в настройках: если данные поступают из внешних источников (файлы загрузки, внешние сервисы), рекомендуется настроить регистр сведений или таблицу соответствий, где пользователь или администратор явным образом связывает внешнее имя с объектом конфигурации.
← На главную