При интеграции систем часто возникает необходимость программно передавать данные из одной базы 1С в другую. Одной из наиболее популярных технологий для оперативного обмена является использование внешнего COM-соединения (объект V83.COMConnector). Разберем, как правильно организовать подключение, инициализировать документ в базе-приемнике и обойти типовые ошибки, связанные с контекстом исполнения программного кода.
Для создания объекта в базе-приемнике необходимо сначала установить с ней связь через COM-объект, после чего обратиться к соответствующему менеджеру документа. Проанализируем базовый пример кода на языке 1С:
// Получаем имя COM-соединителя для текущей платформы
ИмяCOM = ОбщегоНазначенияКлиентСервер.ИмяCOMСоединителя(); // Например, "V83.COMConnector"
COMConnector = Новый COMObject(ИмяCOM);
Попытка
// Устанавливаем соединение с файловой базой (для серверной используем Srvr="..." ; Ref="...")
СоединениеБД = COMConnector.Connect("File=""" + СокрЛП(КаталогБазы) + """; Usr=""Пользователь""; Pwd=""Пароль"";");
Исключение
Сообщить("Не удалось установить соединение с базой: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Создаем новый документ "Платежное поручение входящее" в приемнике
ППВ = СоединениеБД.Документы.ПлатежноеПоручениеВходящее.СоздатьДокумент();
ППВ.Дата = ТекущаяДата();
ППВ.ЗаполнитьНачальныеРеквизиты(); // Если метод объявлен как экспортный
// Записываем документ
ППВ.Записать(РежимЗаписиДокумента.Запись);
Сообщить("Документ успешно записан в приемнике!");
Обратите внимание на обращение к методам менеджера: вызов выполняется строго через полученный объект COM-соединения, например СоединениеБД.Документы.РеализацияТоваровУслуг.СоздатьДокумент().
В процессе выполнения кода разработчики часто сталкиваются со следующей ошибкой:
Ошибка при вызове метода контекста (СоздатьДокумент)... Процедура или функция с указанным именем не определена (Предупреждение)
Рассмотрим причину ее возникновения. Внешнее COM-соединение инициализирует внутрипроцессный серверный контекст без клиентской части и без интерфейса. Если в модуле объекта (или при обработке его событий) базы-приемника присутствуют прямые вызовы интерактивных процедур (Предупреждение, ПоказатьПредупреждение, Вопрос, ОткрытьФорму), платформа не сможет скомпилировать такой модуль в COM-сеансе.
Выясним, как разрешить эту проблему в зависимости от возможности менять конфигурацию-приемник:
#Если Клиент Тогда ... #КонецЕсли или #Если ТолстыйКлиентОбычноеПриложение Тогда ... #КонецЕсли.&Вместо) переопределить методы, содержащие вызов интерфейсных функций.V83.Application): вместо COMConnector можно использовать `V83.Application`. Этот режим запускает полноценный клиент 1С (его можно сделать невидимым, установив Visible = Ложь), в котором доступен весь интерфейсный контекст.Другая распространенная проблема возникает непосредственно при записи документа через COM-соединение:
Ошибка при вызове метода контекста (Записать)... Метод объекта не обнаружен (ИмяПроцедуры)
Разберем основные причины этого поведения:
V83.COMConnector платформой компилируются только те общие модули, у которых в свойствах установлен флаг «Внешнее соединение». Если обработчик события объекта (например, ПередЗаписью) обращается к функции модуля, у которого этот флаг снят, вызов завершится ошибкой.ОбменДанными.Загрузка: Установка свойства ППВ.ОбменДанными.Загрузка = Истина; отключает платформенные проверки, но не отменяет сам вызов программного кода в обработчиках событий объекта. Код в модуле будет пропущен только в том случае, если разработчик конфигурации явным образом прописал условие в самом начале процедуры:
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Если вносить изменения в базу-приемник нельзя, а COM-соединение падает из-за жестких ошибок в модулях, стоит рассмотреть следующие альтернативы: