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

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

При организации интеграции между различными информационными базами 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 попросту отсутствует либо недоступна исполняющему процессу. Разберем ключевые нюансы этой ошибки:

  1. Контекст выполнения кода: если процедура или функция объявлена с директивой &НаСервере или расположена в серверном общем модуле, создание COM-объекта происходит не на клиентском компьютере разработчика, а в процессе службы сервера 1С:Предприятия (rphost.exe). Следовательно, библиотека comcntr.dll платформы 8.3 должна быть зарегистрирована именно на хосте сервера 8.2.
  2. Зависимости библиотеки comcntr.dll: коннектор 1С не является изолированным модулем. Библиотека динамически связана с базовыми модулями технологической платформы (такими как core83.dll, библиотеками локализации и распространяемыми пакетами Microsoft Visual C++ Redistributable). Если попытаться скопировать одну лишь библиотеку comcntr.dll в отдельную пустую папку и зарегистрировать ее, утилита выдаст ошибку отсутствия зависимых модулей (ошибка загрузки модуля 0x8007007e).
  3. Несоответствие разрядности (битности): если сервер приложений 1С:Предприятия 8.2 работает как 64-разрядный процесс, он не сможет напрямую загрузить 32-разрядную библиотеку коннектора. Разрядность вызывающего процесса и регистрируемой библиотеки должны совпадать, либо вызов должен быть инкапсулирован через межпроцессный мост (COM+).
  4. Права доступа системной службы: процесс rphost.exe функционирует под специальной системной учетной записью (часто usr1cv8). Этот пользователь должен иметь права на чтение файлов платформы и доступ к разделам реестра.

Способ 1. Регистрация библиотеки коннектора с сохранением окружения (быстрое решение)

Разберем по шагам наиболее прямое решение проблемы, когда код на сервере 8.2 должен инициировать соединение с сервером 8.3:

  1. Перенесем полный каталог исполняемых файлов платформы 8.3 на сервер, где работает служба 8.2. Если на этом сервере платформа 8.3 не установлена штатным дистрибутивом, скопируем каталог bin установленной платформы 8.3 требуемой версии целиком (например, из каталога C:\Program Files\1cv8\8.3.X.YYYY\bin). Перенос всей папки критически важен, так как в ней находятся все вспомогательные библиотеки ядра 1С, необходимые для корректного старта comcntr.dll.
  2. Запустим командную строку Windows от имени Администратора.
  3. Перейдем в скопированный каталог с помощью команды перехода по диску и папкам: cd /d "C:\Program Files\1cv8\8.3.X.YYYY\bin"
  4. Выполним регистрацию библиотеки коннектора в реестре операционной системы. Если используется 64-разрядная платформа 1С, выполним: 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"
    
  5. Убедимся в получении системного сообщения: «Успешное выполнение DllRegisterServer в comcntr.dll».
  6. Проверим права доступа: убедимся, что системный пользователь, от имени которого запущена служба сервера 1С 8.2, обладает правами чтения и выполнения на скопированный каталог bin.

Способ 2. Настройка компонента в службах компонентов COM+ (для изоляции и конфликта разрядностей)

Рассмотрим подробнее сценарий, когда разрядности сервера 1С 8.2 и целевой библиотеки не совпадают (например, 64-битный сервер должен обращаться к 32-битному коннектору), либо требуется обеспечить стабильность рабочего процесса сервера 1С, исключив возможность аварийного завершения rphost.exe при внутренних сбоях сторонней DLL. Для этого используется системный суррогатный процесс dllhost.exe в оснастке COM+:

  1. Откроем оснастку: нажмите Win + R, введем dcomcnfg и нажмем Enter.
  2. Перейдем по дереву: Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.
  3. Создадим новое приложение: нажмем правой кнопкой мыши по ветке «Приложения COM+», выберем Создать -> Приложение. В мастере выберем «Установить новое приложение», укажем понятное имя (например, V83_COMConnector) и выберем тип «Серверное приложение» (Server application).
  4. На шаге «Удостоверение» укажем явного пользователя системы с правами локального администратора или выделим учетную запись службы 1С.
  5. В созданном приложении развернем узел, нажмем правой кнопкой мыши на ветку Компоненты -> Создать -> Компонент.
  6. Выберем пункт «Установка новых компонентов» и укажем путь к файлу comcntr.dll из каталога платформы 8.3 соответствующей версии.

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

Важные ограничения и современные альтернативы

Проанализируем технические ограничения использования прямого COM-подключения:

  1. Несовместимость с ОС Linux: COM-технология является внутренней разработкой Microsoft и функционирует исключительно в среде Windows. Если сервер 1С работает под управлением Linux, метод с созданием COMОбъект("V83.COMConnector") работать не будет.
  2. Строгое совпадение версий сборки: метод Connect() проверяет точный номер релиза платформы. Если версия коннектора хотя бы незначительно отличается от версии сервера базы-приемника, соединение будет разорвано с ошибкой несоответствия версий.

В современной разработке на платформе 1С:Предприятие взамен устаревающего механизма COMConnector рекомендуется переходить на стандартные сетевые протоколы обмена:

  1. HTTP-сервисы и Web-сервисы: на стороне базы 8.3 публикуется легковесный HTTP-сервис. В конфигурации 8.2 для отправки и получения данных используется стандартный платформенный объект HTTPСоединение. Такой способ полностью платформонезависим, работает на любых операционных системах и не зависит от версий сборок и разрядностей.
  2. Автоматический REST-интерфейс (OData): платформа 8.3 поддерживает стандартный интерфейс OData, который позволяет читать и записывать данные таблиц информационной базы через стандартные HTTP-запросы без внесения изменений в конфигурацию базы-приемника.
← На главную