Как исправить ошибку 0x80040154 (Класс не зарегистрирован) при использовании COM-соединения в 1С?

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

При работе с распределенными базами данных или интеграции различных конфигураций 1С (например, Бухгалтерии и Документооборота) специалисты часто сталкиваются с ошибкой: «-2147221164(0x80040154): Класс не зарегистрирован». Чаще всего это происходит после обновления платформы на одном из серверов или при попытке взаимодействия между 32-битными и 64-битными приложениями. В данной статье мы подробно разберем причины возникновения этой ситуации и пошагово рассмотрим способы её решения.

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

Прежде чем приступать к активным действиям, давайте проанализируем ситуацию. Ошибка 0x80040154 означает, что операционная система Windows не может найти в реестре запись о COM-классе, к которому обращается 1С. Чаще всего речь идет об объекте V83.COMConnector.

Основные причины проблемы:

  1. Разная разрядность: Сервер 1С имеет разрядность x64, а вызываемая компонента comcntr.dll зарегистрирована только как 32-битная (или наоборот).
  2. Обновление платформы: При установке новой версии 1С старые записи в реестре могут затереться или указывать на несуществующие пути.
  3. Отсутствие регистрации библиотеки: Файл comcntr.dll физически присутствует на диске, но не «прописан» в системе.
  4. Конфликт версий: Попытка подключиться из более новой версии платформы к более старой без корректно настроенной библиотеки соответствующей версии.

Шаг 1: Ручная регистрация библиотеки через regsvr32

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

Важно понимать разницу в путях:

Запустите командную строку (cmd) от имени администратора и выполните команду:

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

Если вы работаете в 64-разрядной операционной системе, помните, что для регистрации 32-битных библиотек стоит использовать regsvr32 из папки C:\Windows\SysWOW64\, а для 64-битных — из C:\Windows\System32\.

Шаг 2: Решение проблемы разрядности через Службы компонентов (COM+)

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

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

Этот метод позволяет 64-битному процессу обращаться к 32-битной библиотеке через системный посредник dllhost.exe, что решает большинство проблем совместимости.

Шаг 3: Проверка регистрации через внешние инструменты

Чтобы убедиться, что проблема именно в регистрации класса, а не в коде 1С, проанализируем ситуацию через PowerShell или Excel. Рассмотрим пример проверки через PowerShell:

Запустите PowerShell и введите следующую команду:


$com = New-Object -ComObject "V83.COMConnector"
$com

Если команда возвращает объект, значит, регистрация прошла успешно. Если выводится ошибка «Класс не зарегистрирован», значит, система всё еще не видит компоненту. Обратите внимание, что в Windows есть две версии PowerShell (x86 и x64). Проверьте объект в обеих — это поможет понять, в какой «битности» зарегистрирована библиотека.

Шаг 4: Почему возвращается «Неопределено»?

Бывают случаи, когда Новый COMОбъект("V83.COMConnector") отрабатывает без ошибок, но метод Connect() возвращает Неопределено. Разберем, почему это происходит:

Возможные причины:

Шаг 5: Использование альтернативных методов подключения

Если работа через V83.COMConnector остается нестабильной, проанализируем возможность использования V83.Application. Это создание полноценного (хоть и невидимого) приложения 1С. Метод более ресурсоемкий, но иногда помогает обойти ограничения прав доступа.

Пример кода для проверки:


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

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

Резюме по исправлению

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

  1. Проверить разрядность сервера 1С.
  2. Зарегистрировать соответствующую версию comcntr.dll через regsvr32.
  3. Если используется x64 сервер и x32 компонента — обязательно настроить COM+ приложение в Службах компонентов.
  4. Проверить права доступа пользователя, под которым работает сервер 1С.
  5. Перезапустить службу сервера 1С после внесения изменений в настройки COM.

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

← На главную