Как подключиться к внешней компоненте (DLL/OCX) с COM-интерфейсом в 1С?

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

При работе с торговым оборудованием, специфическими библиотеками или интеграциями программисты 1С часто сталкиваются с необходимостью подключения внешних объектов через COM-интерфейс. Ошибки типа "Invalid class string" или "Ошибка при загрузке внешней компоненты" могут поставить в тупик даже опытного разработчика. В этой статье мы подробно разберем, как правильно подключать такие библиотеки, как находить их внутренние идентификаторы и как бороться с конфликтами разрядности систем.

Различие между внешней компонентой 1С и ActiveX (COM)

Прежде всего, проанализируем ситуацию: почему метод ЗагрузитьВнешнююКомпоненту() может выдавать ошибку, в то время как Новый COMОбъект() кажется более подходящим? Важно различать эти технологии:

Если ваша библиотека (например, OPOSFiscalPrinter.ocx) является стандартным COM-сервером, то пытаться загрузить ее методом ЗагрузитьВнешнююКомпоненту() бесполезно. Вместо этого мы должны использовать механизм Новый COMОбъект.

Поиск правильного ProgID: интерфейс vs программный идентификатор

Рассмотрим типичную ошибку новичка. Автор темы пытался создать объект так:

OPOS = Новый COMОбъект("IOPOSFiscalPrinter");

Выясним причину неудачи: приставка "I" в начале имени (IOPOSFiscalPrinter) в технологии COM почти всегда обозначает Интерфейс. Однако конструктор Новый COMОбъект в 1С требует не имя интерфейса, а ProgID (Programmatic Identifier) класса. ProgID — это текстовая строка, которая связана с числовым идентификатором CLSID в реестре Windows.

Для стандартных OPOS-компонент корректный ProgID обычно выглядит как OPOS.FiscalPrinter или имеет вид ИмяПроизводителя.ИмяУстройства.

Как узнать точный ProgID компоненты?

Если документации нет, а библиотека зарегистрирована в системе (через regsvr32), мы можем найти её имя самостоятельно. Разберем несколько способов.

Способ 1: Использование Microsoft Excel

Этот метод часто оказывается самым простым для визуального поиска:

  1. Откройте Microsoft Excel и перейдите на вкладку "Разработчик".
  2. Нажмите кнопку "Надстройки", а затем выберите "Автоматизация" (или вставьте объект ActiveX через панель инструментов).
  3. В открывшемся списке найдите название вашей компоненты.
  4. Выделите её — в нижней части окна будет отображен искомый ProgID.

Способ 2: Поиск через реестр Windows (regedit)

Посмотрим на более глубокий технический подход. Все зарегистрированные COM-объекты находятся в ветке HKEY_CLASSES_ROOT. Проанализируем шаги:

  1. Откройте редактор реестра.
  2. Выполните поиск по названию файла вашей библиотеки (например, OPOSFiscalPrinter.ocx).
  3. Найдите ключ InprocServer32.
  4. Поднимитесь на уровень выше к ключу ProgID или VersionIndependentProgID. Значение этого ключа и есть та строка, которую нужно передать в 1С.

Способ 3: Использование PowerShell

Для быстрой проверки можно воспользоваться командой PowerShell, которая выведет все зарегистрированные классы, содержащие нужное слово:

Get-ChildItem HKLM:\Software\Classes | Where-Object { $_.PSChildName -match "FiscalPrinter" }

Проблема разрядности (32-бит против 64-бит)

Это критически важный момент, который часто упускают. Рассмотрим ситуацию: у вас установлена 64-битная версия 1С, а библиотека OPOS — 32-битная. В этом случае попытка создать COMОбъект напрямую закончится ошибкой, так как 64-битный процесс не может загрузить 32-битную DLL в свое адресное пространство.

Проанализируем возможные решения этой проблемы:

  1. Использование 32-битного клиента 1С. Если это допустимо, запустите 32-битную версию 1С:Предприятия.
  2. Настройка COM+ (Обертка). Это системный способ запустить 32-битную библиотеку в изолированном процессе dllhost.exe, с которым 64-битная 1С сможет взаимодействовать.

Чтобы настроить COM+, выполните следующие действия:

  1. Откройте "Службы компонентов" (dcomcnfg).
  2. Перейдите в "Компьютеры" -> "Мой компьютер" -> "Приложения COM+".
  3. Создайте новое пустое приложение (выберите тип "Серверное приложение").
  4. В ветке созданного приложения нажмите правой кнопкой на "Компоненты" -> "Создать" -> "Компонент".
  5. Выберите установку новых компонентов и укажите вашу DLL/OCX.
  6. В свойствах созданного приложения на вкладке "Удостоверение" укажите пользователя, от имени которого будет запускаться процесс (обычно "Локальный пользователь" или "Интерактивный пользователь").

Особенности работы с OPOS

Если вы подключаете именно фискальный регистратор по стандарту OPOS, помните, что создание COM-объекта — это лишь начало. Посмотрим на примерную структуру кода для инициализации устройства:


// 1. Создаем объект по его ProgID
Попытка
    OPOSОбъект = Новый COMОбъект("OPOS.FiscalPrinter");
Исключение
    Сообщить("Не удалось создать объект OPOS. Проверьте регистрацию библиотеки.");
    Возврат;
КонецПопытки;

// 2. Открываем устройство по его логическому имени (LDN)
// Логическое имя настраивается в утилите производителя драйвера
ЛогическоеИмя = "MyFiscalPrinter";
Результат = OPOSОбъект.Open(ЛогическоеИмя);

Если Результат <> 0 Тогда
    Сообщить("Ошибка открытия устройства: " + OPOSОбъект.ResultCode);
Иначе
    // 3. Захватываем устройство для работы
    OPOSОбъект.ClaimDevice(1000);
    OPOSОбъект.DeviceEnabled = Истина;
    Сообщить("Устройство готово к работе!");
КонецЕсли;

Резюме и рекомендации

Подведем итоги нашего исследования. Если 1С не видит вашу библиотеку:

Соблюдение этих шагов позволит вам успешно интегрировать практически любую внешнюю библиотеку в среду 1С:Предприятие.

← На главную