Почему возникает ошибка «Метод объекта не обнаружен (Подключаемый_ВыполнитьКомандуНаСервере)» при внешнем заполнении формы и как её исправить?

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

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

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

Проанализируем ситуацию: в чем причина ошибки?

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

Выясним причину сбоя: в коде формы процедура Подключаемый_ВыполнитьКомандуНаСервере присутствует, но она не является экспортной. Раньше платформа 1С позволяла обращаться к процедурам модуля управляемой формы извне (через контекст формы), даже если у них не было ключевого слова Экспорт. Однако, начиная с версии платформы 8.3.15 (и в режиме совместимости 8.3.14), требования к инкапсуляции стали жестче.

Теперь, если процедура вызывается из общего модуля через точку от объекта формы, она обязательно должна быть помечена как Экспорт. Если этого слова нет — платформа «не видит» метод и выбрасывает исключение.

Способ 1: Использование расширения для изменения области видимости (Рекомендуемый)

Поскольку мы не хотим снимать основную конфигурацию с поддержки, лучшим решением будет использование механизма расширений. Рассмотрим этот процесс по шагам:

  1. Создадим новое расширение или откроем существующее.
  2. Добавим в расширение форму объекта, в которой возникает ошибка (например, форму элемента справочника Контрагенты).
  3. Перейдем в модуль формы расширения.
  4. Нам необходимо переопределить процедуру так, чтобы она стала доступна для внешнего вызова.

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


&НаСервере
&Вместо("Подключаемый_ВыполнитьКомандуНаСервере")
Процедура Расш_Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат) Экспорт
    // Вызываем оригинальную логику БСП, но теперь метод доступен извне
    ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Объект, Результат);
КонецПроцедуры

Важный нюанс: обратите внимание на ключевое слово Экспорт. Именно оно исправляет ошибку доступа. Теперь общий модуль БСП сможет успешно «достучаться» до этого метода.

Способ 2: Универсальное решение через перехват в общем модуле

Если форм, в которых возникает ошибка, слишком много, можно рассмотреть вариант изменения логики в самом общем модуле ПодключаемыеКомандыКлиент через расширение. Однако здесь нужно быть крайне осторожными, чтобы не нарушить работу стандартных механизмов.

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


&Вместо("ПродолжитьВыполнениеКоманды")
Процедура Расш_ПродолжитьВыполнениеКоманды(ПараметрыВыполнения, Результат)
    // ... (подготовительный код) ...
    
    Если ПараметрыВыполнения.Форма.ИмяФормы = "Документ.ПоступлениеНаРасчетныйСчет.Форма.ФормаДокумента" Тогда
        // Вызываем нашу добавленную экспортную процедуру
        ПараметрыВыполнения.Форма.Расш_Подключаемый_ВыполнитьКомандуНаСервере(СерверныйКонтекст, Результат);
    Иначе
        // Пытаемся выполнить стандартный вызов
        ПродолжитьВызов(ПараметрыВыполнения, Результат);
    КонецЕсли;
КонецПроцедуры

Этот метод позволяет точечно управлять вызовами, но он требует добавления соответствующих процедур в формы через расширения.

Нюансы работы со списками и объектами

Разберем важное замечание: при написании универсальных оберток помните, что подключаемые команды работают не только в формах объектов (где основным реквизитом является Объект), но и в формах списков (где основной реквизит — Список).

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


// В общем модуле с вызовом сервера
Процедура ВыполнитьКомандуНаСервере(Форма, Контекст, Результат) Экспорт
    
    ИмяОсновногоРеквизита = Форма.Параметры.ОсновнойРеквизит; // Условный пример получения
    // В БСП лучше использовать стандартные методы определения типа данных формы
    ПодключаемыеКоманды.ВыполнитьКоманду(Форма, Контекст, Форма[ИмяОсновногоРеквизита], Результат);
    
КонецПроцедуры

Почему в одних базах работает, а в других нет?

Рассмотрим ситуацию, когда в конфигурации «Комплексная автоматизация» все работает, а в «Бухгалтерии» — нет. Весь секрет кроется в режиме совместимости. Если в свойствах конфигурации установлен режим совместимости 8.3.12, платформа игнорирует отсутствие Экспорт и позволяет вызов. Если же режим установлен в 8.3.14 или выше — ошибка неизбежна.

Подведем итог: разработчики 1С уже исправили эту проблему в новых версиях БСП (начиная с 3.1.3), сделав процедуру Подключаемый_ВыполнитьКомандуНаСервере экспортной по умолчанию. Если ваша конфигурация (например, для Беларуси) еще базируется на старой версии БСП, использование расширений для добавления Экспорт — самый быстрый, безопасный и правильный путь решения проблемы.

← На главную