Как исправить ошибку «Класс не зарегистрирован» при вызове V83.COMConnector на 64-разрядной Windows

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

При настройке интеграции между различными базами данных 1С системные администраторы и разработчики часто сталкиваются с крайне неприятной ошибкой: «Класс не зарегистрирован (0x80040154)». Ситуация становится особенно запутанной, когда стандартная регистрация библиотеки через утилиту regsvr32 проходит успешно, но при попытке программного создания объекта V83.COMConnector система всё равно выдает ошибку. В этой статье мы подробно разберем, почему возникает данная проблема, как разрядность операционной системы влияет на работу COM-соединения и как решить эту проблему раз и навсегда с помощью различных инструментов.

Почему возникает ошибка при зарегистрированной компоненте?

Для того чтобы понять суть проблемы, нам необходимо проанализировать архитектуру операционной системы Windows и механизмы работы COM (Component Object Model). Когда мы запускаем 64-разрядное приложение (например, 64-битный сервер 1С или 64-битный клиент), оно физически не может напрямую загрузить в свое адресное пространство 32-битную динамическую библиотеку (DLL), коей и является comcntr.dll для старых версий платформ (например, 8.3.8, где еще не существовало полноценного 64-битного тонкого и толстого клиента).

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

Рассмотрим подробнее четыре основных метода борьбы с этой ошибкой, начиная с самого надежного и технологичного.

Решение 1. Создание суррогатного приложения в службе компонентов COM+

Этот метод является самым надежным и универсальным. Он позволяет обойти фундаментальное ограничение операционной системы и запустить 32-битную библиотеку comcntr.dll в адресном пространстве специального 64-битного процесса-суррогата dllhost.exe. Это позволяет любому 64-битному приложению (включая сервер 1С) беспрепятственно обращаться к COM-объекту 1С старой версии.

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

  1. Откроем утилиту управления службами компонентов. Нажмите комбинацию клавиш Win + R, введите dcomcnfg.exe и обязательно запустите ее с правами администратора.
  2. В открывшемся окне перейдем по следующему дереву каталогов: Службы компонентов -> Компьютеры -> Мой компьютер.
  3. Найдем папку Приложения COM+, кликнем по ней правой кнопкой мыши и выберем пункт Создать -> Приложение.
  4. В открывшемся мастере установки нажмем кнопку Далее, а на следующем шаге выберем Создать новое приложение.
  5. Зададим понятное имя для нашего приложения, например, V83_COMConnector. В разделе «Способ активации» обязательно укажем переключатель в положение Серверное приложение. Это критически важно, так как именно этот режим заставляет компоненту выполняться в отдельном процессе dllhost.exe. Нажмем кнопку Далее.
  6. На следующем шаге выберем учетную запись, от имени которой будет запускаться приложение. Для обеспечения безопасности и стабильности рекомендуется выбрать конкретного пользователя (например, доменную или локальную учетную запись, под которой работает служба сервера 1С) и ввести его пароль. Нажмем Далее и завершим создание приложения.
  7. Теперь развернем созданное приложение V83_COMConnector, найдем внутри него папку Компоненты. Кликнем по ней правой кнопкой мыши и выберем Создать -> Компонент.
  8. В мастере импорта выберем Установка новых компонентов и укажем путь к нашей 32-битной библиотеке. Например: C:\Program Files (x86)\1cv8\8.3.8.2322\bin\comcntr.dll. Завершим установку.

После выполнения этих шагов Windows создаст прозрачный мост между разрядностями, и ошибка «Класс не зарегистрирован» должна исчезнуть.

Решение проблемы с правами в COM+ («У вас нет разрешений на выполнение запрошенного действия»)

Часто системные администраторы сталкиваются с тем, что при попытке настроить свойства безопасности или ограничений в созданном приложении COM+ система выдает ошибку прав доступа, даже если они работают под учетной записью локального или доменного администратора. Выясним причину этой проблемы.

Дело в том, что в современных версиях Windows (начиная с Windows 10 и Windows Server 2016) включен строгий контроль учетных записей (UAC), который урезает права даже администраторам, если утилита запущена в обычном контексте. Чтобы разблокировать настройки, выполним следующие действия:

  1. Закроем оснастку служб компонентов.
  2. Найдем в меню «Пуск» или через поиск файл dcomcnfg.exe, нажмем на него правой кнопкой мыши и выберем пункт «Запуск от имени администратора».
  3. Если этого недостаточно, нам потребуется добавить текущего пользователя в роли администратора COM+. Для этого в дереве консоли перейдем в раздел: Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+ -> System Application.
  4. Развернем папку Роли (Roles), затем откроем папку Administrator и перейдем в раздел Пользователи.
  5. Кликнем правой кнопкой мыши по этой папке, выберем Создать -> Пользователь и добавим учетную запись администратора, под которой выполняется настройка, а также группу локальных администраторов компьютера.
  6. После выполнения этих настроек обязательно перезапустим службу Системное приложение COM+ через стандартную оснастку services.msc.

