При разработке отчетов или обработок с длительным выполнением на базе БСП (Библиотеки Стандартных Подсистем) разработчики часто сталкиваются с ситуацией, когда код корректно работает в тонком клиенте, но выдает ошибку при запуске через веб-интерфейс. Рассмотрим, почему это происходит и как устранить данную проблему.
Когда вы используете механизм длительных операций, платформа создает фоновое задание и через ОписаниеОповещения пытается вызвать процедуру завершения или процедуру прогресса. Ошибка Object method not found в данном контексте чаще всего означает, что веб-клиент не может обнаружить метод, указанный в структуре оповещения, в текущем модуле формы.
Основная причина кроется в различии архитектур выполнения кода. В тонком клиенте платформа более гибко обрабатывает вызовы, тогда как веб-клиент жестко привязан к клиентскому контексту исполнения (браузерному JavaScript). Если процедура, указанная в ОписаниеОповещения, помечена директивой &НаСервере, веб-клиент не сможет её вызвать, так как для него эта функция недоступна напрямую.
Для исправления ситуации необходимо перенести обработчик оповещения в контекст, доступный веб-клиенту. Разберем по шагам, что для этого нужно сделать.
ОписаниеОповещения.&НаСервере, измените её на &НаКлиенте.Экспорт.Рассмотрим пример правильной структуры процедуры обработки прогресса:
&НаКлиенте
Процедура ПрогрессВыполнения(Результат, ДополнительныеПараметры) Экспорт
// Здесь выполняем клиентскую логику обработки данных фонового задания
Если Результат.Статус = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
ОтключитьОбработчикОжидания("ОбработчикОжиданияИндикатор");
КонецЕсли;
// При необходимости вызываем серверный метод для получения детальных данных
ПрочитатьПрогрессНаСервере(Результат.ИдентификаторЗадания);
КонецПроцедуры
&НаСервере не подходит для callback-функцииМеханизм ВыполнитьОбработкуОповещения ожидает, что функция-обработчик будет найдена в контексте формы на стороне клиента. Поскольку веб-клиент исполняется в браузере, он не имеет прямого доступа к серверному контексту 1С для вызова методов напрямую. Когда платформа пытается выполнить вызов по имени, она обращается к доступным экспортным методам формы на клиенте. Не находя их (так как они живут на сервере), она возвращает ошибку Object method not found.
Чтобы убедиться, что проблема локализована верно, мы рекомендуем выполнить следующие действия:
Во-первых, проанализируйте содержимое ОписаниеОповещения в отладчике. Убедитесь, что имя метода в строке соответствует имени вашей процедуры.
Во-вторых, если отладка в веб-клиенте затруднена, используйте логирование (метод ЗаписатьЛог или просто Сообщить) внутри процедур, чтобы понять, на каком этапе выполнение прерывается. Если управление не попадает в процедуру, это верный признак того, что платформа не может разрешить ссылку на метод из-за неверной директивы компиляции.
В-третьих, проверьте, что сама переменная ДлительнаяОперация содержит корректную структуру оповещения. В механизме ДлительныеОперации БСП важно правильно заполнять параметры, чтобы платформа могла корректно сформировать обратный вызов (callback).
Работая с веб-клиентом 1С, всегда помните о строгом разделении контекстов. Клиентские события (оповещения) требуют клиентских обработчиков. Если вам требуется выполнить тяжелую логику на сервере, делайте это внутри клиентского метода через вызов серверного, а не пытайтесь сделать саму точку входа серверной. Этот подход обеспечит стабильную работу вашего кода во всех типах клиентов: от толстого до веб-версии в браузере.