При разработке механизмов интеграции между различными базами данных 1С программисты часто используют COM-соединение. Этот способ позволяет напрямую обращаться к данным другой информационной базы, вызывать её экспортные процедуры и функции. Однако при переносе работающего кода из файлового варианта работы на сервер или при смене окружения разработчики регулярно сталкиваются со следующей ошибкой:
«Ошибка при вызове конструктора (COMОбъект): Новый COMОбъект("V83.COMConnector") по причине: -2147221005(0x800401F3): Недопустимая строка с указанием класса»
В этой статье мы подробно проанализируем, почему возникает данная проблема, рассмотрим разницу в контекстах выполнения кода на клиенте и на сервере, а также разберем по шагам все возможные способы решения этой ошибки.
Для начала проанализируем исходный код, который вызывает ошибку:
&НаСервере
Функция ПодключитьИБНаСервереКадры()
СтрПодключения = "Srvr=""" + СокрЛП("192.168.1.201") + """; Ref=""" + СокрЛП("hrm") + """; Usr=""" + СокрЛП("Обмен") + """; Pwd=""" + СокрЛП("12345") + """;";
СО = Новый COMОбъект("V83.COMConnector");
ИБ = СО.Connect(СтрПодключения);
Возврат ИБ;
EndFunction
Когда мы запускаем этот код в файловой базе данных, инициализация объекта COMОбъект происходит успешно. Это объясняется тем, что в файловом режиме весь код (даже с директивой &НаСервере) фактически выполняется на компьютере локального пользователя в контексте его текущей учетной записи Windows.
В клиент-серверном варианте работы ситуация кардинально меняется. Код с директивой &НаСервере передается на выполнение рабочему процессу сервера 1С — rphost.exe. Этот процесс функционирует в контексте специальной системной службы Windows, которая запускается от имени выделенного пользователя (как правило, это USR1CV8 или NetworkService).
Если библиотека COM-соединителя была зарегистрирована некорректно или только для конкретного пользователя, операционная система сервера не сможет найти класс V83.COMConnector в реестре для учетной записи службы 1С. В результате мы получаем ошибку инициализации класса.
Выясним основные причины этой проблемы и разберем пошаговые инструкции по их устранению.
Часто системные администраторы или программисты совершают ошибку при регистрации библиотеки comcntr.dll через утилиту regsvr32.exe, используя параметры локальной установки. Рассмотрим команду, которую применил автор темы:
regsvr32 /n /i:user "C:\Program Files\1cv8\8.3.12.1790\bin\comcntr.dll"
Ключ /i:user указывает утилите, что регистрацию компоненты необходимо выполнить только для текущего активного пользователя Windows. Записи о COM-объекте при этом заносятся в ветку реестра HKEY_CURRENT_USER. Когда служба сервера 1С, работающая под учетной записью USR1CV8, пытается обратиться к реестру, она ищет класс в ветке HKEY_LOCAL_MACHINE или в своей собственной ветке HKEY_CURRENT_USER, где информации о библиотеке просто нет.
Чтобы решить эту проблему, выполним глобальную регистрацию компоненты для всей операционной системы:
cmd.exe) обязательно с правами Администратора (нажав правой кнопкой мыши и выбрав пункт «Запуск от имени администратора»).HKEY_LOCAL_MACHINE:regsvr32 "C:\Program Files\1cv8\8.3.12.1790\bin\comcntr.dll"
После успешного выполнения команды система выдаст сообщение о том, что регистрация библиотеки пройдена успешно. Рекомендуется перезапустить службу сервера 1С, чтобы изменения вступили в силу.
Еще одна частая причина ошибки — несовпадение разрядности установленного сервера 1С Предприятия и зарегистрированной версии библиотеки comcntr.dll.
Если на сервере установлена 64-разрядная версия службы 1С, рабочий процесс rphost.exe является 64-битным. Он физически не сможет загрузить 32-битную библиотеку COM-соединителя. Верно и обратное утверждение. Нам необходимо убедиться, что мы регистрируем библиотеку нужной разрядности.
Проанализируем структуру каталогов 1С на сервере:
C:\Program Files\1cv8\... содержит файлы 64-разрядной версии платформы.C:\Program Files (x86)\1cv8\... содержит файлы 32-разрядной версии платформы.При регистрации на 64-битных операционных системах Windows крайне важно использовать правильную версию системной утилиты regsvr32.exe:
C:\Windows\System32\regsvr32.exe "C:\Program Files\1cv8\8.3.12.1790\bin\comcntr.dll"
C:\Windows\SysWOW64\regsvr32.exe "C:\Program Files (x86)\1cv8\8.3.12.1790\bin\comcntr.dll"
Обратите внимание, что папка SysWOW64 отвечает за работу 32-битных приложений в 64-битной операционной системе, поэтому пути могут казаться нелогичными, но это стандартная архитектура Windows.
Бывают ситуации, когда прямая регистрация библиотеки в реестре не решает проблему. Например, если у пользователя службы 1С жестко ограничены права безопасности, либо когда на сервере требуется организовать взаимодействие между 64-разрядным сервером 1С и 32-разрядным COM-соединителем другой системы. В таких случаях наилучшим и наиболее отказоустойчивым решением является создание специального изолированного приложения в Службах компонентов Windows (COM+).
Рассмотрим по шагам процесс создания и настройки обертки COM+:
Win + R, введем в появившемся окне команду dcomcnfg и нажмем Enter.V83_COMConnector. В области «Способ активации» обязательно выберем пункт Серверное приложение. Это позволит запускать COM-объект в отдельном системном процессе dllhost.exe. Нажмем «Далее».USR1CV8). Это гарантирует, что у процесса будет достаточно прав для чтения реестра и обращения к файлам. Завершим работу мастера.V83_COMConnector в дереве служб компонентов, найдем внутри него папку Компоненты. Нажмем на неё правой кнопкой мыши и выберем Создать -> Компонент.C:\Program Files\1cv8\8.3.12.1790\bin\comcntr.dll (выбирайте путь в соответствии с установленным релизом платформы). Завершим создание компонента.V83_COMConnector, выберем Свойства и перейдем на вкладку Безопасность. После выполнения этих шагов перезапустим службу сервера 1С Предприятия. Теперь при вызове конструктора Новый COMОбъект("V83.COMConnector") операционная система перенаправит вызов в службу COM+, которая запустит библиотеку в изолированном пуле под заданными правами администратора, успешно обходя любые ограничения прав процесса 1С.
Иногда проблема кроется на самом базовом уровне: при установке или обновлении платформы 1С на сервере администраторы забывают отметить галочкой нужные компоненты. Если файл comcntr.dll отсутствует в каталоге установки bin, зарегистрировать его не удастся.
Проверим и исправим эту ситуацию:
Проанализировав все возможные причины, мы видим, что большинство ошибок при работе с COM-соединением на сервере сводятся к правам доступа и разрядности процессов операционной системы. Выполнение системных рекомендаций по глобальной регистрации библиотеки или настройка обертки COM+ позволяют полностью решить проблему и обеспечить стабильную интеграцию между информационными базами 1С.