При работе с внешними обработками типа «Заполнение формы» в конфигурациях, использующих Библиотеку стандартных подсистем (БСП), разработчики часто сталкиваются с досадной ошибкой. Программа внезапно прерывает работу с сообщением: Метод объекта не обнаружен (Подключаемый_ВыполнитьКомандуНаСервере). Особенно часто это проявляется в локализованных решениях, например, в «Бухгалтерии для Беларуси», или при обновлении платформы на свежие релизы.
В этой статье мы подробно разберем, почему «мистическим» образом код, который годами работал исправно, начинает выдавать ошибки, и как это исправить, сохранив конфигурацию на поддержке.
Давайте разберем механику вызова. Когда пользователь нажимает кнопку заполнения, управление передается в общий модуль ПодключаемыеКомандыКлиент, процедура ПродолжитьВыполнениеКоманды. Этот модуль пытается вернуть выполнение в контекст формы, вызывая метод Контекст.Форма.Подключаемый_ВыполнитьКомандуНаСервере(СерверныйКонтекст, Результат).
Выясним причину сбоя: в коде формы процедура Подключаемый_ВыполнитьКомандуНаСервере присутствует, но она не является экспортной. Раньше платформа 1С позволяла обращаться к процедурам модуля управляемой формы извне (через контекст формы), даже если у них не было ключевого слова Экспорт. Однако, начиная с версии платформы 8.3.15 (и в режиме совместимости 8.3.14), требования к инкапсуляции стали жестче.
Теперь, если процедура вызывается из общего модуля через точку от объекта формы, она обязательно должна быть помечена как Экспорт. Если этого слова нет — платформа «не видит» метод и выбрасывает исключение.
Поскольку мы не хотим снимать основную конфигурацию с поддержки, лучшим решением будет использование механизма расширений. Рассмотрим этот процесс по шагам:
Контрагенты).Проанализируем пример кода, который нужно добавить в расширение:
&НаСервере
&Вместо("Подключаемый_ВыполнитьКомандуНаСервере")
Процедура Расш_Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат) Экспорт
// Вызываем оригинальную логику БСП, но теперь метод доступен извне
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Объект, Результат);
КонецПроцедуры
Важный нюанс: обратите внимание на ключевое слово Экспорт. Именно оно исправляет ошибку доступа. Теперь общий модуль БСП сможет успешно «достучаться» до этого метода.
Если форм, в которых возникает ошибка, слишком много, можно рассмотреть вариант изменения логики в самом общем модуле ПодключаемыеКомандыКлиент через расширение. Однако здесь нужно быть крайне осторожными, чтобы не нарушить работу стандартных механизмов.
Рассмотрим логику, предложенную опытными разработчиками: мы можем проверить имя формы и, если это «проблемная» форма, вызвать наш экспортный метод. Посмотрим на пример такой реализации в расширении для общего модуля:
&Вместо("ПродолжитьВыполнениеКоманды")
Процедура Расш_ПродолжитьВыполнениеКоманды(ПараметрыВыполнения, Результат)
// ... (подготовительный код) ...
Если ПараметрыВыполнения.Форма.ИмяФормы = "Документ.ПоступлениеНаРасчетныйСчет.Форма.ФормаДокумента" Тогда
// Вызываем нашу добавленную экспортную процедуру
ПараметрыВыполнения.Форма.Расш_Подключаемый_ВыполнитьКомандуНаСервере(СерверныйКонтекст, Результат);
Иначе
// Пытаемся выполнить стандартный вызов
ПродолжитьВызов(ПараметрыВыполнения, Результат);
КонецЕсли;
КонецПроцедуры
Этот метод позволяет точечно управлять вызовами, но он требует добавления соответствующих процедур в формы через расширения.
Разберем важное замечание: при написании универсальных оберток помните, что подключаемые команды работают не только в формах объектов (где основным реквизитом является Объект), но и в формах списков (где основной реквизит — Список).
Если вы решите вынести вызов ПодключаемыеКоманды.ВыполнитьКоманду в отдельный серверный модуль, вам придется динамически определять основной реквизит формы. В противном случае внешние печатные формы или команды заполнения в списках могут перестать работать. Проанализируем, как это может выглядеть:
// В общем модуле с вызовом сервера
Процедура ВыполнитьКомандуНаСервере(Форма, Контекст, Результат) Экспорт
ИмяОсновногоРеквизита = Форма.Параметры.ОсновнойРеквизит; // Условный пример получения
// В БСП лучше использовать стандартные методы определения типа данных формы
ПодключаемыеКоманды.ВыполнитьКоманду(Форма, Контекст, Форма[ИмяОсновногоРеквизита], Результат);
КонецПроцедуры
Рассмотрим ситуацию, когда в конфигурации «Комплексная автоматизация» все работает, а в «Бухгалтерии» — нет. Весь секрет кроется в режиме совместимости. Если в свойствах конфигурации установлен режим совместимости 8.3.12, платформа игнорирует отсутствие Экспорт и позволяет вызов. Если же режим установлен в 8.3.14 или выше — ошибка неизбежна.
Подведем итог: разработчики 1С уже исправили эту проблему в новых версиях БСП (начиная с 3.1.3), сделав процедуру Подключаемый_ВыполнитьКомандуНаСервере экспортной по умолчанию. Если ваша конфигурация (например, для Беларуси) еще базируется на старой версии БСП, использование расширений для добавления Экспорт — самый быстрый, безопасный и правильный путь решения проблемы.