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

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

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

Выясняем причину возникновения ошибки

Проанализируем ситуацию: на одном компьютере отчет работает, а на другом — нет. Это сразу указывает на то, что проблема не в коде самого отчета, а в окружении (настройках операционной системы или установленной платформе). Основная причина кроется в том, что для создания подключения используется объект COMОбъект, который требует наличия зарегистрированной в системе библиотеки comcntr.dll (COM-соединитель).

Если в коде используется инициализация через:


Соединение = Новый COMОбъект("v82.Application");
// или
Соединение = Новый COMОбъект("V83.COMConnector");

Система ищет в реестре Windows программный идентификатор (ProgID) v82.Application или V83.COMConnector. Если библиотека не зарегистрирована или установлена только версия «Тонкого клиента» (в которой нет этого компонента), мы получим ошибку о недопустимой строке класса.

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

Рассмотрим процесс ручной регистрации библиотеки. Первое, что необходимо сделать — найти файл comcntr.dll в папке установленной платформы. Обратите внимание, что путь зависит от разрядности вашей операционной системы и версии платформы.

Разберем пример для платформы 8.3.12.1714. Откроем командную строку от имени Администратора (это критически важно, так как обычный пользователь не имеет прав на запись в ветки реестра HKEY_CLASSES_ROOT).

Введите следующую команду для 64-битной системы (используя 32-битную библиотеку):

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

Если вы используете 64-битную версию 1С, путь будет иным:

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

Важные моменты при вводе команды:

  1. Кавычки: Всегда используйте прямые кавычки ". Копирование текста из мессенджеров или текстовых редакторов может заменить их на «елочки» « », что приведет к ошибке выполнения.
  2. Латиница: Убедитесь, что буква диска C: написана в английской раскладке.
  3. Права администратора: Если запустить команду просто так, система выдаст ошибку доступа или сообщение о том, что модуль загружен, но точка входа не найдена.

Шаг 2. Устранение конфликтов разрядности (32-бит vs 64-бит)

Проанализируем сложную ситуацию: ваша основная база работает на 64-битном сервере 1С, а подключаться нужно к базе версии 8.2. Библиотека comcntr.dll от версии 8.2 является 32-битной. Напрямую 64-битный процесс сервера 1С не может «общаться» с 32-битной библиотекой.

В этом случае регистрация через regsvr32 может не помочь. Рассмотрим решение через Службы компонентов (COM+):

  1. Запустите dcomcnfg (Панель управления — Администрирование — Службы компонентов).
  2. Перейдите в «Компьютеры» — «Мой компьютер» — «Приложения COM+».
  3. Создайте новое пустое приложение, назовите его, например, 1C_COM_Connector.
  4. В свойствах созданного приложения на вкладке «Активация» установите флаг «Серверное приложение».
  5. На вкладке «Удостоверение» выберите пользователя, под которым запускается сервер 1С (обычно USR1CV8).
  6. В ветке вашего приложения откройте папку «Компоненты» и добавьте туда comcntr.dll.

Этот метод создаст суррогатный процесс dllhost.exe, который позволит 64-битной 1С успешно работать с 32-битным COM-объектом.

Шаг 3. Клиент или Сервер? Выясняем место запуска кода

Часто программисты регистрируют библиотеку на своем рабочем компьютере, но ошибка в отчете на сервере не исчезает. Посмотрим на ситуацию внимательнее: если ваш код выполняется в модуле, который работает «НаСервере», то регистрация библиотеки должна быть произведена именно на сервере 1С:Предприятия, а не на локальной машине пользователя.

Проверим права доступа пользователя службы 1С. Пользователь USR1CV8 (или тот, под которым запущен процесс rphost) должен иметь права «Чтение и выполнение» на папку bin соответствующей платформы 1С. Если прав недостаточно, сервер не сможет проинициализировать COM-объект даже при правильной регистрации в реестре.

Шаг 4. Оптимизация программного кода подключения

Рассмотрим, как правильно организовать код подключения. Хотя использование v82.Application допустимо, это вызывает запуск полноценного (хоть и невидимого) окна 1С, что потребляет много ресурсов сервера. Проанализируем более эффективный способ через COMConnector:


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

Важно: Если вы подключаетесь к базе 8.2 из базы 8.3, используйте класс того COM-соединителя, чья база является целевой. Однако на практике часто требуется регистрация именно той версии comcntr.dll, которая совпадает с версией платформы, выполняющей код.

Итоговый чек-лист для исправления ошибки:

Соблюдение этих шагов позволяет гарантированно избавиться от ошибки «Недопустимая строка с указанием класса» и обеспечить стабильную интеграцию между различными базами данных 1С.

← На главную