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

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

При попытке установить соединение между двумя базами 1С с использованием технологии COM часто возникает критическая ошибка: «Недопустимая строка с указанием класса» (код ошибки 0x80040154). Эта ситуация особенно характерна для систем, где установлено несколько версий платформы или используется терминальный доступ. Ошибка означает, что операционная система Windows не может найти в реестре запись о программном идентификаторе (ProgID), который вы запрашиваете в коде. Разберем пошагово, как диагностировать и устранить эту проблему.

Причины возникновения проблемы

Прежде чем приступать к исправлению, проанализируем основные факторы, вызывающие сбой:

  1. Отсутствие регистрации библиотеки: Компонента comcntr.dll, отвечающая за COM-соединение, не зарегистрирована в реестре Windows.
  2. Конфликт разрядностей: Вы пытаетесь вызвать 32-битную библиотеку из 64-битного процесса (например, сервера 1С x64) или наоборот.
  3. Терминальный режим: Регистрация была произведена локально, а код выполняется в сессии на сервере, где библиотека не прописана.
  4. Разные версии платформ: В коде вызывается V83.COMConnector, а в системе зарегистрирована только версия для V82.

Способ 1. Ручная регистрация библиотеки через командную строку

Рассмотрим стандартный способ регистрации comcntr.dll. Важно понимать, что регистрацию нужно проводить именно на том компьютере (или сервере), где исполняется программный код. Если код выполняется «НаСервере», то регистрация нужна на сервере 1С.

Запустите командную строку (cmd) от имени администратора. В зависимости от разрядности вашей операционной системы и версии платформы, введите соответствующую команду. Разберем пример для платформы 8.3.12:

Для 64-разрядной Windows (регистрация 32-битной компоненты):

C:\Windows\SysWOW64\regsvr32 "C:\Program Files\1cv8\8.3.12.1714\bin\comcntr.dll"

Для 32-разрядной Windows или при использовании 64-битной версии платформы:

C:\Windows\system32\regsvr32 "C:\Program Files\1cv8\8.3.12.1714\bin\comcntr.dll"

Важный нюанс: Обратите внимание на кавычки в пути к файлу. Если в пути есть пробелы (например, в Program Files), кавычки обязательны. Если регистрация прошла успешно, вы увидите сообщение «Успешное выполнение DllRegisterServer».

Способ 2. Настройка компоненты через Службы компонентов (COM+)

Если простая регистрация не помогает (часто случается на 64-битных серверах 1С), необходимо создать приложение COM+. Это позволит Windows запустить библиотеку в отдельном процессе-суррогате dllhost.exe, что снимет проблему конфликта разрядностей.

Проанализируем шаги настройки:

  1. Откройте Панель управления -> Администрирование -> Службы компонентов.
  2. Перейдите в ветку Компьютеры -> Мой компьютер -> Приложения COM+.
  3. Нажмите правую кнопку мыши, выберите Создать -> Приложение.
  4. В мастере создания выберите Создать новое приложение. Введите имя, например, 1C_COM_Connector.
  5. Установите способ активации — Серверное приложение.
  6. В качестве учетной записи выберите Указанный пользователь и введите данные учетной записи, под которой работает служба сервера 1С (обычно это USR1CV8).
  7. После создания приложения откройте его ветку, найдите папку Компоненты.
  8. Нажмите Создать -> Компонент. Выберите Установка новых компонентов и укажите путь к файлу comcntr.dll в папке bin вашей платформы.
  9. В свойствах созданного компонента на вкладке Безопасность убедитесь, что разрешены необходимые роли (например, CreatorOwner).

Этот метод считается наиболее надежным для серверных решений, так как он изолирует работу COM-объекта от основного процесса платформы.

Способ 3. Проверка программного кода

Иногда ошибка вызвана тем, что в коде используется неверный идентификатор класса. Посмотрим на различия между типами соединений:

Если мы подключаемся через Application (тяжелое соединение с запуском окна):


// Для версии 8.2
Соединение = Новый COMОбъект("V82.Application");

// Для версии 8.3
Соединение = Новый COMОбъект("V83.Application");

Если мы используем более быстрый COMConnector (рекомендуется для обмена данными):


// Для версии 8.3
Соединитель = Новый COMОбъект("V83.COMConnector");
ПараметрыСвязи = "Srvr=""ServerName"";Ref=""BaseName"";Usr=""Admin"";Pwd=""123"";";
Попытка
    Соединение = Соединитель.Connect(ПараметрыСвязи);
Исключение
    Сообщить("Ошибка подключения: " + ОписаниеОшибки());
КонецПопытки;

Выясним причину, почему Application может работать, а COMConnector — нет. Это происходит потому, что это разные записи в реестре Windows. Если вы зарегистрировали только одну версию или компоненту, вторая работать не будет. Всегда проверяйте, какой именно объект вы создаете в коде Новый COMОбъект.

Рекомендация: Переход на Web-сервисы или HTTP-сервисы

Как отмечают опытные специалисты, технология COM является устаревшей и «капризной» в настройке, особенно в современных защищенных средах и при использовании Linux-серверов. Рассмотрим преимущества альтернативы:

Если ваша задача позволяет, мы рекомендуем отказаться от COMConnector в пользу HTTP-сервисов. Это избавит вас от необходимости администрирования серверов при каждом обновлении платформы 1С.

Подведем итог: Если вам все же необходимо использовать COM, начните с проверки разрядности операционной системы и корректности путей в команде regsvr32. Если ошибка сохраняется — переходите к настройке в «Службах компонентов» Windows.

← На главную