При настройке интеграции между различными базами данных 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), инициализация также завершится неудачей.
Рассмотрим подробнее четыре основных метода борьбы с этой ошибкой, начиная с самого надежного и технологичного.
Этот метод является самым надежным и универсальным. Он позволяет обойти фундаментальное ограничение операционной системы и запустить 32-битную библиотеку comcntr.dll в адресном пространстве специального 64-битного процесса-суррогата dllhost.exe. Это позволяет любому 64-битному приложению (включая сервер 1С) беспрепятственно обращаться к COM-объекту 1С старой версии.
Разберем этот процесс по шагам:
dcomcnfg.exe и обязательно запустите ее с правами администратора.V83_COMConnector. В разделе «Способ активации» обязательно укажем переключатель в положение Серверное приложение. Это критически важно, так как именно этот режим заставляет компоненту выполняться в отдельном процессе dllhost.exe. Нажмем кнопку Далее.V83_COMConnector, найдем внутри него папку Компоненты. Кликнем по ней правой кнопкой мыши и выберем Создать -> Компонент.C:\Program Files (x86)\1cv8\8.3.8.2322\bin\comcntr.dll. Завершим установку.После выполнения этих шагов Windows создаст прозрачный мост между разрядностями, и ошибка «Класс не зарегистрирован» должна исчезнуть.
Часто системные администраторы сталкиваются с тем, что при попытке настроить свойства безопасности или ограничений в созданном приложении COM+ система выдает ошибку прав доступа, даже если они работают под учетной записью локального или доменного администратора. Выясним причину этой проблемы.
Дело в том, что в современных версиях Windows (начиная с Windows 10 и Windows Server 2016) включен строгий контроль учетных записей (UAC), который урезает права даже администраторам, если утилита запущена в обычном контексте. Чтобы разблокировать настройки, выполним следующие действия:
dcomcnfg.exe, нажмем на него правой кнопкой мыши и выберем пункт «Запуск от имени администратора».services.msc.Зачастую проблема кроется в «грязном» реестре операционной системы. Если на компьютере ранее были установлены более новые версии платформы 1С (например, 8.3.15), а затем они были удалены, стандартный деинсталлятор мог некорректно удалить записи о регистрации класса COM. В результате операционная система при вызове класса V83.COMConnector пытается обратиться по старому, уже несуществующему пути.
Проанализируем ситуацию и исправим реестр вручную:
regedit и запустите редактор реестра от имени администратора.HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{7E9185AE-6804-4560-A6F5-F26B4B13E7F9}
InprocServer32.C:\Program Files (x86)\1cv8\8.3.8.2322\bin\comcntr.dllThreadingModel — для корректной работы COM-сервера 1С его значение должно быть установлено как Both или Apartment.HKEY_CLASSES_ROOT\CLSID\{7E9185AE-6804-4560-A6F5-F26B4B13E7F9}\InprocServer32Иногда регистрация только одного файла библиотеки 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 успешно инициализирована в системе.");
Исключение
Сообщить("Ошибка инициализации: " + ОписаниеОшибки());
КонецПопытки;
Рассмотрим долгосрочную перспективу развития инфраструктуры. Большинство передовых специалистов в сфере 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, разрядности операционной системы и необходимости ручной регистрации библиотек, обеспечивая быструю и отказоустойчивую работу интеграции.