Почему возникает ошибка «Метод объекта не обнаружен» при вызове функции отчета на сервере и как её исправить?

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

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

Анализ ситуации: как воспроизводится ошибка

Рассмотрим стандартный пример кода в серверном общем модуле или регламентном задании, вызывающем экспортный метод объекта отчета:


ОтчетОбъект = Отчеты.НужныйОтчет.Создать();
ОтчетОбъект.СформироватьОтчет();

При выполнении этого кода платформа выбрасывает ошибку, утверждающую, что метод СформироватьОтчет не обнаружен у созданного объекта. При этом в самом модуле объекта отчета функция объявлена корректно и имеет ключевое слово Экспорт.

Выясним причину: влияние директив препроцессора и контекста выполнения

Проанализируем ключевой фактор, который чаще всего приводит к подобной проблеме. Модуль объекта может содержать инструкцию препроцессора, ограничивающую области компиляции кода:


#Если ТолстыйКлиентОбычноеПриложение Тогда

Функция СформироватьОтчет() Экспорт
    // Алгоритм формирования отчета
КонецФункции

#КонецЕсли

Выясним, что происходит при таком объявлении:

  1. Когда код запускается в режиме толстого клиента (особенно в файловом варианте), контекст приложения соответствует условию ТолстыйКлиентОбычноеПриложение. Код успешно компилируется, и метод становится доступен.
  2. Когда вызов происходит из серверного общего модуля (с флагами Сервер и Вызов сервера) или из регламентного задания, исполнение кода выполняется строго на сервере приложений 1С.
  3. Условие #Если ТолстыйКлиентОбычноеПриложение на сервере принимает значение Ложь. В результате платформа полностью исключает содержимое данного блока из компиляции на сервере.
  4. Созданный объект отчета на сервере просто «не знает» о существовании метода СформироватьОтчет, что и вызывает ошибку исполнения.

Дополнительные причины ошибки «Метод объекта не обнаружен»

Рассмотрим другие частые причины, из-за которых экспортный метод модуля объекта может быть недоступен на сервере:

  1. Отсутствие ключевого слова Экспорт: Процедура или функция объявлена в модуле объекта как локальная (например, Процедура СформироватьОтчет() вместо Процедура СформироватьОтчет() Экспорт).
  2. Ограничивающие инструкции клиентского контекста: Использование препроцессорных условий #Если НаКлиенте Тогда, #Если Клиент Тогда или #Если НЕ Сервер Тогда вокруг процедуры.
  3. Наличие интерактивного кода в модуле объекта: Если внутри метода используются вызовы диалоговых окон (например, Предупреждение, Вопрос) или обращение к клиентским элементам интерфейса, модуль не скомпилируется в неинтерактивном серверном контексте (фоновые и регламентные задания).

Способы решения и исправления ошибки

Разберем по шагам, как исправить проблему в зависимости от архитектуры вашего решения.

Способ 1. Корректировка директив препроцессора в модуле отчета

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


Функция СформироватьОтчет() Экспорт
    // Алгоритм, работающий с данными на сервере
КонецФункции

Если часть кода отчета действительно предназначена только для клиента (например, работа с формами), вынесем интерфейсное взаимодействие в модуль формы, оставив в модуле объекта только чистую бизнес-логику работы с данными.

Способ 2. Вынос метода в модуль менеджера отчета

Если для выполнения алгоритма не требуется хранить состояние конкретного экземпляра отчета, вынесем метод в модуль менеджера. В таком случае вызвать процедуру или функцию можно напрямую без вызова метода Создать():


// В модуле менеджера отчета:
Функция СформироватьОтчетСервер() Экспорт
    // Логика формирования
КонецФункции

// Вызов из общего модуля:
Отчеты.НужныйОтчет.СформироватьОтчетСервер();

Способ 3. Программное формирование отчета через СКД на сервере

Для фоновых и регламентных заданий рекомендуем использовать стандартные объекты платформы для работы со Схемой компоновки данных. Рассмотрим пример стандартного формирования отчета в ТабличныйДокумент на сервере:


ОтчетОбъект = Отчеты.НужныйОтчет.Создать();
СхемаКомпоновки = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

Настройки = СхемаКомпоновки.НастройкиПоУмолчанию;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

ТабличныйДокумент = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Таким образом, всегда проверяйте контекст исполнения кода и инструкции препроцессора. Это позволит избежать ошибок компиляции при вызове методов объектов 1С в серверных модулях и фоновых заданиях.

← На главную