Как подключить COM-библиотеку (DLL) к 1С:Предприятие 8.3
Содержание
COM-библиотеку (DLL) для 1С 8.3 регистрируют командой regsvr32 из командной строки, запущенной от имени администратора. Главное правило: разрядность библиотеки должна совпадать с разрядностью процесса, который её загрузит. 64-разрядную DLL регистрирует regsvr32 из System32, 32-разрядную — из SysWOW64. После регистрации объект создаётся в коде одной строкой Новый COMОбъект("ProgID").
Это работает для внутрипроцессных COM-серверов — тех, что оформлены как .dll. Если библиотека поставляется как .exe (внешний или удалённый сервер), одной регистрации мало: понадобится настройка прав запуска и доступа в оснастке DCOM. Ниже — обе ситуации, разбор ошибки ActiveX-компонент не может создать объект, особенности работы в серверном варианте и альтернатива регистрации через внешние компоненты.
Что проверить до регистрации: разрядность и зависимости
Самая частая причина, по которой regsvr32 вроде бы отрабатывает, а объект в 1С не создаётся, — несовпадение разрядности. Логика простая: внутрипроцессная COM-DLL загружается прямо в адресное пространство процесса 1С, а 32- и 64-разрядные процессы чужие DLL друг другу не отдают.
Поэтому сначала определите, какой процесс будет создавать объект:
- 🖥 Толстый или тонкий клиент на рабочем месте — обычно это
1cv8.exe. В 8.3 он бывает и 32-, и 64-разрядным, зависит от установленного дистрибутива. - 🗄 Серверный контекст — код выполняется в рабочем процессе
rphost.exeна сервере 1С. По умолчанию он 64-разрядный. - 🌐 Веб-клиент — код исполняется либо на сервере (
rphost), либо на клиенте через внешнюю компоненту, но не через чистый COM в браузере.
Узнать разрядность запущенного клиента можно в диспетчере задач: на вкладке Подробности у 32-разрядного процесса в старых сборках Windows была пометка *32. Разрядность самой DLL определяют утилитами вроде dumpbin /headers из поставки Visual Studio или бесплатными просмотрщиками PE-заголовка.
Если поставщик даёт две версии библиотеки — x86 и x64 — берите ту, что совпадает с процессом 1С, а не с разрядностью Windows. 64-разрядная Windows спокойно исполняет 32-разрядный 1cv8.exe, и тогда нужна именно 32-разрядная DLL.
Второй пункт — зависимости. COM-библиотека часто тянет за собой сторонние DLL или системные пакеты (например, распространяемые компоненты Visual C++). Если зависимость не найдена, regsvr32 вернёт ошибку загрузки модуля ещё до регистрации. Положите библиотеку и её спутники в один каталог, а сам каталог — туда, где у службы и пользователя есть права на чтение.
Регистрация через regsvr32 из командной строки
regsvr32 вызывает у библиотеки экспортируемую функцию DllRegisterServer, которая прописывает ProgID и CLSID компонента в реестр. Для записи в раздел HKEY_CLASSES_ROOT нужны права администратора, поэтому командную строку запускают через правый клик → Запуск от имени администратора.
Базовая команда для 64-разрядной библиотеки:
regsvr32 "C:\Lib\mycomp.dll"
Для 32-разрядной библиотеки на 64-разрядной Windows вызывайте regsvr32 явно из каталога SysWOW64 — иначе система подсунет 64-разрядный загрузчик, и регистрация упадёт с невнятной ошибкой:
C:\Windows\SysWOW64\regsvr32.exe "C:\Lib\mycomp.dll"
Парадокс путей Windows: в System32 лежат 64-разрядные компоненты, а 32-разрядные — в SysWOW64. Перепутать легко, и это причина доброй доли неудачных регистраций.
Полезные ключи:
| Команда | Что делает |
|---|---|
regsvr32 "путь.dll" | Зарегистрировать |
regsvr32 /u "путь.dll" | Снять регистрацию |
regsvr32 /s "путь.dll" | Тихий режим, без диалоговых окон |
regsvr32 /n /i:"аргумент" "путь.dll" | Передать параметр установки без вызова стандартной регистрации |
Удачная регистрация сопровождается окном DllRegisterServer в … выполнено успешно. В скриптах установки используйте /s, чтобы окно не прерывало автоматический прогон.
После регистрации проверьте вызов в консоли 1С или временной обработке:
Попытка
Объект = Новый COMОбъект("MyLib.MyClass");
Сообщить("COM-объект создан: " + ТипЗнч(Объект));
Исключение
Сообщить("Не удалось: " + ОписаниеОшибки());
КонецПопытки;
ProgID (здесь MyLib.MyClass) берётся из документации к компоненту. Если известен только CLSID, объект создают по нему же, подставляя строку вида {XXXXXXXX-....}.
Когда поставщик не указал ProgID, его можно найти в реестре. Откройте редактор реестра командой regedit и загляните в раздел HKEY_CLASSES_ROOT: там после успешной регистрации появляется ветка с именем ProgID, а внутри неё — подраздел CLSID со ссылкой на класс. Для 32-разрядных компонентов на 64-разрядной системе смотрите ветку HKEY_CLASSES_ROOT\Wow6432Node. Это же место подскажет, зарегистрировался ли компонент вообще: нет ветки — значит regsvr32 отработал не так, как показалось.
Когда нужна настройка прав в DCOMCNFG
Для внутрипроцессной DLL, которую 1С грузит в свой процесс, оснастка DCOM обычно не требуется — объект живёт внутри 1cv8.exe или rphost.exe и работает с их правами. DCOM выходит на сцену, когда COM-сервер внешний: оформлен как .exe (локальный сервер) или вовсе работает на другой машине (удалённый сервер). Тогда операционная система должна решить, кто имеет право его запускать и обращаться к нему.
Откройте оснастку командой dcomcnfg (или Панель управления → Администрирование → Службы компонентов). Дальше:
- Разверните
Службы компонентов → Компьютеры → Мой компьютер → Настройка DCOM. - Найдите в списке нужный компонент по имени приложения.
- Правый клик →
Свойства. - На вкладке
Безопасностьдля разделовРазрешения на запуск и активациюиРазрешения на доступвыберитеНастроить→Изменитьи добавьте учётную запись, под которой работает 1С. - На вкладке
Удостоверениезадайте, от чьего имени запускается сервер: интерактивный пользователь, конкретная учётная запись или вызывающий пользователь.
Для удалённого сценария к этому добавляется открытие портов: служба сопоставления конечных точек RPC слушает порт 135, а сами компоненты получают динамические порты из высокого диапазона. Если между машинами есть брандмауэр, разрешите трафик RPC, иначе клиент получит ошибку отказа в доступе ещё на этапе активации.
Права DCOM настраивают именно для той учётной записи, от имени которой пойдёт вызов. В клиент-серверной 1С это чаще всего не интерактивный пользователь, а служебная запись сервера — об этом ниже.
Особенности в клиент-серверном варианте
В файловой базе и при работе на тонком клиенте COM-объект создаётся на машине пользователя — всё, что описано выше, относится к его рабочему месту. В клиент-серверном варианте всё иначе, если код с Новый COMОбъект исполняется в серверном контексте (процедуры без директив &НаКлиенте, фоновые задания, регламентные операции).
Тогда объект создаётся в рабочем процессе rphost.exe на сервере 1С. Отсюда три следствия:
- 📦 Регистрировать DLL нужно на сервере, а не на клиентских машинах. Клиентам она в этом сценарии не нужна вовсе.
- 🧩 Разрядность — под
rphost. По умолчанию рабочий процесс 64-разрядный, значит и библиотека нужна 64-разрядная. Запуск сервера в 32-разрядном режиме задаётся отдельно и применяется редко. - 👤 Права — под служебную запись.
rphostработает от имени учётной записи, под которой запущена службаАгент сервера 1С:Предприятия 8.3. Именно ей, а не администратору, надо выдать права DCOM и доступ к каталогу библиотеки.
Отдельная оговорка про надёжность. Сторонний COM-объект в rphost делит с ним адресное пространство: его утечка памяти или сбой уронит рабочий процесс вместе с сеансами пользователей. Снизить риск помогает изоляция: в свойствах кластера можно ограничить число информационных баз на процесс и включить перезапуск рабочих процессов по превышению памяти — тогда проблемный компонент заденет меньше сеансов. Если библиотека нестабильна в принципе, разумнее отказаться от COM в пользу нативной внешней компоненты (см. раздел ниже) либо вынести интеграцию во внешний сервис, к которому 1С обращается по HTTP.
Проверять серверную регистрацию удобнее не через клиент, а запуском на сервере тонкого административного фонового задания: так вы увидите ошибку именно в контексте rphost, а не на своём рабочем месте, где компонент может быть зарегистрирован иначе.
Чтобы сервер перечитал регистрацию компонента, иногда перезапускают службу агента сервера. Это обрывает все активные сеансы и фоновые задания. Планируйте перезапуск на время, когда в базе нет пользователей, и предупредите их заранее.
Разбор ошибки «ActiveX-компонент не может создать объект»
Это сообщение (англоязычный вариант — ActiveX component can't create object) возникает в момент выполнения Новый COMОбъект(...) и означает одно: система не смогла создать экземпляр по указанному ProgID. Причин несколько, и перебирать их стоит по порядку — от самой частой к редкой.
regsvr32 от администратора и проверьте, что окно сообщило об успехе.rphost на сервере. Зарегистрируйте DLL на сервере и выдайте права служебной записи агента сервера.dcomcnfg и откройте порт 135.Ещё две ситуации, которые маскируются под ту же ошибку. Первая — неверный ProgID: опечатка в имени класса или устаревшее имя после обновления компонента. Сверьте строку с документацией. Вторая — повреждённая регистрация после обновления Windows или самого компонента: помогает снять регистрацию regsvr32 /u и зарегистрировать заново.
Подключение без regsvr32: внешние компоненты и COMConnector
Ручная регистрация через реестр — не единственный путь, а для многих задач и не лучший. 1С предлагает собственный механизм — внешние компоненты, которые не трогают реестр и переносятся вместе с базой.
Нативные внешние компоненты (Native API). Это рекомендованная 1С технология: компонента подключается прямо из макета конфигурации или файла методом ПодключитьВнешнююКомпоненту, не требует прав администратора и работает на разных платформах. Если у вас есть исходный компонент или его можно собрать по Native API, этот путь надёжнее COM.
Подключено = ПодключитьВнешнююКомпоненту(
"ОбщийМакет.МояКомпонента", "МояКомп", ТипВнешнейКомпоненты.Native);
Подключение COM-компоненты методом платформы. Для компонентов по COM-технологии тот же метод с типом COM умеет подключать библиотеку из файла, не требуя предварительного regsvr32:
Подключено = ПодключитьВнешнююКомпоненту(
"C:\Lib\mycomp.dll", "МояКомп", ТипВнешнейКомпоненты.COM);
Соединение с другой базой 1С — это тоже COM, но через штатный объект V83.COMConnector. Его регистрируют при установке платформы; если объект не создаётся, перерегистрируйте comcntr.dll из каталога bin установленной платформы той же разрядности, что и вызывающий процесс:
regsvr32 "C:\Program Files\1cv8\8.3.XX.XXXX\bin\comcntr.dll"
.NET-сборки регистрируют не regsvr32, а утилитой regasm из каталога .NET Framework нужной разрядности, с ключом /codebase и, при необходимости, созданием библиотеки типов:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe "C:\Lib\mylib.dll" /codebase /tlb
Выбор между COM и внешней компонентой сводится к простому правилу: нужно связать несколько баз 1С — берите COMConnector; нужна своя логика на стороне клиента или сервера без возни с реестром — пишите или заказывайте нативную компоненту; сторонняя библиотека поставляется только как COM-DLL — остаётся regsvr32 с настройкой прав.
Частые вопросы
Нужны ли права администратора каждый раз при создании COM-объекта?
regsvr32, потому что идёт запись в реестр. Создание объекта в коде прав администратора уже не требует.Почему 32-разрядная DLL не работает в 64-разрядной 1С?
Как снять регистрацию библиотеки?
/u: regsvr32 /u "путь.dll". Для 32-разрядной DLL на 64-разрядной Windows вызывайте regsvr32 из SysWOW64, иначе снятие не найдёт регистрацию.