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

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

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

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

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

Для того чтобы понять, почему код ведет себя по-разному в разных контекстах, давайте проанализируем архитектуру выполнения клиентских и серверных процессов в 1С.

Когда мы запускаем обработку интерактивно на своем рабочем месте, код выполняется в контексте клиентского приложения (например, тонкого или толстого клиента). В подавляющем большинстве случаев на рабочих станциях пользователей установлена 32-разрядная версия клиента 1С. При вызове оператора Новый COMОбъект("V83.COMConnector") операционная система Windows обращается к реестру, находит зарегистрированную 32-битную библиотеку comcntr.dll и успешно загружает её в адресное пространство процесса 1С.

Ситуация кардинально меняется, когда этот же код вызывается внутри регламентного или фонового задания. В этом случае выполнение происходит на стороне сервера 1С:Предприятие в контексте процесса rphost.exe. Современные серверные операционные системы и сами серверы 1С практически всегда являются 64-разрядными (x64). Процесс rphost.exe работает в 64-битной адресации.

Главное системное ограничение Windows: 64-битный процесс физически не может напрямую загрузить в свою память 32-битную динамическую библиотеку (DLL), равно как и 32-битный процесс не может загрузить 64-битную DLL. Когда 64-битный сервер 1С пытается инициализировать 32-битный COM-класс, операционная система сообщает, что класс не зарегистрирован или строка с указанием класса недопустима. Именно это и приводит к аварийному завершению регламентного задания.

Также к этой проблеме часто добавляется конфликт версий платформ. Например, если на сервере установлена и база-источник на платформе 1С 8.2, и база-приемник на платформе 1С 8.3, библиотеки COM-соединения начинают конфликтовать в реестре операционной системы. Каждая последующая установка или обновление платформы перезаписывает пути к comcntr.dll в системном реестре Windows, нарушая работу старых интеграционных шлюзов.

Решение №1: Создание обертки COM+ (out-of-process server)

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

Рассмотрим этот процесс подробно и разберем его по шагам:

  1. Подготовка библиотеки: Убедимся, что на сервере, где запущен сервер приложений 1С, физически установлена компонента "COM-соединение". Если её нет, необходимо запустить программу установки платформы 1С нужной версии в режиме изменения состава компонент и отметить галочкой пункт "COM-соединение". Нам понадобится точный путь к файлу comcntr.dll (обычно он находится в каталоге установки 1С, например, C:\Program Files\1cv8\8.3.X.X\bin\comcntr.dll).
  2. Запуск утилиты администрирования: На сервере нажмем комбинацию клавиш Win + R, введем команду comexp.msc и нажмем Enter. Откроется стандартная оснастка операционной системы "Службы компонентов".
  3. Переход к приложениям COM+: В левой части окна развернем дерево каталогов по следующему пути: Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.
  4. Создание нового приложения:
    • Нажмем правой кнопкой мыши на ветку Приложения COM+ и выберем в контекстном меню Создать -> Приложение.
    • В открывшемся мастере установки приложений COM+ нажмем кнопку "Далее", а затем выберем вариант "Создать новое приложение".
    • Введем понятное имя для нашего приложения, например, V83_COMConnector.
    • Важный шаг: В поле "Способ активации" обязательно установим переключатель в положение "Серверное приложение". Это заставит компоненту запускаться в выделенном процессе dllhost.exe, изолированно от сервера 1С. Нажмем кнопку "Далее".
  5. Настройка удостоверения (прав доступа):
    • На шаге выбора учетной записи для запуска приложения по умолчанию предлагается "Интерактивный пользователь". Это крайне не рекомендуется для серверных решений, так как при выходе администратора из системы приложение перестанет запускаться.
    • Установим переключатель в положение "Указанный пользователь" и введем параметры учетной записи, под которой на сервере работает служба Агент сервера 1С:Предприятия (обычно это локальный пользователь USR1CV8). Обязательно укажем верный пароль. Это гарантирует, что у процесса dllhost.exe будут все необходимые права доступа к каталогам баз данных и системным ресурсам.
    • Завершим работу мастера, последовательно нажимая кнопки "Далее" и "Готово".
  6. Добавление компоненты в созданное приложение:
    • Развернем созданную ветку V83_COMConnector и найдем папку Компоненты.
    • Нажмем на неё правой кнопкой мыши и выберем Создать -> Компонент.
    • В мастере установки компонентов нажмем "Далее", затем выберем "Установка новых компонентов".
    • В диалоговом окне выбора файла укажем путь к нашей целевой библиотеке comcntr.dll. Нажмем "Открыть", затем "Далее" и "Готово".
  7. Тонкая настройка безопасности и стабильности:
    • Кликнем правой кнопкой мыши на наше приложение V83_COMConnector и перейдем в его Свойства.
    • Перейдем на вкладку "Безопасность". В разделе "Авторизация" снимем флажок "Принудительная проверка доступа для приложений". Уровень аутентификации для вызовов установим в значение "Нет". Это предотвратит частую ошибку блокировки доступа 0x80070005 (Отказано в доступе) при обращении процесса сервера 1С к созданному COM-объекту.
    • На вкладке "Свойства" (или "Пулы процессов" в зависимости от версии Windows Server) при необходимости можно настроить время жизни незанятого процесса, чтобы операционная система автоматически выгружала неиспользуемый dllhost.exe из оперативной памяти, освобождая ресурсы сервера.

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

