При организации интеграции между различными версиями платформ 1С:Предприятия часто применяется механизм COM-соединения. Однако при попытке инициализировать объект другой версии платформы на стороне сервера разработчики нередко сталкиваются с ошибками: «Ошибка при вызове конструктора (COMОбъект): Интерфейс не поддерживается» или системными сбоями библиотек операционной системы. Рассмотрим подробно причины возникновения подобных неполадок и разберем практические способы решения задачи.
Проанализируем типовую ситуацию. Имеется сервер приложений под управлением устаревшей операционной системы (например, Windows 2000 Server), на котором функционирует рабочая база 1С версии 8.1. Поставлена задача организовать выгрузку данных в информационную базу под управлением 1С:Предприятия 8.2. Для этого разработчик пытается создать COM-объект:
Соединитель = Новый COMОбъект("V82.Application");
В момент вызова конструктора система возвращает ошибку о том, что интерфейс не поддерживается. Разберем по шагам, что именно происходит на уровне операционной системы и платформы:
V82.Application представляет собой полноценного клиента с графическим интерфейсом. Его регистрация в системе выполняется не через утилиту regsvr32, а запуском исполняемого файла платформы с ключом 1cv8.exe /RegServer. В свою очередь, внутрипроцессный сервер соединений V82.COMConnector регистрируется через библиотеку comcntr.dll. Попытка вызвать V82.Application на сервере 1С через службу без прав на работу с рабочим столом часто приводит к сбоям.comcntr.dll от версии 8.2 в операционной системе Windows 2000 возникает критическая ошибка: «Точка входа в процедуру freeaddrinfo не найдена в библиотеке DLL WS2_32.dll». Платформа 8.2 официально требует операционную систему не ниже Windows XP SP2 или Windows Server 2003. Функции freeaddrinfo и getaddrinfo для работы с сетевыми протоколами физически отсутствуют в системной библиотеке Windows 2000, поэтому скомпилированные бинарные модули 8.2 не могут быть загружены в адресное пространство.Когда сервер не позволяет выполнить прямое программное подключение к внешней базе, самым надежным и простым решением является переход на асинхронный файловый обмен. Разберем алгоритм построения такого взаимодействия:
Посмотрим на пример процедуры выгрузки данных в файл на стороне источника:
Процедура ВыгрузитьДанныеВФайл() Экспорт
ИмяФайла = "\\ServerShare\Exchange\data_export.xml";
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайла, "UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("ДанныеОбмена");
// Формирование структуры и выгрузка информации
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Элемент");
ЗаписьXML.ЗаписатьАтрибут("Код", Строка(Выборка.Код));
ЗаписьXML.ЗаписатьАтрибут("Наименование", Строка(Выборка.Наименование));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();
КонецПроцедуры
Если требуется сохранить обмен в рамках одной транзакции без промежуточных файлов, разберем смену направления инициализации. Поскольку операционная система, на которой развернута база 8.2, является более современной, она без проблем поддерживает компоненты 8.1.
comcntr.dll от версии 8.1 с помощью команды:
regsvr32 "C:\Program Files (x86)\1cv81\bin\comcntr.dll"
V81.COMConnector:
Соединитель = Новый COMОбъект("V81.COMConnector");
ПараметрыПодключения = "Srvr=""Server81"";Ref=""Base81"";Usr=""ExchangeUser"";Pwd=""Password"";";
Попытка
База81 = Соединитель.Connect(ПараметрыПодключения);
// Получение необходимых данных из базы 8.1
Исключение
ЗаписьЖурналаРегистрации("Ошибка подключения к 8.1",
УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
Рассмотрим альтернативные способы интеграции при жестких системных ограничениях:
WSСсылки или HTTPСоединение, передавая пакет данных напрямую через стек TCP/IP без использования специфических COM-компонентов.ADODB.Connection, стандартные системные драйверы которого поддерживаются операционными системами Windows любых поколений.