При настройке интеграции между различными конфигурациями «1С:Предприятия» программисты часто используют COM-соединение. Однако при попытке связать базы, работающие на разных версиях платформы (например, базу-источник на платформе 8.3 и базу-приемник на 8.2), возникают критические сбои: аварийное завершение работы программы без вывода диагностических сообщений, несоответствие версий клиента и сервера либо системная ошибка «Ошибка при вызове конструктора (COMОбъект): Недопустимая строка с указанием класса».
Разберем детально, почему возникают подобные неполадки, как операционная система Windows работает с библиотеками comcntr.dll и каким образом правильно настроить подключение с использованием механизма COM+ в службах компонентов Windows.
Рассмотрим типовой сценарий. Из конфигурации «1С:Розница 2.2» (работающей на платформе 8.3.8.2167) необходимо программно подключиться к серверной базе «Управление производственным предприятием» (УПП), функционирующей на платформе 8.2.19.130. В исходном коде используется стандартная конструкция:
СтрокаПодключения = "Srvr=It-dbs.rvk.local; Ref=copyuppkvk8_2; Usr=user; Pwd=pass";
Попытка
База = Новый COMОбъект("V82.COMConnector");
мСоединение = База.Connect(СтрокаПодключения);
Исключение
Сообщить("Не удалось подключиться: " + ОписаниеОшибки());
КонецПопытки;
При выполнении этого кода разработчики сталкиваются с рядом препятствий:
V82.COMConnector процесс программы внезапно закрывается. Это происходит из-за конфликта разрядностей (например, 64-битный рабочий процесс 1С пытается напрямую загрузить в свое адресное пространство 32-битную DLL) либо из-за одновременной загрузки несовместимых модулей разных версий платформ.V8.COMConnector или V82.COMConnector, отсутствует в реестре Windows по ветке HKEY_CLASSES_ROOT, либо зарегистрирован некорректно.V83.COMConnector, компонента пытается инициировать протокол взаимодействия версии 8.3 с кластером серверов, на котором работает 8.2, что приводит к блокировке соединения протоколом кластера 1С.Для успешного подключения к серверной базе 8.2 из 8.3 критически важно, чтобы на том компьютере, где физически выполняется код (на клиенте при клиентском вызове или на сервере приложений 1С при выполнении на сервере), была установлена платформа 8.2 в точности того же релиза, что и сервер целевой базы (в нашем примере — 8.2.19.130). Одной лишь установки 8.3 недостаточно: клиентские библиотеки 8.2 физически должны присутствовать на диске.
Создание выделенного COM+-приложения через системную оснастку Службы компонентов (Component Services) — наиболее стабильный способ решения конфликтов разрядности и сосуществования разных версий библиотек 1С. Библиотека коннектора запускается в отдельном изолированном суррогатном процессе операционной системы dllhost.exe, что предотвращает падение рабочего процесса 1С.
Разберем настройку по шагам:
dcomcnfg и нажмите Enter.V82_COMConnector, и обязательно выберите режим активации Серверное приложение (Server application). Это позволит запускать библиотеку в изолированном процессе dllhost.exe и обеспечит межразрядный мост между 32- и 64-битными процессами.comcntr.dll именно из каталога требуемой платформы 8.2 (по умолчанию путь: C:\Program Files (x86)\1cv82\8.2.19.130\bin\comcntr.dll).V82.COMConnector.1.После настройки компоненты в COM+ проанализируем, как должен выглядеть итоговый программный код вызова. Обратите внимание на точное указание имени созданного класса:
// Вызов должен выполняться в том контексте, где зарегистрирована компонента
СтрокаПодключения = "Srvr=It-dbs.rvk.local; Ref=copyuppkvk8_2; Usr=user; Pwd=pass";
мСоединение = Неопределено;
Попытка
// Обращаемся к зарегистрированному классу в COM+
База = Новый COMОбъект("V82.COMConnector.1");
мСоединение = База.Connect(СтрокаПодключения);
Исключение
Сообщить("Не удалось подключиться к информационной базе: " + ОписаниеОшибки());
КонецПопытки;
Если мСоединение <> Неопределено Тогда
// Соединение успешно установлено, выполняем дальнейшие операции
Сообщить("Успешное подключение к базе данных!");
КонецЕсли;
Хотя механизм COM-соединения является классическим, в современной разработке он имеет существенные ограничения: привязка к операционной системе Windows, повышенная чувствительность к правам доступа учетных записей и занятие полных пользовательских лицензий подключаемой базы. Если архитектура проекта позволяет, рекомендуется рассмотреть альтернативные варианты:
HTTPСоединение или WSСсылки. Этот метод платформонезависим, работает на Linux и не подвержен конфликтам версий DLL.Использование COM+-приложения в службах компонентов остается надежным и проверенным решением в тех ситуациях, когда требуется быстрое прямое взаимодействие между конфигурациями без переработки архитектуры целевой базы.