При интеграции 1С с внешними системами, такими как АСУ ВРК (Автоматизированная система управления вагоноремонтным комплексом), разработчики часто сталкиваются с использованием технологии COM. Одной из самых распространенных проблем является ошибка при вызове конструктора: Ошибка при вызове конструктора (COMОбъект): -2147221164(0x80040154): Класс не зарегистрирован. Рассмотрим подробно, почему это происходит и как правильно настроить окружение для стабильной работы.
Первым делом проанализируем ситуацию. Ошибка 0x80040154 почти всегда означает, что операционная система не может найти запись о COM-классе в системном реестре, соответствующую архитектуре запущенного приложения. В нашем случае ситуация выглядит так:
asu_vrk_com.dll является 32-битной (x86).Важно понимать: 64-битный процесс (1С) не может напрямую загрузить в свое адресное пространство 32-битную динамическую библиотеку (DLL). Даже если вы успешно зарегистрировали ее через regsvr32, для 64-битной 1С она останется «невидимой» в стандартном контексте. Разберем по шагам, как решить эту проблему.
Если вы работаете в 64-разрядной Windows, обычный запуск команды регистрации может подтянуть 64-битную версию регистратора, которая пропишет данные не в ту ветку реестра. Для 32-битных компонент нужно использовать регистратор из папки SysWOW64.
Рассмотрим порядок действий:
C:\Windows\SysWOW64\regsvr32.exe "C:\ПутьКФайлу\asu_vrk_com.dll"
Если регистрация прошла успешно, вы увидите сообщение «DllRegisterServer в ... успешно». Однако, если 1С все еще выдает ошибку, значит, проблема в прямой несовместимости разрядности процессов.
Это самый надежный способ, позволяющий 64-битной 1С работать с 32-битной компонентой asu_vrk_com.dll. Мы создадим специальный контейнер в Windows, который будет выступать посредником (bridge).
Разберем этот процесс по шагам:
dcomcnfg в строке поиска).dllhost.exe).asu_vrk_com.dll.Теперь, когда 1С вызовет Новый COMОбъект("asu_vrk_com.ASUVRK"), Windows поймет, что объект живет в контейнере COM+, запустит его в 32-битном окружении и пробросит данные в 64-битную 1С. Это стандартный механизм решения конфликтов разрядности.
Если архитектура вашей системы позволяет, самым простым решением будет установка и запуск 32-битного тонкого или толстого клиента 1С. В 32-битном приложении вызов 32-битной библиотеки произойдет мгновенно и без дополнительных настроек COM+. Посмотрите в свойствах «О программе» в 1С: если там указано «8.3.XX.XXXX (x86_64)», значит у вас 64-битная версия. Для работы напрямую вам нужна версия без приписки «64».
После того как мы разобрались с регистрацией и разрядностью, проанализируем ситуацию на стороне кода. Для файловой базы код выполняется на клиенте, поэтому библиотека должна быть настроена на каждом рабочем месте. Проверьте правильность создания объекта с обработкой исключений:
// Пример инициализации объекта АСУ ВРК
Попытка
АСУВРК = Новый COMОбъект("asu_vrk_com.ASUVRK");
Сообщить("Объект АСУ ВРК успешно создан!");
Исключение
ТекстОшибки = ОписаниеОшибки();
Сообщить("Не удалось создать объект АСУ ВРК. Возможно, компонента не зарегистрирована.");
Сообщить("Подробности: " + ТекстОшибки);
Возврат;
КонецПопытки;
// Типовой пример обращения к методам (уточните в документации АСУ ВРК)
// Результат = АСУВРК.Connect(Сервер, База, Логин, Пароль);
Рассмотрим еще несколько важных моментов, которые могут блокировать работу компоненты:
asu_vrk_com.dll требуется наличие файла настроек (например, connect.ini или settings.cfg) в той же папке, где лежит сама библиотека. Проверьте документацию к системе АСУ ВРК.Проанализируем ситуацию, если вы в будущем решите перейти на клиент-серверный вариант (SQL). В этом случае код, выполняемый НаСервере, потребует регистрации asu_vrk_com.dll именно на сервере 1С. Поскольку сервер 1С практически всегда 64-битный, настройка через COM+ (Решение 2) станет обязательной. При файловом режиме (как в вашем случае) все манипуляции производятся на локальном компьютере пользователя.
Резюме: Основная причина вашей ошибки — запуск 32-битной компоненты из 64-битной 1С. Используйте настройку через Службы компонентов (COM+) или перейдите на 32-битный клиент 1С, и проблема будет решена.