Как исправить ошибку «Недопустимая строка с указанием класса» при создании COM-соединения в 1С на сервере

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке механизмов интеграции между различными базами данных 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С. В результате мы получаем ошибку инициализации класса.

Выясним основные причины этой проблемы и разберем пошаговые инструкции по их устранению.

Решение 1. Корректная глобальная регистрация библиотеки comcntr.dll

Часто системные администраторы или программисты совершают ошибку при регистрации библиотеки 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, где информации о библиотеке просто нет.

Чтобы решить эту проблему, выполним глобальную регистрацию компоненты для всей операционной системы:

  1. Запустим командную строку Windows (cmd.exe) обязательно с правами Администратора (нажав правой кнопкой мыши и выбрав пункт «Запуск от имени администратора»).
  2. Выполним регистрацию без ключа локального пользователя, чтобы данные записались в ветку реестра HKEY_LOCAL_MACHINE:

regsvr32 "C:\Program Files\1cv8\8.3.12.1790\bin\comcntr.dll"

После успешного выполнения команды система выдаст сообщение о том, что регистрация библиотеки пройдена успешно. Рекомендуется перезапустить службу сервера 1С, чтобы изменения вступили в силу.

Решение 2. Учет разрядности операционной системы и сервера 1С

Еще одна частая причина ошибки — несовпадение разрядности установленного сервера 1С Предприятия и зарегистрированной версии библиотеки comcntr.dll.

Если на сервере установлена 64-разрядная версия службы 1С, рабочий процесс rphost.exe является 64-битным. Он физически не сможет загрузить 32-битную библиотеку COM-соединителя. Верно и обратное утверждение. Нам необходимо убедиться, что мы регистрируем библиотеку нужной разрядности.

Проанализируем структуру каталогов 1С на сервере:

При регистрации на 64-битных операционных системах Windows крайне важно использовать правильную версию системной утилиты regsvr32.exe:

  1. Для регистрации 64-битной версии компоненты (когда сервер 1С работает в 64-разрядном режиме) выполним в командной строке от имени администратора:
  2. C:\Windows\System32\regsvr32.exe "C:\Program Files\1cv8\8.3.12.1790\bin\comcntr.dll"

  3. Для регистрации 32-битной версии компоненты (если используется 32-разрядный сервер 1С или соединение инициируется из 32-разрядного клиента):
  4. C:\Windows\SysWOW64\regsvr32.exe "C:\Program Files (x86)\1cv8\8.3.12.1790\bin\comcntr.dll"

Обратите внимание, что папка SysWOW64 отвечает за работу 32-битных приложений в 64-битной операционной системе, поэтому пути могут казаться нелогичными, но это стандартная архитектура Windows.

Решение 3. Настройка обертки COM+ (Службы компонентов Windows)

Бывают ситуации, когда прямая регистрация библиотеки в реестре не решает проблему. Например, если у пользователя службы 1С жестко ограничены права безопасности, либо когда на сервере требуется организовать взаимодействие между 64-разрядным сервером 1С и 32-разрядным COM-соединителем другой системы. В таких случаях наилучшим и наиболее отказоустойчивым решением является создание специального изолированного приложения в Службах компонентов Windows (COM+).

Рассмотрим по шагам процесс создания и настройки обертки COM+:

  1. Откроем утилиту настройки. Для этого нажмем комбинацию клавиш Win + R, введем в появившемся окне команду dcomcnfg и нажмем Enter.
  2. В открывшемся окне «Службы компонентов» перейдем по следующему пути в дереве слева: Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.
  3. Нажмем правой кнопкой мыши на папку Приложения COM+, выберем в контекстном меню пункт Создать -> Приложение. Откроется мастер установки приложений COM+.
  4. В первом окне мастера нажмем кнопку «Далее», затем выберем вариант Создать новое приложение.
  5. Введем понятное имя для нашего приложения, например, V83_COMConnector. В области «Способ активации» обязательно выберем пункт Серверное приложение. Это позволит запускать COM-объект в отдельном системном процессе dllhost.exe. Нажмем «Далее».
  6. На шаге «Учетная запись для запуска приложения» укажем пользователя, под правами которого будет выполняться библиотека. Оптимальным выбором будет явное указание локального администратора сервера или учетной записи службы сервера 1С (USR1CV8). Это гарантирует, что у процесса будет достаточно прав для чтения реестра и обращения к файлам. Завершим работу мастера.
  7. Теперь развернем созданное приложение V83_COMConnector в дереве служб компонентов, найдем внутри него папку Компоненты. Нажмем на неё правой кнопкой мыши и выберем Создать -> Компонент.
  8. В мастере установки компонентов выберем пункт Установка новых компонентов и укажем путь к нашей библиотеке: C:\Program Files\1cv8\8.3.12.1790\bin\comcntr.dll (выбирайте путь в соответствии с установленным релизом платформы). Завершим создание компонента.
  9. После этого настроим безопасность. Нажмем правой кнопкой мыши на само созданное приложение V83_COMConnector, выберем Свойства и перейдем на вкладку Безопасность.
  10. Снимем флаг Принудительная проверка доступа для приложений. В поле «Уровень ограничений» выберем значение Неограниченный. Нажмем «ОК» для сохранения настроек.

После выполнения этих шагов перезапустим службу сервера 1С Предприятия. Теперь при вызове конструктора Новый COMОбъект("V83.COMConnector") операционная система перенаправит вызов в службу COM+, которая запустит библиотеку в изолированном пуле под заданными правами администратора, успешно обходя любые ограничения прав процесса 1С.

Решение 4. Проверка установки модуля COM-соединения в платформе

Иногда проблема кроется на самом базовом уровне: при установке или обновлении платформы 1С на сервере администраторы забывают отметить галочкой нужные компоненты. Если файл comcntr.dll отсутствует в каталоге установки bin, зарегистрировать его не удастся.

Проверим и исправим эту ситуацию:

  1. Откроем «Панель управления» на сервере и перейдем в раздел «Программы и компоненты».
  2. Найдем в списке установленную платформу 1С:Предприятие нужного релиза, выделим её и нажмем кнопку Изменить.
  3. В открывшемся мастере установки выберем режим Изменить.
  4. В дереве компонентов найдем пункт COM-соединение (COM connection) и убедимся, что рядом с ним не стоит крестик. Если компонент отключен, выберем вариант «Данный компонент будет установлен на локальный жесткий диск».
  5. Завершим процесс изменения установки платформы. После завершения копирования файлов произведем регистрацию библиотеки с помощью одного из способов, описанных выше.

Проанализировав все возможные причины, мы видим, что большинство ошибок при работе с COM-соединением на сервере сводятся к правам доступа и разрядности процессов операционной системы. Выполнение системных рекомендаций по глобальной регистрации библиотеки или настройка обертки COM+ позволяют полностью решить проблему и обеспечить стабильную интеграцию между информационными базами 1С.

← На главную