Внешняя компонента в 1С:Предприятии 8.3: от regsvr32 до общего макета
Содержание
Зарегистрировать внешнюю компоненту в 1С можно двумя путями, и выбор зависит от её типа. COM-компоненту регистрируют в Windows командой regsvr32 от имени администратора, причём той же разрядности, что и процесс 1С. Native API-компоненту в Windows не регистрируют вообще: её ZIP-архив кладут в общий макет конфигурации и подключают методом ПодключитьВнешнююКомпоненту, а на клиенте один раз устанавливают через УстановитьВнешнююКомпоненту.
Частое заблуждение — пытаться «прогнать через regsvr32» любой DLL из комплекта драйвера. Для Native-компоненты это бессмысленно: Windows ответит, что точка входа DllRegisterServer не найдена. Это не поломка, а признак того, что компонента подключается средствами самой платформы. Всё ниже относится к платформе 8.3 и одинаково для любых конфигураций — Бухгалтерии, ЗУП, УТ.
Какая у вас компонента и что нужно подготовить
Начните с определения технологии. От неё зависит весь дальнейший порядок.
| Признак | Native API | COM | Устаревшая (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.
Порядок действий
- Скопируйте DLL в постоянную папку, например
C:\1C_Components\. Не регистрируйте файл изЗагрузокили временной папки: после очистки диска регистрация будет указывать в пустоту. - Запустите командную строку от имени администратора. Без повышенных прав
regsvr32вернёт ошибку доступа0x80070005. - Выберите
regsvr32нужной разрядности — это главная ловушка на 64-битной Windows. - Выполните команду и дождитесь сообщения об успешном вызове
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-компоненту правильно хранить внутри конфигурации. Тогда её не нужно раскладывать по рабочим местам: платформа сама извлечёт и установит нужную сборку.
Создание общего макета
- Откройте базу в Конфигураторе, затем
Конфигурация → Открыть конфигурацию. - В дереве метаданных разверните
Общие → Общие макеты, нажмитеДобавить. - Задайте имя, например
КомпонентаСканер, и тип макета «Внешняя компонента». - В открывшемся окне макета загрузите ZIP-архив из файла.
- Обновите конфигурацию базы данных (
F7).
Если конфигурация на поддержке и править её нельзя, сделайте то же самое в расширении конфигурации: общий макет добавляется в расширение так же, а типовая часть остаётся нетронутой.
Код подключения на клиенте
На клиенте сначала пробуют подключить компоненту. Не вышло — устанавливают её и подключают повторно. Пример для платформы с поддержкой Асинх/Ждать (номер не ниже 8.3.18):
&НаКлиенте
Асинх Процедура ПодключитьСканер(Команда)
Местоположение = "ОбщийМакет.КомпонентаСканер";
ИмяКомпоненты = "Сканер";
Подключено = Ждать ПодключитьВнешнююКомпонентуАсинх(Местоположение,
ИмяКомпоненты, ТипВнешнейКомпоненты.Native);
Если Не Подключено Тогда
Ждать УстановитьВнешнююКомпонентуАсинх(Местоположение);
Подключено = Ждать ПодключитьВнешнююКомпонентуАсинх(Местоположение,
ИмяКомпоненты, ТипВнешнейКомпоненты.Native);
КонецЕсли;
Если Не Подключено Тогда
Сообщить("Не удалось подключить внешнюю компоненту " + ИмяКомпоненты);
Возврат;
КонецЕсли;
// Имя объекта ScannerObj берётся из описания компоненты
Сканер = Новый("AddIn.Сканер.ScannerObj");
КонецПроцедуры
Строка типа объекта всегда собирается по шаблону AddIn.<имя при подключении>.<имя объекта в компоненте>. Первую часть задаёте вы, вторую — разработчик компоненты.
При установке на клиенте платформа покажет пользователю запрос на установку. Это защитный механизм, отключать его не нужно. Установленные сборки лежат в профиле пользователя, в папке %APPDATA%\1C\1cv8\ExtCompT.
Компонента из файла, а не из макета
Подключить можно и по полному пути к файлу на диске — для отладки это быстрее. Но в рабочей базе путь придётся поддерживать одинаковым на всех компьютерах, поэтому для эксплуатации лучше макет.
COM-объект в коде создают без всякого подключения, сразу конструктором:
Excel = Новый COMОбъект("Excel.Application");
Драйверы торгового оборудования
Для сканеров, весов и ККТ в типовых конфигурациях есть готовый механизм. В Бухгалтерии и УТ откройте Администрирование → Подключаемое оборудование, создайте экземпляр устройства и установите драйвер из его карточки. Конфигурация сама вызовет нужные методы установки — писать код не придётся.
Компонента в клиент-серверной базе
Когда код выполняется на сервере (&НаСервере, фоновые задания, регламентные операции), компоненту загружает рабочий процесс rphost. Значит, все условия переносятся на сервер.
| Что проверить | Native API | COM |
|---|---|---|
| Где регистрировать | Нигде, платформа извлечёт сборку из макета сама | На каждом рабочем сервере кластера |
| Разрядность | В архиве должна быть сборка под разрядность и ОС сервера | 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?
Как узнать ProgID COM-компоненты, если документации нет?
regedit и найдите в HKEY_CLASSES_ROOT\CLSID подраздел с путём к вашей DLL в InprocServer32. Рядом в подразделе ProgID записано имя класса.