Внешняя компонента в 1С:Предприятии 8.3: от regsvr32 до общего макета

· 10 мин

Содержание

Зарегистрировать внешнюю компоненту в 1С можно двумя путями, и выбор зависит от её типа. COM-компоненту регистрируют в Windows командой regsvr32 от имени администратора, причём той же разрядности, что и процесс 1С. Native API-компоненту в Windows не регистрируют вообще: её ZIP-архив кладут в общий макет конфигурации и подключают методом ПодключитьВнешнююКомпоненту, а на клиенте один раз устанавливают через УстановитьВнешнююКомпоненту.

Частое заблуждение — пытаться «прогнать через regsvr32» любой DLL из комплекта драйвера. Для Native-компоненты это бессмысленно: Windows ответит, что точка входа DllRegisterServer не найдена. Это не поломка, а признак того, что компонента подключается средствами самой платформы. Всё ниже относится к платформе 8.3 и одинаково для любых конфигураций — Бухгалтерии, ЗУП, УТ.

Какая у вас компонента и что нужно подготовить

Начните с определения технологии. От неё зависит весь дальнейший порядок.

ПризнакNative APICOMУстаревшая (AddIn через COM)
Что в комплектеZIP-архив с MANIFEST.XML и DLL/SO внутриОдна DLL или EXE, иногда с установщикомDLL с методом ПодключитьВнешнююКомпоненту("ProgID")
Регистрация в WindowsНе нужнаregsvr32 или установщик поставщикаregsvr32
Работает на LinuxДа, если в архиве есть SO-файлыНетНет
Веб-клиентДа, если в архиве есть модули для браузеровТолько Internet Explorer, на практике нетНет
Где обычно встречаетсяСовременное торговое оборудование, сканеры, ККТСтарые драйверы, Excel, Word, собственные библиотекиКомпоненты времён 1С 7.7 и 8.0

Перед регистрацией соберите:

  • 📦 сам файл компоненты от поставщика — желательно последнюю версию, а не найденную на форуме;
  • 🔢 разрядность DLL (32 или 64 бита) — обычно указана в имени файла или документации;
  • 🆔 ProgID для COM-объекта (вида Vendor.Scanner) или имя объекта Native-компоненты — их пишут в описании компоненты;
  • 🖥️ разрядность клиента и сервера 1С: в окне О программе клиента указано, 32- или 64-разрядная платформа запущена.

Заглянуть внутрь Native-архива полезно сразу. Откройте ZIP любым архиватором и найдите MANIFEST.XML. В нём перечислены сборки с атрибутами os (Windows, Linux, MacOS) и arch (i386, x86_64). Если нужной пары нет, компонента на этой системе не заработает, как её ни подключай.

<?xml version="1.0" encoding="UTF-8"?>
<bundle xmlns="http://v8.1c.ru/8.2/addin/bundle">
  <component os="Windows" path="Scanner_x32.dll" type="native" arch="i386"/>
  <component os="Windows" path="Scanner_x64.dll" type="native" arch="x86_64"/>
  <component os="Linux" path="libScanner_x64.so" type="native" arch="x86_64"/>
</bundle>

Регистрация COM-компоненты в Windows

COM-объект становится доступен 1С только после того, как Windows запишет его класс в реестр. Делается это командой regsvr32.

Порядок действий

  1. Скопируйте DLL в постоянную папку, например C:\1C_Components\. Не регистрируйте файл из Загрузок или временной папки: после очистки диска регистрация будет указывать в пустоту.
  2. Запустите командную строку от имени администратора. Без повышенных прав regsvr32 вернёт ошибку доступа 0x80070005.
  3. Выберите regsvr32 нужной разрядности — это главная ловушка на 64-битной Windows.
  4. Выполните команду и дождитесь сообщения об успешном вызове DllRegisterServer.
:: 64-разрядная DLL на 64-разрядной Windows
C:\Windows\System32\regsvr32.exe "C:\1C_Components\Scanner_x64.dll"

:: 32-разрядная DLL на 64-разрядной Windows
C:\Windows\SysWOW64\regsvr32.exe "C:\1C_Components\Scanner_x32.dll"

:: Отменить регистрацию перед заменой версии
C:\Windows\SysWOW64\regsvr32.exe /u "C:\1C_Components\Scanner_x32.dll"

Названия папок путают все: System32 на 64-битной Windows содержит 64-битные программы, а SysWOW64 — 32-битные. Запомните это один раз.

Разрядность должна совпадать с процессом 1С

32-разрядный клиент 1С видит только 32-битные COM-объекты, 64-разрядный — только 64-битные. Если DLL у вас одна и 32-битная, есть два выхода:

  • поставить 32-разрядный клиент 1С на это рабочее место;
  • запустить DLL во внешнем процессе-суррогате Windows (dllhost.exe), чтобы 64-битный процесс обращался к ней через границу процессов.

Суррогат включают в реестре. Нужен CLSID класса — его видно в ветке HKEY_CLASSES_ROOT\<ProgID>\CLSID после регистрации.

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{ВАШ-CLSID}]
"AppID"="{ВАШ-CLSID}"

