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