В процессе разработки и поддержки внешних обработок для платформы 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда решение идеально работает в тонком или толстом клиенте, но выдает критическую ошибку при запуске через браузер (веб-клиент). Одной из наиболее распространенных и неприятных проблем является ошибка: «{ОбщийМодуль.ДополнительныеОтчетыИОбработкиКлиент.Модуль(322)}: Метод объекта не обнаружен (ВыполнитьКоманду)». Рассмотрим подробно причины этого поведения и разберем по шагам способы устранения проблемы.
Ситуация обычно выглядит следующим образом: внешняя обработка заполнения табличной части или печатная форма корректно подключена к информационной базе через справочник ДополнительныеОтчетыИОбработки. При нажатии на кнопку выполнения команды в настольном приложении все отрабатывает штатно. Однако в веб-клиенте система аварийно завершает работу, ссылаясь на отсутствие метода в форме обработки.
Проанализируем строку кода в общем модуле ДополнительныеОтчетыИОбработкиКлиент, на которую указывает ошибка. Как правило, это вызов вида:
ФормаВнешнегоОбъекта.ВыполнитьКоманду(ПараметрыВызоваСервера.ИдентификаторКоманды, ПараметрыВызоваСервера.ОбъектыНазначения);
Здесь система пытается обратиться к экспортному методу формы внешней обработки. Ошибка «Метод объекта не обнаружен» означает, что объект ФормаВнешнегоОбъекта в контексте веб-клиента по какой-то причине не содержит или «не видит» процедуру ВыполнитьКоманду.
Прежде чем грешить на платформу, проверим базовые требования к оформлению кода внешней обработки. Выясним, правильно ли объявлена процедура. Она должна соответствовать трем критериям:
&НаКлиенте.Экспорт.Пример правильного объявления процедуры в модуле формы:
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
// Логика выполнения команды
РассмотримДействиеНаКлиенте(ИдентификаторКоманды, ОбъектыНазначения);
КонецПроцедуры
Важный момент: проверьте наличие инструкций препроцессора. Иногда разработчики случайно оборачивают методы в блоки #Если НЕ ВебКлиент Тогда или забывают, что методы, доступные в тонком клиенте, могут быть исключены для веб-клиента настройками модуля. Убедитесь, что вокруг процедуры нет условий, ограничивающих её видимость в браузере.
Если код написан верно, но ошибка сохраняется только в веб-клиенте, мы имеем дело с особенностями платформы. В ветках 8.3.18, 8.3.19 и особенно массово в 8.3.20.1549/1590 был зафиксирован баг, связанный с потерей контекста формы внешних объектов. Платформа в режиме веб-клиента некорректно пробрасывает экспортные методы формы, если форма открывается программно через механизмы БСП (Библиотеки стандартных подсистем).
Проанализируем ситуацию: в тонком клиенте метод виден через отладку в объекте «Форма», а в веб-клиенте этот же объект в той же строке кода общего модуля теряет свои экспортные методы. Это прямое следствие программной ошибки в ядре платформы. Единственным надежным решением в данном случае является обновление платформы 1С:Предприятие до последних стабильных релизов (например, переход на актуальные сборки 8.3.21 или 8.3.22, где этот механизм был исправлен).
Часто проблема усугубляется при обновлении версии платформы на сервере без обновления расширений веб-сервера (Apache или IIS). Если компоненты веб-сервера остались от старой версии, а сервер приложений работает на новой, дескрипторы объектов могут передаваться некорректно.
Выполним следующие действия для исправления конфигурации веб-сервера:
.js и библиотечные зависимости в каталоге публикации).World Wide Web Publishing Service для IIS или Apache2.4).Если оперативно обновить платформу невозможно, применим «Workaround» (обходное решение). В справочнике «Дополнительные отчеты и обработки» для каждой команды можно указать ее тип. Рассмотрим, как изменение типа команды влияет на ошибку:
Печать или ВыполнитьКоманду. Это полностью исключает клиентский контекст веб-браузера из цепочки вызова и решает проблему.Веб-клиент накладывает более жесткие ограничения на выполнение кода в безопасном режиме. Если внешняя обработка подключена с установленным флагом «Безопасный режим», платформа может блокировать вызовы динамически определенных методов из соображений безопасности.
Попробуем провести тест: временно отключим безопасный режим для данной обработки в справочнике. Если ошибка исчезнет, значит, необходимо либо работать без безопасного режима, либо настроить профиль безопасности, разрешающий выполнение соответствующих операций в контексте веб-сервера.
Не стоит забывать и о специфике работы самих браузеров. Веб-клиент 1С кэширует описание форм и скрипты. После обновления обработки или платформы браузер может продолжать использовать старое описание формы, в котором метод ВыполнитьКоманду еще не был экспортным или отсутствовал. Проанализируем это, запустив базу в режиме «Инкогнито». Если в инкогнито все работает — необходимо произвести полную очистку кэша браузера у всех пользователей.
Резюме: столкнувшись с ошибкой «Метод объекта не обнаружен (ВыполнитьКоманду)» в веб-клиенте, первым делом проверьте экспортный статус процедуры и отсутствие ограничений препроцессора. Если код верен — обновите платформу и переопубликуйте информационную базу на веб-сервере, так как в большинстве случаев на релизах 8.3.20 это является следствием системной ошибки платформы.