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