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