К статье
Практический материал

Разработка и Конфигурация · 12 мин

ActiveX в 1С 8: назначение, подключение и практика работы

Что такое ActiveX в 1С 8, как подключить внешнюю ActiveX-компоненту, работать с ней из встроенного языка и какие ограничения и риски учитывать.

ActiveX в 1С 8 — это механизм, позволяющий использовать в прикладном решении внешние COM-компоненты (ActiveX-элементы управления), зарегистрированные в операционной системе Windows. Через ActiveX из встроенного языка 1С можно обращаться к сторонним библиотекам: сканерам штрих-кодов, криптографическим провайдерам, элементам визуализации, драйверам оборудования и другим программным компонентам, у которых есть COM-интерфейс.

Технология появилась задолго до платформы «1С:Предприятие 8» и считается устаревающей: современные версии платформы предлагают более безопасные и кроссплатформенные способы расширения функциональности — внешние компоненты по технологии Native API, COM-соединение, веб-сервисы и HTTP-запросы. Тем не менее ActiveX продолжает применяться в старых конфигурациях и в сценариях, где сторонний производитель поставляет только ActiveX-элемент, например для подписания документов в браузерных решениях или работы со специфическим оборудованием.

Понимание того, как работает ActiveX в 1С 8, нужно в трёх ситуациях: при сопровождении унаследованного кода, при интеграции с оборудованием или ПО, у которого нет другого интерфейса, и при диагностике ошибок вида «Ошибка создания объекта ActiveX». Ниже разобраны принцип работы, способы подключения, типовой код, ограничения и безопасные альтернативы.

Как работает ActiveX в контексте платформы 1С 8

ActiveX — это частный случай COM-технологии Microsoft. Компонент представляет собой библиотеку (обычно DLL или OCX), которая регистрируется в системном реестре Windows и получает уникальный идентификатор класса (CLSID) и программный идентификатор (ProgID), например «Vendor.Component». Платформа 1С обращается к компоненту через COM-инфраструктуру операционной системы: создаёт экземпляр объекта, вызывает его методы и читает свойства.

С точки зрения встроенного языка существует два сценария. Первый — программное создание объекта через конструктор Новый COMОбъект("ProgID"), когда компонент не имеет визуального интерфейса и используется как библиотека функций. Второй — размещение элемента управления ActiveX на форме, когда компонент визуальный (например, элемент просмотра или ввода). Второй сценарий доступен только в толстом клиенте обычного приложения и в управляемых формах с ограничениями.

Важно понимать, что платформа 1С сама по себе не содержит ActiveX-компонентов — она лишь клиент. Если компонент не установлен и не зарегистрирован на компьютере, где выполняется код, обращение завершится ошибкой. В клиент-серверном режиме код, исполняемый на сервере 1С, будет искать компонент на сервере, а не на компьютере пользователя, что часто становится причиной неочевидных сбоев.

Когда ActiveX в 1С 8 действительно нужен

Основной легитимный сценарий — интеграция с оборудованием или ПО, для которого производитель поставляет только ActiveX/COM-интерфейс. Так встречаются некоторые криптографические библиотеки, компоненты работы с электронной подписью, драйверы специализированных сканеров и старые версии офисных библиотек. Если альтернативного API у поставщика нет, ActiveX остаётся единственным рабочим путём.

Второй сценарий — сопровождение унаследованных решений. Многие конфигурации, написанные под платформу 8.0–8.2, активно используют ActiveX-элементы на формах: поля HTML-документа, элементы отображения диаграмм, компоненты печати штрих-кодов. При миграции таких решений нужно чётко понимать, что делает каждый компонент, чтобы корректно заменить его современным аналогом.

Сравнение вариантов

ActiveX / COMОбъект

Подходит, если у поставщика есть только COM-интерфейс. Ограничение: только Windows, требуется регистрация компонента на каждой машине исполнения.

Внешняя компонента Native API

Рекомендуемый путь для новых разработок: работает в тонком и веб-клиенте, подключается как макет конфигурации, не требует регистрации в реестре.

HTTP / веб-сервисы

Подходит, если функциональность можно вынести в отдельный сервис. Кроссплатформенно, но требует сетевого взаимодействия и разработки сервиса.

Как подключить ActiveX-компонент программно