Решение №2: Регистрация библиотеки через утилиту regsvr32 (при совпадении разрядностей)

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

Для этого выполним регистрацию через командную строку. Обратите внимание, что командную строку необходимо запускать строго от имени Администратора:

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

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

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


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

Полезный совет: Если в системе ранее были зарегистрированы другие версии этой же компоненты, перед регистрацией новой версии крайне желательно отменить старую регистрацию. Это позволит избежать путаницы в реестре Windows. Сделать это можно с помощью ключа /u:

regsvr32 /u "C:\Program Files\1cv8\старая_версия\bin\comcntr.dll"

Почему в современной разработке стоит отказываться от COM-соединений?

Несмотря на то, что технология COM долгое время была стандартом де-факто для обмена данными между информационными базами 1С, сегодня она считается устаревшей и накладывает серьезные ограничения на архитектуру и развитие ИТ-ландшафта предприятия. Рассмотрим ключевые причины, почему нам стоит рассмотреть переход на использование Web- и HTTP-сервисов:

1. Кроссплатформенность и независимость от операционной системы. Технология COM (Component Object Model) — это проприетарная разработка компании Microsoft, жестко привязанная к операционной системе Windows. В условиях активного импортозамещения и массового перехода серверов 1С на операционные системы семейства Linux использование COM-соединений становится непреодолимым барьером. Код, содержащий вызовы Новый COMОбъект, физически не сможет выполниться на сервере под управлением Linux. Веб- и HTTP-сервисы работают на базе стандартных сетевых протоколов (HTTP/HTTPS) и успешно функционируют на любой операционной системе.

2. Сложность администрирования при обновлении платформ. Каждый раз, когда мы обновляем версию платформы 1С на сервере, нам приходится вручную перерегистрировать компоненту comcntr.dll, контролировать разрядность процессов и проверять настройки в службах компонентов COM+. Это создает дополнительную рутинную нагрузку на системных администраторов и повышает риски простоя из-за человеческого фактора. Интеграция через HTTP-запросы вообще не зависит от версии платформы на стороне клиента или сервера.

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

Для сравнения рассмотрим, насколько лаконично и понятно выглядит отправка данных через HTTP-сервис по сравнению с классическим COM-соединением. Вместо долгого и ресурсоемкого создания тяжелого COM-объекта, мы можем отправить легкий структурированный JSON-пакет.

Пример отправки данных на стороне источника через HTTP-запрос:


&НаСервере
Процедура ОтправитьДанныеЧерезHTTP(АдресСервера, ДанныеДляПередачи)
    
    // Преобразуем наши данные в формат JSON
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, ДанныеДляПередачи);
    СтрокаЗапроса = ЗаписьJSON.Закрыть();
    
    // Настраиваем HTTP-соединение
    НТТРСоединение = Новый HTTPСоединение(АдресСервера, , , , , 30); // Таймаут 30 секунд
    
    // Формируем POST-запрос к нашему HTTP-сервису
    HTTPЗапрос = Новый HTTPЗапрос("/v1/exchange/data");
    HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаЗапроса, КодировкаТекста.UTF8);
    HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");
    
    Попытка
        HTTPОтвет = НТТРСоединение.ОтправитьДляОбработки(HTTPЗапрос);
        Если HTTPОтвет.КодСостояния = 200 Тогда
            ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Информация, , , "Данные успешно переданы.");
        Иначе
            ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка, , , "Ошибка передачи. Код ответа сервера: " + HTTPОтвет.КодСостояния);
        EndIf;
    Исключение
        ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка, , , "Не удалось установить соединение с сервером.");
    КонецПопытки;
    
КонецПроцедуры

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

← На главную