Как вызвать функцию модуля объекта из формы в 1С 8.3 и исправить ошибку «Метод объекта не обнаружен»?

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

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

Причины возникновения ошибки «Метод объекта не обнаружен»

Проанализируем типичные ошибки, которые приводят к неработоспособности кода:

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

Шаг 1. Объявление экспортной функции в модуле объекта

Рассмотрим правильное объявление функции в модуле объекта. Чтобы результат запроса можно было передать на форму, метод должен содержать ключевое слово Экспорт.


Функция РеалТоваров() Экспорт

    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Номенклатура,
        |   Количество,
        |   Сумма
        |ИЗ
        |   Документ.РеализацияТоваровУслуг.Товары
        |ГДЕ
        |   Ссылка = &Ссылка";
    
    Запрос.УстановитьПараметр("Ссылка", ЭтотОбъект.Ссылка);
    
    Возврат Запрос.Выполнить();

КонецФункции

Шаг 2. Вызов функции из модуля управляемой формы

Выясним причину, по которой нельзя обратиться к модулю объекта напрямую на клиенте. Клиентский контекст формы хранит данные в виде легковесного реквизита Объект (тип ДанныеФормыСтруктура), у которого нет методов прикладного объекта. Чтобы получить доступ к процедурам и функциям объекта, необходимо на сервере выполнить преобразование реквизита формы в полноценный прикладной объект с помощью метода РеквизитФормыВЗначение.

Также важно помнить об ограничении платформы: объекты РезультатЗапроса и ВыборкаИзРезультатаЗапроса не сериализуются и не могут передаваться с сервера на клиент. Обработку выборки необходимо выполнять на сервере.

Посмотрим на пример правильной реализации в модуле формы:


&НаКлиенте
Процедура Сформировать(Команда)
    
    // Вызываем серверную процедуру для обработки данных
    СформироватьНаСервере();
    
КонецПроцедуры

&НаСервере
Процедура СформироватьНаСервере()
    
    // Получаем реальный прикладной объект из реквизита формы
    ЭтотОбъектВПамяти = РеквизитФормыВЗначение("Объект");
    
    // Вызываем экспортную функцию обязательно со скобками
    РезультатЗапроса = ЭтотОбъектВПамяти.РеалТоваров();
    
    // Выполняем обход данных на сервере
    Выборка = РезультатЗапроса.Выбрать();
    Пока Выборка.Следующий() Цикл
        // Обработка полученных строк
    КонецЦикла;
    
КонецПроцедуры

Особенности метода РеквизитФормыВЗначение

Разберем важные нюансы работы с преобразованием формы в значение:

  1. Накладные расходы. Метод РеквизитФормыВЗначение инициализирует объект в серверной памяти целиком, заполняя все его реквизиты и табличные части данными с формы. Если тяжелые вызовы выполняются часто, это создает нагрузку на сервер.
  2. Обратная синхронизация. Если вызванная функция модуля объекта модифицирует данные объекта (например, заполняет реквизит или табличную часть), изменения не отобразятся на форме автоматически. Чтобы обновить экранные данные, необходимо вызвать обратный метод ЗначениеВРеквизитФормы(ЭтотОбъектВПамяти, "Объект").

Альтернативные варианты архитектуры

Проанализируем ситуации, когда использовать модуль объекта не обязательно:

  1. Перенос логики в модуль формы. Если результат запроса необходим исключительно для отображения на конкретной форме и алгоритм не используется из других мест конфигурации, практичнее разместить функцию прямо в модуле формы с директивой &НаСервере. Это избавит от необходимости создавать объект через РеквизитФормыВЗначение.
  2. Использование общего модуля. Если алгоритм формирования данных является универсальным, по стандартам разработки 1С его рекомендуется выносить в общий модуль с установленным признаком выполнения на сервере.
← На главную