При интеграции систем электронного документооборота (ЭДО), таких как СБИС (Saby), с конфигурациями «1С:Предприятие» разработчики часто используют программный интерфейс (API), предоставляемый внешними обработками. Однако случаются ситуации, когда идентичный код в одной базе работает корректно, а в другой выдает ошибку «Метод объекта не обнаружен», хотя сама обработка и ее методы физически присутствуют в файле. Рассмотрим подробнее причины такого поведения и разберем по шагам методы диагностики и устранения данной проблемы.
Проанализируем сценарий, с которым столкнулся автор темы. В конфигурации «1С:Управление торговлей 11.1» используется код для получения реестра документов через интеграционный модуль СБИС. Программное взаимодействие строится на получении формы внешней обработки, которая выступает в роли «Внешнего интерфейса».
Рассмотрим фрагмент кода, который инициирует работу с обработкой:
МаркировкаСервер.ПолучитьВнешнююОбработку();
ВИ = ПолучитьФорму("ВнешняяОбработка.СБИС.Форма.ВнешнийИнтерфейс");
Кэш = ВИ.сбисПодготовитьКэш();
СписокСертификатов = Кэш.Интеграция.ПолучитьСписокСертификатовДляАвторизации(Кэш,ТекстОшибки);
ПараметрыАвторизации = Новый Структура;
ПараметрыАвторизации.Вставить("ВходПоСертификату", Истина);
// выбираем сертификат
Для Каждого Элемент Из СписокСертификатов Цикл
СтруктураЗначениий = Элемент.Значение;
ПараметрыАвторизации.Вставить("Сертификат", СтруктураЗначениий.Отпечаток);
КонецЦикла;
УспешнаяАвторизация = ВИ.сбисАвторизация(Кэш, ПараметрыАвторизации);
ЗначенияФильтра = Новый Структура;
ЗначенияФильтра.Вставить("ФильтрДатаНач", Период.ДатаНачала);
ЗначенияФильтра.Вставить("ФильтрДатаКнц", Период.ДатаОкончания);
ЗначенияФильтра.Вставить("ФильтрСостояние", "Все документы");
ЗначенияФильтра.Вставить("ФильтрПериод", "За период");
ЗначенияФильтра.Вставить("ФильтрОрганизация", Организация);
ЗначенияФильтра.Вставить("ФильтрКонтрагент", Контрагент);
Раздел = "АккордеонДокОтгрВх11";
ПараметрыФильтрацииВходящие = Новый Структура;
ПараметрыФильтрацииВходящие.Вставить("ЗначенияФильтра", ЗначенияФильтра);
ПараметрыФильтрацииВходящие.Вставить("Раздел", Раздел);
ДопПараметры = Новый Структура;
Оповещение = Новый ОписаниеОповещения("ПолучитьДокументыПродолжение", ЭтотОбъект);
ДопПараметры.Вставить("ОбработчикРезультата", Оповещение);
Если УспешнаяАвторизация Тогда
ВИ.сбисПрочитатьНастройки(Кэш);
Если ОбновитьСтатусы Тогда
Результат = ВИ.сбисОбновлениеСтатусов(Кэш);
Иначе
// Ошибка возникает именно здесь
ВИ.сбисПолучитьРеестрДокументовОнлайна(ПараметрыФильтрацииВходящие, ДопПараметры);
КонецЕсли;
КонецЕсли;
В данном случае метод сбисОбновлениеСтатусов отрабатывает штатно, а следующий за ним метод сбисПолучитьРеестрДокументовОнлайна вызывает исключение. Выясним причину, почему платформа «не видит» экспортный метод формы, который точно там определен.
Самой распространенной причиной несоответствия программного кода в памяти и фактического кода в базе является кэширование. Платформа «1С:Предприятие» сохраняет скомпилированные модули и метаданные во временных папках на локальном компьютере пользователя для ускорения работы. Если при обновлении обработки или конфигурации кэш не обновился корректно, система может пытаться использовать «старое» описание объекта, в котором искомый метод отсутствует.
Выполним следующие шаги для очистки кэша:
%AppData%\Local\1C\1cv8\%AppData%\Roaming\1C\1cv8\5b6c8d9e-4f2a...).Как показывает практика и подтверждает автор темы, в большинстве случаев это полностью решает проблему.
Внешние обработки СБИС — это не просто файлы .epf, а сложные комплексы. При первом запуске обработка часто распаковывает свои внутренние DLL-библиотеки и вспомогательные модули в специальный каталог на диске. Если этот процесс был нарушен или у пользователя нет прав на запись, часть функционала формы ВнешнийИнтерфейс может оказаться недоступной.
Проанализируем состояние папки %AppData%\Local\Tensor\Saby1C (или аналогичной, в зависимости от версии SDK). Если очистка кэша 1С не помогла, попробуйте удалить эту папку. При следующем запуске обработка заново инициализирует свои компоненты, что может восстановить доступ к методу сбисПолучитьРеестрДокументовОнлайна.
Если конфигурации подключены к одному хранилищу, это гарантирует идентичность структуры метаданных, но не гарантирует идентичность двоичных данных во внешних обработках, загруженных в справочник ДополнительныеОтчетыИОбработки.
Рассмотрим ситуацию подробнее: метод сбисПолучитьРеестрДокументовОнлайна является относительно новым и предназначен для асинхронной работы с использованием объекта ОписаниеОповещения. В более старых версиях обработки СБИС этого метода просто не существовало.
Выясним актуальность версии, используя программный вызов:
Сообщить("Текущая версия интерфейса: " + ВИ.сбисВерсия());
Если версии в разных базах отличаются, необходимо принудительно обновить обработку в той базе, где возникает ошибка, загрузив актуальный файл .epf с сайта разработчика или из эталонной базы.
Важно помнить, что формы (и их методы) существуют только в клиентском контексте. Если код, приведенный в примере, вызывается из модуля, который скомпилирован с директивой &НаСервере, или внутри фонового задания, то попытка обращения к методам формы через ПолучитьФорму приведет к ошибке.
Проанализируем место вызова:
&НаКлиенте.сбисПолучитьРеестрДокументовОнлайна часто требует взаимодействия с криптографией на клиенте, поэтому серверный вызов для него принципиально невозможен.Столкнувшись с ошибкой «Метод объекта не обнаружен» для внешних интеграционных модулей, действуйте по алгоритму «от простого к сложному»:
Краткий чек-лист для исправления:
сбисВерсия()).Использование таких инструментов, как ОписаниеОповещения, делает код более надежным в современных версиях платформы, но требует внимательного отношения к обновлению всех компонентов системы в распределенной среде или при работе с несколькими экземплярами баз из одного хранилища.