Работа с торговым оборудованием, таким как весы, в среде 1С часто сопряжена с техническими сложностями, особенно когда база расположена на сервере, а сами устройства подключены к локальным рабочим местам. Одной из самых распространенных проблем является ошибка -2147221164(0x80040154): Класс не зарегистрирован при попытке инициализировать COM-объект. В этой статье мы подробно разберем причины возникновения этой ситуации, проанализируем влияние разрядности систем и рассмотрим пошаговые инструкции по настройке стабильной связи с оборудованием.
Основная причина, по которой 1С выдает ошибку о незарегистрированном классе (даже если вы успешно выполнили regsvr32), заключается в архитектурном несовпадении. Проанализируем ситуацию: если вы используете 64-битный клиент 1С, он физически не может загрузить 32-битную DLL-библиотеку в свой адресный процесс. Это ограничение операционной системы Windows. Обратное также верно.
Рассмотрим, как проверить разрядность вашего клиента. В запущенной программе 1С перейдем в меню "Справка" — "О программе". В строке "Приложение" будет указано либо "Target: x86" (32 бита), либо "Target: x64". Если ваша библиотека vk_rs232.dll является 32-битной, она будет работать только в 32-битном клиенте.
Самый простой и быстрый способ решить проблему — установить и запустить 32-битную версию тонкого или толстого клиента 1С на локальной машине, где подключены весы. Несмотря на то что операционная система может быть 64-битной, 32-битный клиент 1С прекрасно на ней работает и позволяет корректно инициализировать старые драйверы оборудования.
Посмотрим на пример кода, который часто вызывает ошибку:
// Попытка создания объекта напрямую через COM
Попытка
мОбъект = Новый COMОбъект("AddIn.vk_rs232");
Исключение
Сообщить("Ошибка инициализации: " + ОписаниеОшибки());
КонецПопытки;
Если вы столкнулись с ошибкой на этом этапе, проверьте разрядность. Если переход на 32-битный клиент невозможен, переходим к следующему варианту.
Если нам критически важно использовать 64-битный клиент 1С с 32-битной библиотекой, воспользуемся функционалом Служб компонентов Windows (COM+). Этот метод позволяет запустить 32-битную DLL в отдельном системном процессе dllhost.exe, который будет выступать посредником.
Разберем по шагам процесс настройки:
ScalesProxy) и установим тип "Серверное приложение".Теперь 64-битная 1С сможет обратиться к этому компоненту через системный мост.
Современным стандартом для 1С является использование внешних компонент, написанных по технологии Native API. В отличие от старых COM-объектов, такие компоненты не требуют регистрации в реестре через regsvr32 и могут содержать внутри одного архива версии сразу для обеих архитектур (x86 и x64).
Рассмотрим правильный алгоритм подключения современной компоненты:
// Подключение компоненты, упакованной в макет конфигурации
Результат = УстановитьВнешнююКомпоненту("ОбщийМакет.ДрайверВесов");
Если Результат Тогда
Подключено = ПодключитьВнешнююКомпоненту("ОбщийМакет.ДрайверВесов", "Scales", ТипВнешнейКомпоненты.Native);
Если Подключено Тогда
ВесыОбъект = Новый("AddIn.Scales.VK_RS232");
КонецЕсли;
КонецЕсли;
Проанализируем преимущество этого метода: 1С автоматически определит разрядность текущего клиента и извлечет из ZIP-архива нужную DLL (32 или 64 бит). Это избавляет системного администратора от необходимости ручной настройки каждого рабочего места.
Если вы все же используете COM и выполняете регистрацию вручную, обратите внимание на следующие моменты:
C:\Windows\SysWOW64\regsvr32.exe, а не из System32.В некоторых случаях, если компонента слишком старая или работает нестабильно, можно рассмотреть работу с COM-портом как с файлом. В ОС Windows порты имеют зарезервированные имена. Рассмотрим пример прямого чтения данных (подходит для весов, работающих в режиме постоянной передачи данных):
// Пример упрощенного чтения из порта
ИмяПорта = "COM1";
КомандаСистемы("mode " + ИмяПорта + " baud=9600 parity=n data=8 stop=1");
Текст = Новый ТекстовыйДокумент;
// Обратите внимание, что этот метод может блокировать поток до получения данных
Попытка
Текст.Прочитать("\\.\" + ИмяПорта);
Данные = Текст.ПолучитьТекст();
Исключение
Сообщить("Не удалось прочитать данные из порта");
КонецПопытки;
Однако помните, что полноценная работа (с командами запроса веса) требует специализированного драйвера, так как протоколы весов (например, CAS, Штрих-М или Масса-К) подразумевают обмен байтовыми последовательностями с контрольными суммами.
Подводя итог, выясним: если вы видите ошибку "Класс не зарегистрирован", первым делом проверьте соответствие разрядности клиента 1С и вашей DLL. В 90% случаев использование 32-битного клиента или настройка COM+ суррогата полностью решает проблему.