Программное подключение выполняется через конструктор Новый COMОбъект(), которому передаётся ProgID компонента. ProgID указывается в документации поставщика; его также можно найти в реестре Windows в ветке HKEY_CLASSES_ROOT. Перед использованием компонент должен быть установлен и зарегистрирован командой regsvr32 для OCX/DLL либо штатным установщиком поставщика.

Типовой фрагмент кода с защитой от ошибок выглядит так:

Попытка

Компонент = Новый COMОбъект("Vendor.Component");

Исключение

Сообщить("Не удалось создать ActiveX-объект: " + ОписаниеОшибки());

Возврат;

КонецПопытки;

Результат = Компонент.DoWork(Параметр);

Порядок действий
  1. 1
    Установите компонент от поставщика или зарегистрируйте DLL/OCX командой regsvr32 от имени администратора
  2. 2
    Найдите ProgID компонента в документации или в реестре HKEY_CLASSES_ROOT
  3. 3
    Создайте объект в коде через Новый COMОбъект с обработкой исключения
  4. 4
    Вызовите нужные методы и проверьте возвращаемые значения
  5. 5
    Протестируйте код именно в том окружении, где он будет исполняться: на клиенте или на сервере

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

Размещение элемента ActiveX на форме

Визуальный ActiveX-элемент добавляется на форму в конфигураторе через вставку элемента управления типа ActiveX — в диалоге выбора система показывает список зарегистрированных на текущем компьютере компонентов. После размещения доступ к объекту элемента выполняется через свойства формы, а события элемента можно перехватывать в модуле формы.

Этот способ имеет жёсткие ограничения. В тонком клиенте и веб-клиенте произвольные ActiveX-элементы не работают: веб-клиент исполняется в браузере, где поддержка ActiveX существовала только в устаревших версиях Internet Explorer. Поэтому формы с ActiveX-элементами в современных режимах работы либо не открываются корректно, либо требуют замены элемента на поле HTML-документа, поле табличного документа или внешнюю компоненту.

Типичные ошибки и их диагностика

Самая частая ошибка — исключение при создании объекта с текстом вида «Недопустимая строка с указанием класса» или «Класс не зарегистрирован». Она означает, что компонент отсутствует на машине исполнения, зарегистрирован не той разрядности или ProgID указан с опечаткой. Проверка начинается с поиска ProgID в реестре и попытки создать объект из простого скрипта PowerShell или VBScript вне 1С — это отделяет проблему регистрации от проблемы в коде конфигурации.

Вторая группа ошибок связана с местом исполнения кода. Код с директивой &НаСервере ищет компонент на сервере 1С, а не у пользователя. Если компонент установлен только на клиентских машинах, вызов нужно перенести в клиентский контекст. Обратная ситуация — обращение к клиентскому оборудованию с сервера — принципиально невозможно без промежуточного звена.

Типичные ошибки
01
Вызов COMОбъекта без обработки исключения — при отсутствии компонента пользователь получает аварийное завершение процедуры вместо понятного сообщения
02
Регистрация 32-разрядного компонента и запуск кода на 64-разрядном сервере — объект не создаётся, причина неочевидна
03
Исполнение кода на сервере при компоненте, установленном только на клиентских машинах — ошибка «класс не зарегистрирован» только у сервера
04
Утечка ресурсов: объект не освобождается, ссылка хранится в глобальной переменной, внешнее приложение остаётся висеть в процессах
Контрольные точки

Как проверить результат

Создание объекта
Норма

Конструктор Новый COMОбъект выполняется без исключения

Тревожный признак

Исключение «класс не зарегистрирован» или «недопустимая строка с указанием класса»

Вызов методов
Норма

Методы возвращают ожидаемые значения, оборудование или библиотека реагируют

Тревожный признак

Ошибки вызова методов, пустые или некорректные значения

Завершение работы
Норма

После присваивания Неопределено внешний процесс выгружается из памяти

Тревожный признак

Процесс компонента остаётся в диспетчере задач после закрытия 1С

Безопасность и ограничения технологии

ActiveX-компонент исполняется в процессе, который его загрузил, с полными правами этого процесса. Скомпрометированный или уязвимый компонент способен читать файлы, обращаться к сети и менять данные от имени пользователя 1С или сервера. Поэтому правило простое: использовать только подписанные компоненты проверенных поставщиков и своевременно обновлять их.

