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

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

При настройке интеграции между различными конфигурациями «1С:Предприятия» программисты часто используют COM-соединение. Однако при попытке связать базы, работающие на разных версиях платформы (например, базу-источник на платформе 8.3 и базу-приемник на 8.2), возникают критические сбои: аварийное завершение работы программы без вывода диагностических сообщений, несоответствие версий клиента и сервера либо системная ошибка «Ошибка при вызове конструктора (COMОбъект): Недопустимая строка с указанием класса».

Разберем детально, почему возникают подобные неполадки, как операционная система Windows работает с библиотеками comcntr.dll и каким образом правильно настроить подключение с использованием механизма COM+ в службах компонентов Windows.

Анализ проблемы и причин возникновения ошибок

Рассмотрим типовой сценарий. Из конфигурации «1С:Розница 2.2» (работающей на платформе 8.3.8.2167) необходимо программно подключиться к серверной базе «Управление производственным предприятием» (УПП), функционирующей на платформе 8.2.19.130. В исходном коде используется стандартная конструкция:


СтрокаПодключения = "Srvr=It-dbs.rvk.local; Ref=copyuppkvk8_2; Usr=user; Pwd=pass";
Попытка
    База = Новый COMОбъект("V82.COMConnector");
    мСоединение = База.Connect(СтрокаПодключения);
Исключение
    Сообщить("Не удалось подключиться: " + ОписаниеОшибки());
КонецПопытки;

При выполнении этого кода разработчики сталкиваются с рядом препятствий:

  1. Аварийное завершение сеанса 1С: При обращении к V82.COMConnector процесс программы внезапно закрывается. Это происходит из-за конфликта разрядностей (например, 64-битный рабочий процесс 1С пытается напрямую загрузить в свое адресное пространство 32-битную DLL) либо из-за одновременной загрузки несовместимых модулей разных версий платформ.
  2. Недопустимая строка с указанием класса: Данная системная ошибка означает, что указанный текстовый идентификатор класса (ProgID), например V8.COMConnector или V82.COMConnector, отсутствует в реестре Windows по ветке HKEY_CLASSES_ROOT, либо зарегистрирован некорректно.
  3. Несоответствие версий клиента и сервера: Если при вызове используется V83.COMConnector, компонента пытается инициировать протокол взаимодействия версии 8.3 с кластером серверов, на котором работает 8.2, что приводит к блокировке соединения протоколом кластера 1С.

Для успешного подключения к серверной базе 8.2 из 8.3 критически важно, чтобы на том компьютере, где физически выполняется код (на клиенте при клиентском вызове или на сервере приложений 1С при выполнении на сервере), была установлена платформа 8.2 в точности того же релиза, что и сервер целевой базы (в нашем примере — 8.2.19.130). Одной лишь установки 8.3 недостаточно: клиентские библиотеки 8.2 физически должны присутствовать на диске.

Решение проблемы через Службы компонентов Windows (COM+)

Создание выделенного COM+-приложения через системную оснастку Службы компонентов (Component Services) — наиболее стабильный способ решения конфликтов разрядности и сосуществования разных версий библиотек 1С. Библиотека коннектора запускается в отдельном изолированном суррогатном процессе операционной системы dllhost.exe, что предотвращает падение рабочего процесса 1С.

Разберем настройку по шагам:

  1. Нажмите комбинацию клавиш Win + R, введите команду dcomcnfg и нажмите Enter.
  2. В открывшемся дереве оснастки перейдите по пути: Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.
  3. Нажмите правой кнопкой мыши на ветку Приложения COM+ и выберите пункт Создать -> Приложение.
  4. В мастере установки нажмите «Далее», затем выберите Установить новое приложение.
  5. Укажите понятное имя приложения, например, V82_COMConnector, и обязательно выберите режим активации Серверное приложение (Server application). Это позволит запускать библиотеку в изолированном процессе dllhost.exe и обеспечит межразрядный мост между 32- и 64-битными процессами.
  6. На этапе выбора учетной записи (Удостоверение / Identity) выберите пункт Указанный пользователь и задайте системного пользователя (например, пользователя, под которым стартует служба сервера 1С, либо локального администратора с достаточными правами на файловую систему и реестр). Нажмите «Готово».
  7. Разверните только что созданное приложение, нажмите правой кнопкой мыши на узел Компоненты и выберите Создать -> Компонент.
  8. Выберите Установка новых компонентов, нажмите кнопку «Файл» и выберите библиотеку comcntr.dll именно из каталога требуемой платформы 8.2 (по умолчанию путь: C:\Program Files (x86)\1cv82\8.2.19.130\bin\comcntr.dll).
  9. Завершите работу мастера. В списке компонентов появится класс сProgID, обычно имеющий вид V82.COMConnector.1.

Корректный код вызова COM-объекта в 1С

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


// Вызов должен выполняться в том контексте, где зарегистрирована компонента
СтрокаПодключения = "Srvr=It-dbs.rvk.local; Ref=copyuppkvk8_2; Usr=user; Pwd=pass";
мСоединение = Неопределено;

Попытка
    // Обращаемся к зарегистрированному классу в COM+
    База = Новый COMОбъект("V82.COMConnector.1");
    мСоединение = База.Connect(СтрокаПодключения);
Исключение
    Сообщить("Не удалось подключиться к информационной базе: " + ОписаниеОшибки());
КонецПопытки;

Если мСоединение <> Неопределено Тогда
    // Соединение успешно установлено, выполняем дальнейшие операции
    Сообщить("Успешное подключение к базе данных!");
КонецЕсли;

Альтернативные архитектурные решения для интеграции

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

  1. HTTP-сервисы и Web-сервисы: В конфигурации 8.2 (УПП) можно опубликовать стандартный или специализированный веб-сервис на веб-сервере (IIS или Apache). База на платформе 8.3 сможет отправлять запросы через встроенные объекты HTTPСоединение или WSСсылки. Этот метод платформонезависим, работает на Linux и не подвержен конфликтам версий DLL.
  2. Механизм планов обмена: Настройка регулярной выгрузки пакетов данных в формате XML или JSON через сетевые папки или FTP исключает прямое обращение к внутренним библиотекам сторонней платформы.

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

← На главную