Почему возникает ошибка Метод объекта не обнаружен при вызове экспортной процедуры документа в 1С и как её исправить?

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

При разработке и доработке конфигураций 1С разработчики нередко сталкиваются с ситуацией, когда попытка вызвать экспортную процедуру модуля объекта документа из внешней обработки или другой формы завершается сбоем. На первый взгляд код выглядит абсолютно корректным: процедура объявлена с ключевым словом Экспорт, обращение идет к объекту документа, а не к ссылке, но платформа упорно выдает ошибку: «Метод объекта не обнаружен». Проанализируем основные причины этой проблемы и разберем проверенные способы её решения.

1. Обращение к ссылке вместо объекта документа

Одна из наиболее частых причин ошибки — попытка вызвать процедуру модуля объекта у переменной, содержащей ссылку (тип ДокументСсылка), а не сам объект (тип ДокументОбъект). Процедуры модуля объекта недоступны напрямую из ссылки.

Рассмотрим пример. Если мы передаем в процедуру ссылку, её предварительно необходимо получить в виде объекта:


// Неправильно: вызов метода напрямую у ссылки
ДокументСсылка.ЗаполнитьУсловияПродажПоСоглашению(); // Вызовет ошибку "Метод объекта не обнаружен"

// Правильно: получение объекта документа из ссылки
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
ДокументОбъект.ЗаполнитьУсловияПродажПоСоглашению();
ДокументОбъект.Записать();

2. Смешение букв кириллицы и латиницы в названии метода

При копировании кода из сторонних источников или спецификаций в названии процедуры могут случайно оказаться латинские символы (например, латинская буква «C» вместо кириллической «С» в слове Соглашению). Для платформы 1С методы ЗаполнитьУсловияПродажПоCоглашению (с латинской C) и ЗаполнитьУсловияПродажПоСоглашению (с кириллической С) являются совершенно разными идентификаторами.

Для исправления достаточно вручную перенабрать имя процедуры в месте объявления и в месте вызова в русской раскладке клавиатуры.

3. Работа с реквизитом формы вместо объекта (ДанныеФормыСтруктура)

В управляемом приложении реквизит Объект на форме имеет тип ДанныеФормыСтруктура. Экспортные процедуры модуля объекта для него не существуют. Если вызов выполняется в контексте формы документа, данные сначала необходимо преобразовать в прикладной объект ДокументОбъект на сервере:


&НаСервере
Процедура ВыполнитьЗаполнениеНаСервере()
    ДокументОбъект = РеквизитФормыВЗначение("Объект");
    ДокументОбъект.ЗаполнитьУсловияПродажПоСоглашению();
    ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
КонецПроцедуры

4. Влияние инструкций препроцессора и контекста выполнения

Если экспортная процедура в модуле объекта обёрнута в условия препроцессора, например:


#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда
Процедура ЗаполнитьУсловияПродажПоСоглашению() Экспорт
    // Логика заполнения
КонецПроцедуры
#КонецЕсли

Процедура будет недоступна, если вызов происходит из контекста внешнего соединения или фонового задания, не попадающего под установленные флаги. Проанализируем контексты выполнения и при необходимости расширим условие препроцессора:


#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Процедура ЗаполнитьУсловияПродажПоСоглашению() Экспорт
    // Логика заполнения
КонецПроцедуры
#КонецЕсли

5. Использование модуля менеджера в качестве обертки

Если менять модуль объекта типовой конфигурации нежелательно или возникают проблемы с контекстом вызова из внешних обработок, эффективным решением служит вынос обращения в модуль менеджера документа.

Рассмотрим шаги по реализации такого обхода:

  1. В модуле менеджера документа (например, Документы.АктВыполненныхРабот) создаем экспортную процедуру-обертку, принимающую объект документа в качестве параметра:
    
    // В модуле менеджера документа
    Процедура ЗаполнитьУсловияПродажПоСоглашениюВОбъекте(ОбъектДокумента) Экспорт
        ОбъектДокумента.ЗаполнитьУсловияПродажПоСоглашению();
    КонецПроцедуры
    
  2. В модуле внешней обработки вызываем процедуру модуля менеджера, передавая ей экземпляр объекта:
    
    // В модуле обработки
    Документы.АктВыполненныхРабот.ЗаполнитьУсловияПродажПоСоглашениюВОбъекте(АктОбъект);
    

6. Сбой кэширования платформы при обновлениях

Иногда ошибка возникает из-за рассинхронизации кэша скомпилированных модулей после динамического обновления конфигурации или смены версии платформы. В этом случае помогают следующие действия:

  1. Очистить сеансовый кэш пользователя (запустить клиент с параметром /ClearCache).
  2. Очистить локальный кэш конфигурации 1С на сервере и рабочем месте.
  3. Перезапустить службу сервера 1С (1C:Enterprise 8.3 Server Agent).
← На главную