Архитектурные ограничения тоже существенны. Технология привязана к Windows — на Linux-сервере 1С ActiveX недоступен. Веб-клиент и мобильная платформа произвольные ActiveX не поддерживают. При проектировании нового решения зависимость от ActiveX означает зависимость от конкретной инфраструктуры, что усложняет масштабирование и перевод системы в облачные или кроссплатформенные сценарии.

Маршрут решения

Как выбрать действие

Поставщик даёт только ActiveX/COM-интерфейс, альтернатив нетИспользуйте Новый COMОбъект с обработкой исключений, зафиксируйте требования к разрядности и месту исполнения
Разрабатывается новая функциональность под тонкий и веб-клиентПроектируйте внешнюю компоненту по Native API или интеграцию через HTTP-сервис
Старая форма с ActiveX-элементом перестала работать в тонком клиентеЗамените элемент на поле HTML-документа, поле табличного документа или внешнюю компоненту
Компонент 32-разрядный, а сервер 1С 64-разрядныйПеренесите вызов на 32-разрядного клиента или оберните компонент в отдельный 32-разрядный процесс

Современные альтернативы ActiveX в 1С

Основная замена — внешние компоненты по технологии Native API. Они подключаются из макета конфигурации методом ПодключитьВнешнююКомпоненту(), работают в толстом, тонком и веб-клиенте, не требуют записи в системный реестр и могут поставляться в сборках под разные платформы одновременно. Для типовых задач — сканеры, криптография, обмен с оборудованием — существуют готовые компоненты как от фирмы «1С», так и от сторонних разработчиков.

Для интеграционных задач, где не нужен прямой доступ к оборудованию пользователя, часто достаточно HTTP-запросов к внешнему сервису или веб-сервисов. Это снимает зависимость от Windows, упрощает обновление логики (она меняется в одном месте — на стороне сервиса) и позволяет работать из любого клиента 1С, включая веб-клиент и мобильные приложения.

Итог

Что важно запомнить

ActiveX в 1С 8 — это вызов зарегистрированных в Windows COM-компонентов через Новый COMОбъект или элементы формы. Технология работает только под Windows, чувствительна к разрядности и месту исполнения кода, требует доверия к поставщику компонента. Для новых разработок выбирайте внешние компоненты Native API или сервисную интеграцию.

Частые вопросы

Чем ActiveX отличается от внешней компоненты 1С?

ActiveX — это COM-компонент Windows, зарегистрированный в реестре и работающий только под Windows. Внешняя компонента 1С создаётся по технологии Native API, подключается из макета конфигурации без регистрации в системе и может работать в тонком, веб-клиенте и на разных ОС.

Почему возникает ошибка «Класс не зарегистрирован» при создании COMОбъекта?

Компонент не установлен на машине, где исполняется код, зарегистрирован не той разрядности (32/64 бита) или ProgID указан с ошибкой. Проверьте наличие ProgID в реестре и попробуйте создать объект из PowerShell вне 1С.

Работает ли ActiveX в веб-клиенте 1С?

Произвольные ActiveX-элементы в веб-клиенте не работают: поддержка ActiveX существовала только в устаревших версиях Internet Explorer. Для веб-клиента используйте внешние компоненты Native API или заменяйте элементы на штатные поля формы.

Можно ли использовать ActiveX на сервере 1С под Linux?

Нет. COM/ActiveX — технология Windows, на Linux-сервере она недоступна. Код с COMОбъект нужно либо переносить на Windows-клиента, либо заменять кроссплатформенным механизмом: внешней компонентой или HTTP-интеграцией.

Как безопасно освободить ActiveX-объект после работы?

Присвойте переменной значение Неопределено после завершения работы и не храните ссылку в глобальных переменных. Если компонент запускает внешний процесс, вызывайте его штатный метод завершения (Quit, Close и подобный) до освобождения ссылки.

Где взять ProgID компонента, если документации нет?

Откройте реестр Windows и поищите в ветке HKEY_CLASSES_ROOT записи, связанные с именем поставщика или файла компонента. Также список зарегистрированных ActiveX-элементов виден в диалоге вставки элемента ActiveX на форму в конфигураторе.