Как подключить COM-библиотеку (DLL) к 1С:Предприятие 8.3

· 9 мин

Содержание

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 вернёт ошибку загрузки модуля ещё до регистрации. Положите библиотеку и её спутники в один каталог, а сам каталог — туда, где у службы и пользователя есть права на чтение.

Перед регистрацией убедитесь
Выполнено: 0 / 5

Регистрация через 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 (или Панель управления → Администрирование → Службы компонентов). Дальше:

  1. Разверните Службы компонентов → Компьютеры → Мой компьютер → Настройка DCOM.
  2. Найдите в списке нужный компонент по имени приложения.
  3. Правый клик → Свойства.
  4. На вкладке Безопасность для разделов Разрешения на запуск и активацию и Разрешения на доступ выберите Настроить → Изменить и добавьте учётную запись, под которой работает 1С.
  5. На вкладке Удостоверение задайте, от чьего имени запускается сервер: интерактивный пользователь, конкретная учётная запись или вызывающий пользователь.

Для удалённого сценария к этому добавляется открытие портов: служба сопоставления конечных точек 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. Причин несколько, и перебирать их стоит по порядку — от самой частой к редкой.

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

Ещё две ситуации, которые маскируются под ту же ошибку. Первая — неверный 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С?
Внутрипроцессная COM-библиотека загружается в адресное пространство процесса, а 64-разрядный процесс не может загрузить 32-разрядный модуль. Нужна версия библиотеки той же разрядности, что и процесс 1С.
Как снять регистрацию библиотеки?
Той же утилитой с ключом /u: regsvr32 /u "путь.dll". Для 32-разрядной DLL на 64-разрядной Windows вызывайте regsvr32 из SysWOW64, иначе снятие не найдёт регистрацию.
На какой машине регистрировать DLL в клиент-серверной базе?
Если код с созданием объекта выполняется на сервере, регистрируйте на сервере 1С и выдавайте права служебной записи агента сервера. На клиентских машинах в этом случае библиотека не нужна.
Что делать, если regsvr32 пишет об успехе, а объект всё равно не создаётся?
Проверьте разрядность (DLL под процесс, а не под Windows), наличие зависимых библиотек и правильность ProgID. На сервере дополнительно — права DCOM для учётной записи рабочего процесса.