Решение 2. Тщательная очистка и ручная корректировка реестра Windows

Зачастую проблема кроется в «грязном» реестре операционной системы. Если на компьютере ранее были установлены более новые версии платформы 1С (например, 8.3.15), а затем они были удалены, стандартный деинсталлятор мог некорректно удалить записи о регистрации класса COM. В результате операционная система при вызове класса V83.COMConnector пытается обратиться по старому, уже несуществующему пути.

Проанализируем ситуацию и исправим реестр вручную:

  1. Нажмите клавиши Win + R, введите команду regedit и запустите редактор реестра от имени администратора.
  2. Поскольку мы работаем в 64-битной операционной системе и используем 32-битную компоненту 1С, основные настройки будут находиться в специализированной ветке для совместимости. Перейдем по следующему пути:
    HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{7E9185AE-6804-4560-A6F5-F26B4B13E7F9}
    Этот GUID уникален и жестко закреплен за COM-соединителем платформы 1С версии 8.3.
  3. Развернем этот раздел и выделим подраздел InprocServer32.
  4. Посмотрим на значение параметра (По умолчанию). Если в нем указан путь к старой, удаленной версии платформы 1С (например, к папке релиза 8.3.15.1830), нам необходимо дважды кликнуть по параметру и вручную изменить значение на актуальный путь к нашей рабочей библиотеке:
    C:\Program Files (x86)\1cv8\8.3.8.2322\bin\comcntr.dll
  5. Также проверим значение строкового параметра ThreadingModel — для корректной работы COM-сервера 1С его значение должно быть установлено как Both или Apartment.
  6. Повторим аналогичную проверку путей для ветки без суффикса совместимости (она отвечает за работу в 64-битном контексте):
    HKEY_CLASSES_ROOT\CLSID\{7E9185AE-6804-4560-A6F5-F26B4B13E7F9}\InprocServer32

Решение 3. Полная перерегистрация COM-сервера 1С

Иногда регистрация только одного файла библиотеки comcntr.dll не дает полного результата, так как нарушены перекрестные связи самого исполняемого модуля платформы 1С. В таком случае мы можем запустить принудительную перерегистрацию всего OLE/COM-сервера платформы. Выполним следующие команды в командной строке, запущенной от имени администратора:


cd "C:\Program Files (x86)\1cv8\8.3.8.2322\bin"
1cv8.exe /unregserver
1cv8.exe /regserver

Команда /unregserver полностью вычищает из реестра все записи, связанные с автоматизацией данной версии платформы 1С, а команда /regserver заново создает чистые, корректные связи и пути в системном реестре. После выполнения этой процедуры рекомендуется повторно зарегистрировать саму библиотеку comcntr.dll с помощью утилиты regsvr32 из системной папки SysWOW64:


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

Для проверки успешности проделанной работы мы можем написать простейший скрипт тестирования прямо в среде 1С. Запустим толстый или тонкий клиент 1С и выполним следующий код:


Попытка
    ТестовоеСоединение = Новый COMОбъект("V83.COMConnector");
    Сообщить("Успех! Компонента COMConnector успешно инициализирована в системе.");
Исключение
    Сообщить("Ошибка инициализации: " + ОписаниеОшибки());
КонецПопытки;

Решение 4. Стратегическая альтернатива — переход на HTTP-сервисы

Рассмотрим долгосрочную перспективу развития инфраструктуры. Большинство передовых специалистов в сфере 1С сходятся во мнении, что от использования технологии COM следует постепенно отказываться. Сама фирма 1С признает COM устаревшей технологией (legacy), которая не поддерживается в операционных системах семейства Linux. Кроме того, COM-соединения склонны к утечкам оперативной памяти, трудно поддаются отладке при работе под различными учетными записями и чувствительны к любым обновлениям безопасности операционной системы.

Современной и гораздо более надежной альтернативой являются HTTP-сервисы. При таком подходе база-приемник публикуется на веб-сервере (IIS или Apache), а база-источник отправляет данные обычными POST/GET запросами. Это полностью решает любые проблемы с разрядностью приложений, версиями платформ и правами доступа в операционной системе Windows.

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


Соединение = Новый HTTPСоединение("192.168.1.10", , "Администратор", "Пароль");
Запрос = Новый HTTPЗапрос("/MyBase/hs/v1/getdata");
Попытка
    Ответ = Соединение.Получить(Запрос);
    Если Ответ.КодСостояния = 200 Тогда
        Сообщить("Данные успешно получены в формате JSON: " + Ответ.ПолучитьТелоКакСтроку());
    Иначе
        Сообщить("Ошибка сервера. Код состояния: " + Ответ.КодСостояния);
    КонецЕсли;
Исключение
    Сообщить("Не удалось установить связь с веб-сервером: " + ОписаниеОшибки());
КонецПопытки;

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

← На главную