Как устранить ошибку «Класс не зарегистрирован» при работе с весами через COM-порт в 1С?

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

Работа с торговым оборудованием, таким как весы, в среде 1С часто сопряжена с техническими сложностями, особенно когда база расположена на сервере, а сами устройства подключены к локальным рабочим местам. Одной из самых распространенных проблем является ошибка -2147221164(0x80040154): Класс не зарегистрирован при попытке инициализировать COM-объект. В этой статье мы подробно разберем причины возникновения этой ситуации, проанализируем влияние разрядности систем и рассмотрим пошаговые инструкции по настройке стабильной связи с оборудованием.

Причина проблемы: Конфликт разрядности 32 и 64 бит

Основная причина, по которой 1С выдает ошибку о незарегистрированном классе (даже если вы успешно выполнили regsvr32), заключается в архитектурном несовпадении. Проанализируем ситуацию: если вы используете 64-битный клиент 1С, он физически не может загрузить 32-битную DLL-библиотеку в свой адресный процесс. Это ограничение операционной системы Windows. Обратное также верно.

Рассмотрим, как проверить разрядность вашего клиента. В запущенной программе 1С перейдем в меню "Справка" — "О программе". В строке "Приложение" будет указано либо "Target: x86" (32 бита), либо "Target: x64". Если ваша библиотека vk_rs232.dll является 32-битной, она будет работать только в 32-битном клиенте.

Решение 1: Использование правильной версии клиента 1С

Самый простой и быстрый способ решить проблему — установить и запустить 32-битную версию тонкого или толстого клиента 1С на локальной машине, где подключены весы. Несмотря на то что операционная система может быть 64-битной, 32-битный клиент 1С прекрасно на ней работает и позволяет корректно инициализировать старые драйверы оборудования.

Посмотрим на пример кода, который часто вызывает ошибку:


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

Если вы столкнулись с ошибкой на этом этапе, проверьте разрядность. Если переход на 32-битный клиент невозможен, переходим к следующему варианту.

Решение 2: Регистрация библиотеки через COM+ (Суррогатный процесс)

Если нам критически важно использовать 64-битный клиент 1С с 32-битной библиотекой, воспользуемся функционалом Служб компонентов Windows (COM+). Этот метод позволяет запустить 32-битную DLL в отдельном системном процессе dllhost.exe, который будет выступать посредником.

Разберем по шагам процесс настройки:

  1. Откроем "Панель управления" — "Администрирование" — "Службы компонентов".
  2. Перейдем в ветку "Компьютеры" — "Мой компьютер" — "Приложения COM+".
  3. Создадим новое приложение (ПКМ — Создать — Приложение). Выберем "Создать новое пустое приложение", дадим ему имя (например, ScalesProxy) и установим тип "Серверное приложение".
  4. В созданном приложении перейдем в ветку "Компоненты", нажмем ПКМ — "Создать" — "Компонент".
  5. Выберем "Установка новых компонентов" и укажем путь к вашей DLL-библиотеке.
  6. После установки зайдем в свойства созданного компонента и на вкладке "Безопасность" снимем флаг "Принудительная проверка доступа".

Теперь 64-битная 1С сможет обратиться к этому компоненту через системный мост.

Решение 3: Переход на технологию Native API

Современным стандартом для 1С является использование внешних компонент, написанных по технологии Native API. В отличие от старых COM-объектов, такие компоненты не требуют регистрации в реестре через regsvr32 и могут содержать внутри одного архива версии сразу для обеих архитектур (x86 и x64).

Рассмотрим правильный алгоритм подключения современной компоненты:


// Подключение компоненты, упакованной в макет конфигурации
Результат = УстановитьВнешнююКомпоненту("ОбщийМакет.ДрайверВесов");
Если Результат Тогда
    Подключено = ПодключитьВнешнююКомпоненту("ОбщийМакет.ДрайверВесов", "Scales", ТипВнешнейКомпоненты.Native);
    Если Подключено Тогда
        ВесыОбъект = Новый("AddIn.Scales.VK_RS232");
    КонецЕсли;
КонецЕсли;

Проанализируем преимущество этого метода: 1С автоматически определит разрядность текущего клиента и извлечет из ZIP-архива нужную DLL (32 или 64 бит). Это избавляет системного администратора от необходимости ручной настройки каждого рабочего места.

Технические нюансы регистрации и RDP

Если вы все же используете COM и выполняете регистрацию вручную, обратите внимание на следующие моменты:

Альтернативные способы работы с портом

В некоторых случаях, если компонента слишком старая или работает нестабильно, можно рассмотреть работу с COM-портом как с файлом. В ОС Windows порты имеют зарезервированные имена. Рассмотрим пример прямого чтения данных (подходит для весов, работающих в режиме постоянной передачи данных):


// Пример упрощенного чтения из порта
ИмяПорта = "COM1";
КомандаСистемы("mode " + ИмяПорта + " baud=9600 parity=n data=8 stop=1");
Текст = Новый ТекстовыйДокумент;
// Обратите внимание, что этот метод может блокировать поток до получения данных
Попытка
    Текст.Прочитать("\\.\" + ИмяПорта);
    Данные = Текст.ПолучитьТекст();
Исключение
    Сообщить("Не удалось прочитать данные из порта");
КонецПопытки;

Однако помните, что полноценная работа (с командами запроса веса) требует специализированного драйвера, так как протоколы весов (например, CAS, Штрих-М или Масса-К) подразумевают обмен байтовыми последовательностями с контрольными суммами.

Подводя итог, выясним: если вы видите ошибку "Класс не зарегистрирован", первым делом проверьте соответствие разрядности клиента 1С и вашей DLL. В 90% случаев использование 32-битного клиента или настройка COM+ суррогата полностью решает проблему.

← На главную