[HKEY_CLASSES_ROOT\Wow6432Node\AppID\{ВАШ-CLSID}]
"DllSurrogate"=""

Правка реестра затрагивает всю систему. Сделайте экспорт ветки перед изменением, чтобы можно было откатиться.

COM-соединение с самой 1С

Отдельный случай — внешняя программа (Excel, скрипт, другая база) подключается к 1С через V8.COMConnector. Этот объект живёт в файле comcntr.dll в папке bin установленной платформы. Если программа пишет, что класс не зарегистрирован, зарегистрируйте файл вручную:

C:\Windows\System32\regsvr32.exe "C:\Program Files\1cv8\8.3.25.1374\bin\comcntr.dll"

Номер версии в пути подставьте свой. После обновления платформы проверьте, что зарегистрирован comcntr.dll из новой папки: иначе соединение будет идти через старую версию и упадёт с ошибкой несоответствия версий клиента и сервера.

Добавление компоненты в конфигурацию через Конфигуратор

Native-компоненту правильно хранить внутри конфигурации. Тогда её не нужно раскладывать по рабочим местам: платформа сама извлечёт и установит нужную сборку.

Создание общего макета

  1. Откройте базу в Конфигураторе, затем Конфигурация → Открыть конфигурацию.
  2. В дереве метаданных разверните Общие → Общие макеты, нажмите Добавить.
  3. Задайте имя, например КомпонентаСканер, и тип макета «Внешняя компонента».
  4. В открывшемся окне макета загрузите ZIP-архив из файла.
  5. Обновите конфигурацию базы данных (F7).

Если конфигурация на поддержке и править её нельзя, сделайте то же самое в расширении конфигурации: общий макет добавляется в расширение так же, а типовая часть остаётся нетронутой.

Код подключения на клиенте

На клиенте сначала пробуют подключить компоненту. Не вышло — устанавливают её и подключают повторно. Пример для платформы с поддержкой Асинх/Ждать (номер не ниже 8.3.18):

&НаКлиенте
Асинх Процедура ПодключитьСканер(Команда)

    Местоположение = "ОбщийМакет.КомпонентаСканер";
    ИмяКомпоненты  = "Сканер";

    Подключено = Ждать ПодключитьВнешнююКомпонентуАсинх(Местоположение,
        ИмяКомпоненты, ТипВнешнейКомпоненты.Native);

    Если Не Подключено Тогда
        Ждать УстановитьВнешнююКомпонентуАсинх(Местоположение);
        Подключено = Ждать ПодключитьВнешнююКомпонентуАсинх(Местоположение,
            ИмяКомпоненты, ТипВнешнейКомпоненты.Native);
    КонецЕсли;

    Если Не Подключено Тогда
        Сообщить("Не удалось подключить внешнюю компоненту " + ИмяКомпоненты);
        Возврат;
    КонецЕсли;

    // Имя объекта ScannerObj берётся из описания компоненты
    Сканер = Новый("AddIn.Сканер.ScannerObj");

КонецПроцедуры

Строка типа объекта всегда собирается по шаблону AddIn.<имя при подключении>.<имя объекта в компоненте>. Первую часть задаёте вы, вторую — разработчик компоненты.

При установке на клиенте платформа покажет пользователю запрос на установку. Это защитный механизм, отключать его не нужно. Установленные сборки лежат в профиле пользователя, в папке %APPDATA%\1C\1cv8\ExtCompT.

Компонента из файла, а не из макета

Подключить можно и по полному пути к файлу на диске — для отладки это быстрее. Но в рабочей базе путь придётся поддерживать одинаковым на всех компьютерах, поэтому для эксплуатации лучше макет.

COM-объект в коде создают без всякого подключения, сразу конструктором:

Excel = Новый COMОбъект("Excel.Application");

Драйверы торгового оборудования

Для сканеров, весов и ККТ в типовых конфигурациях есть готовый механизм. В Бухгалтерии и УТ откройте Администрирование → Подключаемое оборудование, создайте экземпляр устройства и установите драйвер из его карточки. Конфигурация сама вызовет нужные методы установки — писать код не придётся.

Компонента в клиент-серверной базе

Когда код выполняется на сервере (&НаСервере, фоновые задания, регламентные операции), компоненту загружает рабочий процесс rphost. Значит, все условия переносятся на сервер.

Что проверитьNative APICOM
Где регистрироватьНигде, платформа извлечёт сборку из макета самаНа каждом рабочем сервере кластера
РазрядностьВ архиве должна быть сборка под разрядность и ОС сервераDLL под разрядность сервера 1С или суррогат
Учётная записьПрава на временный каталог процессаПрава пользователя службы на папку с DLL
Вызов установкиУстановитьВнешнююКомпоненту на сервере не нуженНе нужен

