При реализации интеграции между 1С и внешними системами, такими как Битрикс, разработчики часто сталкиваются с ситуацией, когда код, успешно работающий в интерактивном режиме или из внешней обработки, «падает» с ошибкой при запуске в режиме обмена. Типичный пример такой ошибки — сбой на этапе конструктора документа.
Рассмотрим ситуацию: при выполнении стандартной команды загрузки данных из сайта система выдает ошибку:
{ОбщийМодуль.Б_ПроцедурыИФункцииЗагрузкиДанныхИзСайта.Модуль(1023)}: Ошибка при вызове метода контекста (СоздатьДокумент)
Причиной указывается сбой при подписке на событие (например, ПриЗаписи или ОбработкаПроведения), так как метод обработчика в общем модуле не найден. Разберем по шагам, почему это происходит и как исправить ситуацию.
Многих разработчиков сбивает с толку тот факт, что ошибка проявляется в момент вызова СоздатьДокумент(), хотя сам обработчик, на который ругается система, привязан к событию ОбработкаПроведения или ПриЗаписи. Казалось бы, запись или проведение еще не инициированы, почему платформа выдает ошибку сейчас?
Выясним причину: в архитектуре платформы 1С:Предприятие при инициализации нового объекта (вызове конструктора) система выполняет проверку валидности всех связанных подписок на события для данного типа метаданных. Даже если само событие в данный момент не вызывается, платформа проверяет наличие и доступность всех методов-обработчиков в текущем контексте выполнения. Если хотя бы один метод подписки недоступен, создание объекта блокируется.
Проанализируем ситуацию с контекстом. Обмен с Битриксом чаще всего выполняется на стороне сервера, часто в режиме фонового или регламентного задания. В этом режиме код выполняется в специфическом серверном окружении.
Рассмотрим основные требования к общему модулю, в котором расположен ваш обработчик (в примере это ОбменСЛотусомБитрикс):
Сервер.Экспорт.Если обработчик описан в модуле, который доступен только на клиенте, то при программном создании документа на сервере (что и происходит при обмене) система закономерно «не увидит» этот метод.
Если вы уверены, что флаги модуля расставлены верно, а процедура помечена как Экспорт, но ошибка сохраняется в рабочей базе (при этом работая в копии), мы имеем дело с проблемой кэширования метаданных. Динамическое обновление конфигурации (так называемое «демоническое») часто приводит к тому, что рабочие процессы сервера 1С продолжают использовать старую структуру связей подписок и методов.
Для решения этой проблемы выполним следующие действия:
srvinfo.Иногда корень проблемы кроется в «человеческом факторе». Проверим корректность настройки самой подписки на событие в дереве метаданных:
ИмяОбщегоМодуля.ИмяПроцедуры.Чтобы подписка работала стабильно в любом режиме (включая фоновые задания обмена), ваш общий модуль должен выглядеть примерно так (в свойствах модуля стоят галочки Сервер и Внешнее соединение):
// В общем модуле: ИмяМодуля (Сервер, Внешнее соединение)
Процедура ОбменСЛотусомБитрикс(Источник, Отказ, РежимПроведения) Экспорт
// Ваша логика обработки
Если Источник.ОбменДанными.Загрузка Тогда
Возврат; // Часто при обмене стоит пропускать лишнюю логику
КонецЕсли;
// Код обработки...
КонецПроцедуры
Если вы столкнулись с этой ошибкой, пройдите по следующему чек-листу:
Экспорт.