При организации интеграции между различными информационными базами 1С разработчики часто сталкиваются с ситуацией, когда код инициализации COM-соединения успешно выполняется на одной машине или в одной версии платформы, но аварийно завершается в другой среде. Рассмотрим типичную ситуацию: на сервере функционируют базы под управлением 1С:Предприятия 8.2 и 8.3, и требуется из серверного кода конфигурации версии 8.2 подключиться к базе на платформе 8.3.
Посмотрим на пример кода, вызывающего сбой:
ПараметрыПодключения = "Srvr=" + СерверДляПодключения + ";Ref=" + БазаДляПодключения + ";Usr=" + ПользовательДляПодключения + ";Pwd=" + ПарольДляПодключения;
V83COMConnector = Новый COMОбъект("V83.COMConnector");
Попытка
Возврат V83COMConnector.Connect(ПараметрыПодключения);
Исключение
Сообщить("Ошибка подключения!");
КонецПопытки;
При вызове данной процедуры на стороне сервера 8.2 возникает исключение: {Форма.Форма.Форма(22)}: Ошибка при вызове конструктора (COMОбъект): Недопустимая строка с указанием класса. Проанализируем, почему операционная система не может найти класс COM-объекта и как правильно устранить эту проблему.
Строка "V83.COMConnector" представляет собой программный идентификатор (ProgID) класса Windows COM. Когда мы вызываем конструктор Новый COMОбъект("V83.COMConnector"), операционная система обращается к системному реестру Windows (в ветку HKEY_CLASSES_ROOT), чтобы по переданному имени найти глобальный идентификатор класса (CLSID), а затем — путь к исполняемому файлу или DLL-библиотеке, реализующей данный интерфейс.
Сообщение «Недопустимая строка с указанием класса» (Invalid class string) означает, что в реестре Windows на том компьютере, где фактически выполняется инструкция, запись для V83.COMConnector попросту отсутствует либо недоступна исполняющему процессу. Разберем ключевые нюансы этой ошибки:
&НаСервере или расположена в серверном общем модуле, создание COM-объекта происходит не на клиентском компьютере разработчика, а в процессе службы сервера 1С:Предприятия (rphost.exe). Следовательно, библиотека comcntr.dll платформы 8.3 должна быть зарегистрирована именно на хосте сервера 8.2.core83.dll, библиотеками локализации и распространяемыми пакетами Microsoft Visual C++ Redistributable). Если попытаться скопировать одну лишь библиотеку comcntr.dll в отдельную пустую папку и зарегистрировать ее, утилита выдаст ошибку отсутствия зависимых модулей (ошибка загрузки модуля 0x8007007e).rphost.exe функционирует под специальной системной учетной записью (часто usr1cv8). Этот пользователь должен иметь права на чтение файлов платформы и доступ к разделам реестра.Разберем по шагам наиболее прямое решение проблемы, когда код на сервере 8.2 должен инициировать соединение с сервером 8.3:
bin установленной платформы 8.3 требуемой версии целиком (например, из каталога C:\Program Files\1cv8\8.3.X.YYYY\bin). Перенос всей папки критически важен, так как в ней находятся все вспомогательные библиотеки ядра 1С, необходимые для корректного старта comcntr.dll.
cd /d "C:\Program Files\1cv8\8.3.X.YYYY\bin"
regsvr32 comcntr.dll
Если же сервер 1С работает в 32-разрядном режиме на 64-разрядной ОС Windows, регистрацию необходимо выполнять с помощью 32-разрядной утилиты:
C:\Windows\SysWOW64\regsvr32.exe "C:\Program Files (x86)\1cv8\8.3.X.YYYY\bin\comcntr.dll"
bin.Рассмотрим подробнее сценарий, когда разрядности сервера 1С 8.2 и целевой библиотеки не совпадают (например, 64-битный сервер должен обращаться к 32-битному коннектору), либо требуется обеспечить стабильность рабочего процесса сервера 1С, исключив возможность аварийного завершения rphost.exe при внутренних сбоях сторонней DLL. Для этого используется системный суррогатный процесс dllhost.exe в оснастке COM+:
dcomcnfg и нажмем Enter.V83_COMConnector) и выберем тип «Серверное приложение» (Server application).comcntr.dll из каталога платформы 8.3 соответствующей версии.Такой подход позволяет операционной системе изолировать вызовы COM-объекта в отдельном адресном пространстве, снимая ограничения на несовпадение разрядностей между вызывающим сервером 1С и внешним коннектором.
Проанализируем технические ограничения использования прямого COM-подключения:
COMОбъект("V83.COMConnector") работать не будет.Connect() проверяет точный номер релиза платформы. Если версия коннектора хотя бы незначительно отличается от версии сервера базы-приемника, соединение будет разорвано с ошибкой несоответствия версий.В современной разработке на платформе 1С:Предприятие взамен устаревающего механизма COMConnector рекомендуется переходить на стандартные сетевые протоколы обмена:
HTTPСоединение. Такой способ полностью платформонезависим, работает на любых операционных системах и не зависит от версий сборок и разрядностей.