Типовые подводные камни:

  • 🧩 В кластере несколько рабочих серверов. Код может выполниться на любом из них. COM-компонента, зарегистрированная только на одном, будет работать «через раз».
  • 👤 Служба запущена от отдельного пользователя (часто USR1CV8). Ему нужны права на чтение и выполнение папки с DLL и её зависимостей.
  • 🐧 Сервер на Linux. COM там нет совсем. Подойдёт только Native-компонента с SO-сборкой в архиве.
  • 🔄 Замена версии. Новая COM-DLL под тем же именем подхватится только после перезапуска рабочих процессов.

Перезапуск рабочих процессов или службы сервера 1С обрывает сеансы всех пользователей. Делайте это вне рабочего времени и предупреждайте людей заранее.

Безопасный режим, профили безопасности и права

Компонента выполняет машинный код с правами процесса 1С. Поэтому платформа ограничивает её подключение в нескольких местах.

Безопасный режим

Внешние отчёты и обработки в типовых конфигурациях часто запускаются в безопасном режиме. В нём подключение внешних компонент и создание COM-объектов запрещено. Если ваша обработка вызывает компоненту, разрешите её запуск без безопасного режима при регистрации в справочнике дополнительных отчётов и обработок или перенесите вызов в конфигурацию либо расширение.

Профили безопасности кластера

Если в кластере включены профили безопасности, у профиля информационной базы есть список разрешённых внешних компонент и COM-классов. Компонента, которой нет в списке, не подключится даже из конфигурации. Профили настраивают в консоли администрирования серверов 1С, в ветке кластера. Изменять их должен администратор сервера.

Права в Windows

  • 🔐 Регистрация COM — только от администратора.
  • 📁 Пользователю, под которым запущен клиент или служба, нужно право чтения и выполнения на файл DLL.
  • 🛡️ Антивирус иногда помещает неподписанные DLL в карантин. Если файл исчезает после копирования, проверьте журнал антивируса и добавьте папку в исключения.

Если компонента не подключается: разбор ошибок

Большинство сбоев сводится к трём причинам: не та разрядность, не тот тип компоненты, не хватает прав или зависимостей. Найдите свой симптом:

Диагностика: выберите симптом

Как проверить регистрацию COM-объекта без 1С

Быстрый тест — создать объект из скрипта Windows той же разрядности. Сохраните строку в файл test.vbs:

Set o = CreateObject("Vendor.Scanner")
WScript.Echo "Объект создан"

Запустите его через C:\Windows\System32\cscript.exe test.vbs для 64 бит и через C:\Windows\SysWOW64\cscript.exe test.vbs для 32 бит. Если скрипт создаёт объект, а 1С нет, проблема в разрядности 1С, правах или профиле безопасности, а не в регистрации.

Что ещё помогает

  • 📜 Включите технологический журнал на сервере, если ошибка возникает только в серверном коде: в нём видно, какой процесс и какую библиотеку пытался загрузить.
  • 🧹 После замены версии Native-компоненты удалите старую копию из %APPDATA%\1C\1cv8\ExtCompT на проблемном рабочем месте, закрыв перед этим клиент 1С.
  • 🔁 Если после обновления платформы перестало работать COM-соединение, перерегистрируйте comcntr.dll из папки новой версии.

Частые ошибки при установке компонент

  • ❌ Регистрация «на всякий случай» обеих версий DLL под одним ProgID. Последняя зарегистрированная перезапишет класс в своей ветке реестра, и разобраться, какая версия работает, становится трудно. Регистрируйте только нужную.
  • ❌ Компонента в макете обработки, а не конфигурации. Во внешней обработке макет тоже работает, но обработку запускают в безопасном режиме — и подключение блокируется.
  • ❌ Хранение DLL на сетевом диске. При обрыве связи падает клиент 1С. Кладите файл на локальный диск каждого компьютера.
  • ❌ Удаление DLL без отмены регистрации. В реестре остаётся ссылка на несуществующий файл. Перед удалением выполните regsvr32 /u.

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

Нужна ли лицензия 1С, чтобы подключить внешнюю компоненту?
Отдельной лицензии платформы не нужно. Но у многих коммерческих компонент своя защита: ключ или файл активации от поставщика.
Можно ли подключить одну и ту же компоненту в файловой и серверной базе?
Да. Код подключения одинаковый. Разница в том, где выполняется код: в файловой базе серверный код тоже работает на компьютере пользователя, поэтому компонента должна быть установлена там.
Работают ли внешние компоненты в тонком клиенте на Linux и macOS?
Только Native-компоненты, в архиве которых есть сборки для этих систем. COM-компоненты там недоступны.
Как узнать ProgID COM-компоненты, если документации нет?
Откройте regedit и найдите в HKEY_CLASSES_ROOT\CLSID подраздел с путём к вашей DLL в InprocServer32. Рядом в подразделе ProgID записано имя класса.
Нужно ли заново устанавливать компоненту после обновления конфигурации?
Если макет не менялся, нет. Если поставщик выпустил новую версию и вы заменили архив в макете, платформа предложит установить обновлённую сборку при следующем подключении.