Как получить синоним или представление документа по его строковому имени в 1С?

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

При разработке универсальных механизмов, обработок выгрузки или отчетов часто возникает ситуация, когда в переменной хранится строковое имя объекта конфигурации (например, "КорректировкаКачестваТоваров" или "АвансовыйОтчет"), а пользователю в интерфейсе требуется показать понятное название — его синоним или представление. Разберем различные способы решения этой задачи средствами встроенного языка 1С:Предприятие.

Способ 1. Прямое обращение к коллекции метаданных по индексу-имени

Самый простой и быстрый способ получить объект метаданных и его синоним — обратиться к коллекции Метаданные.Документы, передав имя объекта в квадратных скобках. Посмотрим на пример кода:


ИмяДокумента = "КорректировкаКачестваТоваров";
СинонимДокумента = Метаданные.Документы[ИмяДокумента].Синоним;

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

Способ 2. Безопасный поиск через метод Найти()

Чтобы избежать аварийного завершения программы при отсутствии объекта, разберем более надежный подход с использованием метода Найти(). Данный метод возвращает объект описания метаданных либо Неопределено, если объект с таким именем не существует.

Напишем безопасный алгоритм получения синонима:


ИмяДокумента = "КорректировкаКачестваТоваров";
ОбъектМетаданных = Метаданные.Документы.Найти(ИмяДокумента);

Если ОбъектМетаданных <> Неопределено Тогда
    СинонимДокумента = ОбъектМетаданных.Синоним;
Иначе
    // Обработка ситуации, когда документ в конфигурации не найден
    СинонимДокумента = ИмяДокумента;
КонецЕсли;

Способ 3. Универсальный поиск по полному имени метаданных

Если алгоритм работает с разными типами объектов (документы, справочники, регистры) и тип заранее не зашит жестко в коде, удобно использовать метод корня метаданных НайтиПоПолномуИмени(). В качестве параметра передается строка вида "Документ.ИмяОбъекта".

Посмотрим на пример универсального получения синонима:


ПолноеИмя = "Документ." + ИмяДокумента;
ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмя);

Если ОбъектМетаданных <> Неопределено Тогда
    Синоним = ОбъектМетаданных.Синоним;
КонецЕсли;

Обратите внимание: имя класса метаданных в строке указывается строго в единственном числе — "Документ", "Справочник", "РегистрСведений".

Способ 4. Получение метаданных через ссылку или тип

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

Синоним = Документы[ИмяДокумента].ПустаяСсылка().Метаданные().Синоним;

Также можно воспользоваться приведением через строковое представление типа:


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

Обработка пустых синонимов и специальных представлений

Проанализируем важную деталь: разработчик конфигурации может оставить свойство Синоним незаполненным. В этом случае свойство вернет пустую строку, что приведет к пустому заголовку в интерфейсе. Кроме того, у документов существуют расширенные свойства: ПредставлениеОбъекта, РасширенноеПредставлениеОбъекта, ПредставлениеСписка.

Рекомендуется использовать следующую последовательность проверки для получения корректного пользовательского названия:

  1. Проверяем наличие заполненного ПредставлениеОбъекта или Синоним.
  2. Если они не заполнены, используем системное свойство Имя.

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

Использование функций Библиотеки стандартных подсистем (БСП)

Если ваша конфигурация построена на базе БСП, не обязательно писать собственные проверки на пустые строки. В общем модуле ОбщегоНазначенияКлиентСервер предусмотрены готовые сервисные функции:


// Гарантированно вернет синоним или имя объекта, если синоним пустой
Синоним = ОбщегоНазначенияКлиентСервер.СинонимОбъекта(Метаданные.Документы[ИмяДокумента]);

// Возвращает наиболее подходящее представление с учетом настроек объекта
Представление = ОбщегоНазначенияКлиентСервер.ПредставлениеОбъектаМетаданных(Метаданные.Документы[ИмяДокумента]);

Таким образом, для простых задач достаточно обратится через Метаданные.Документы[Имя].Синоним, а для надежного промышленного кода лучше применять поиск через Найти() с проверкой на заполненность возвращаемого значения.

← На главную