При обновлении платформы 1С:Предприятие или переносе информационных баз на другой сервер разработчики и системные администраторы часто сталкиваются с ошибкой: -2147221164(0x80040154): Класс не зарегистрирован. Чаще всего это происходит при попытке программного создания объекта V83.COMConnector. Давайте детально разберем причины возникновения этой ситуации и проанализируем пошаговые методы её решения.
Когда мы выполняем код V83COMConnector = Новый COMObject("V83.COMConnector");, операционная система обращается к своему реестру, чтобы найти библиотеку, отвечающую за этот программный идентификатор (ProgID). Если библиотека comcntr.dll не была зарегистрирована в системе должным образом или её разрядность не совпадает с разрядностью вызывающего процесса (например, 64-битный сервер 1С пытается вызвать 32-битную библиотеку), возникает ошибка регистрации класса.
Рассмотрим ситуацию, когда на одном сервере установлены разные версии платформы или сосуществуют 32- и 64-битные приложения. Windows хранит информацию о COM-объектах в разных ветках реестра для разных разрядностей, что и порождает большинство конфликтов.
Первым делом нам необходимо убедиться, что библиотека comcntr.dll нужной версии платформы зарегистрирована в реестре. Важно помнить, что в 64-битных версиях Windows существует две версии утилиты regsvr32.exe, и их расположение может показаться нелогичным.
Разберем алгоритм действий:
C:\Windows\System32\regsvr32.exe "C:\Program Files\1cv8\8.3.XX.XXXX\bin\comcntr.dll"
C:\Windows\SysWOW64\regsvr32.exe "C:\Program Files (x86)\1cv8\8.3.XX.XXXX\bin\comcntr.dll"
Проанализируем этот момент: System32 содержит 64-битные системные файлы, а SysWOW64 — 32-битные. Если вы перепутаете утилиты, регистрация может пройти успешно, но объект V83.COMConnector так и не заработает корректно.
Если на сервере установлено множество версий платформы, удобно использовать автоматизированный скрипт. Посмотрим на пример кода, который последовательно перерегистрирует нужные библиотеки, исключая старые версии:
set version=8.3.12.1529
set x64=C:\Program Files\1cv8\%version%\bin\comcntr.dll
set x32=C:\Program Files (x86)\1cv8\%version%\bin\comcntr.dll
set reg64=%systemroot%\System32\regsvr32.exe
set reg32=%systemroot%\SysWoW64\regsvr32.exe
%reg64% /i /s "%x64%"
%reg32% /i /s "%x32%"
Использование флага /s (silent) позволяет выполнить регистрацию без вывода диалоговых окон, что полезно при настройке серверов.
Иногда простой регистрации DLL недостаточно, особенно если 64-битному процессу rphost необходимо взаимодействовать с 32-битной библиотекой или наоборот. В этом случае мы воспользуемся механизмом COM+ для создания обертки.
Рассмотрим шаги по настройке:
V83_COMConnector) и установим способ активации "Серверное приложение".comcntr.dll.USR1CV8), чтобы избежать проблем с правами доступа.Такая настройка позволяет запускать библиотеку в отдельном процессе dllhost.exe, что решает проблему разрядности и конфликтов доступа.
Выясним причину, по которой даже после регистрации ошибка может сохраняться. Иногда в реестре Windows остаются "хвосты" от предыдущих версий платформы. Система находит GUID объекта V83.COMConnector, но путь в ключе InprocServer32 указывает на папку старой, удаленной версии.
Нам следует проверить следующие ветки реестра:
HKEY_CLASSES_ROOT\V83.COMConnector — здесь определяется GUID (Class ID) объекта.HKEY_CLASSES_ROOT\CLSID\{Ваш-GUID}\InprocServer32 — здесь должен быть прописан актуальный путь к comcntr.dll.Если вы видите путь к версии 8.3.10, а фактически используете 8.3.12, замените путь вручную или выполните повторную регистрацию regsvr32 нужной версии.
Проанализируем ситуацию с правами. Если код исполняется в регламентном задании на стороне сервера, то инициатором создания COM-объекта выступает пользователь, от которого запущена служба 1C:Enterprise 8.3 Server Agent.
Необходимо убедиться, что этот пользователь имеет права:
bin соответствующей версии платформы.dllhost.exe при работе через COM+. Попробуйте добавить dllhost.exe в исключения или временно отключить DEP для проверки.В завершение разберем перспективный подход. Фирма "1С" постепенно рекомендует отказываться от использования COM-технологий, так как они сильно привязаны к операционной системе Windows и имеют проблемы с разрядностью.
Если вы проектируете систему обмена данными "с нуля", рассмотрите использование HTTP-сервисов или Web-сервисов. Это позволит обмениваться данными между базами (даже если одна из них на Linux) без необходимости регистрации DLL и настройки прав в реестре Windows. Такой метод работает быстрее и стабильнее в современных распределенных системах.