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