Регистрация COM-компоненты для работы с 1С 8.3

· 9 мин

Содержание

Регистрация COM-компоненты сводится к одной команде в консоли от администратора: для обычной DLL это regsvr32 путь-к-файлу.dll, для .NET-сборки — RegAsm.exe путь-к-файлу.dll /codebase. После этого класс появляется в реестре Windows, и 1С находит его по программному идентификатору (ProgID) через Новый COMОбъект("ProgID").

Главный подводный камень — разрядность. Если платформа 1С 64-битная, а компоненту вы зарегистрировали 32-битной утилитой, объект не создастся даже при «успешной» регистрации. Разберём оба способа, выбор разрядности, настройку прав и DCOM, а также коды ошибок, которые чаще всего всплывают при Новый COMОбъект.

Что именно регистрируем и зачем

COM-компонента — это внешняя библиотека (чаще .dll), которую 1С вызывает через механизм COM. Типичные примеры: драйверы торгового оборудования, библиотеки обмена с банками, comcntr.dll самой платформы (COM-соединитель), сторонние надстройки для работы с файлами, PDF, криптографией.

Чтобы 1С могла создать объект командой Новый COMОбъект("ProgID"), Windows должна знать, какой файл отвечает за этот ProgID. Эта связка «ProgID → CLSID → путь к DLL» и хранится в реестре. Регистрация — это запись такой связки.

ProgID — это человекочитаемое имя вроде V83.COMConnector или MyLib.Scanner. За ним стоит CLSID — длинный идентификатор в фигурных скобках, по которому Windows и находит файл. В коде 1С вы пишете именно ProgID, точное написание берите из документации к компоненте: регистр букв и точка между частями имени значимы, MyLib.Scanner и Mylib.scanner — это разные строки.

Регистрация бывает двух видов, и перепутать их — самая частая причина неудачи:

  • 🧩 Нативная COM-DLL (C++, Delphi) — умеет регистрировать себя сама. Её ставят утилитой regsvr32.
  • 🟦 .NET-сборка (C#, VB.NET) с атрибутом ComVisible — регистрируется утилитой RegAsm.exe из состава .NET Framework. regsvr32 на ней выдаст ошибку «точка входа DllRegisterServer не найдена».

Если не знаете, какого типа ваша DLL, начните с regsvr32. Ошибка про DllRegisterServer — верный признак, что перед вами .NET-сборка и нужен RegAsm.

Перед регистрацией стоит убедиться, что в системе есть всё, от чего зависит компонента. Нативные библиотеки на C++ почти всегда требуют пакет Visual C++ Runtime подходящей разрядности и года выпуска; .NET-сборки — установленный .NET Framework нужной версии. Если эти зависимости не стоят, регистрация пройдёт, а при создании объекта выпадет ошибка «не найден указанный модуль» — потому что DLL есть, а её спутники отсутствуют. Проще поставить зависимости заранее, чем ловить код 0x8007007E потом. COM-регистрацию и подключение внешней компоненты по технологии 1С. Если поставщик дал вам файл формата внешней компоненты (обычно .dll или .zip с манифестом) и в документации сказано вызывать ПодключитьВнешнююКомпоненту, никакой регистрации в Windows не требуется — компонента подключается прямо из кода. Регистрация через regsvr32/RegAsm нужна именно для классических COM-серверов: драйверов оборудования, comcntr.dll, сторонних COM-библиотек.

Проверяем разрядность: платформа, Windows и компонента

Разрядность 1С, Windows и COM-компоненты должна совпадать — иначе объект не создастся. Это правило важнее всех команд ниже.

64-битная платформа 1С (1cv8.exe из каталога Program Files\1cv8) загружает только 64-битные COM. 32-битная платформа (Program Files (x86)\1cv8) — только 32-битные. Если компонента поставляется в одной разрядности, под неё нужно подобрать и запуск 1С.

Как понять, какая разрядность у платформы:

  1. Запустите 1С, откройте О программе (меню в правом верхнем углу, пункт со значком «i»).
  2. В строке версии будет пометка (64-bit) или (32-bit).
  3. Либо посмотрите, в каком Program Files лежит каталог 1cv8: Program Files (x86) — 32-битная сборка, обычный Program Files — 64-битная.

Теперь ключевой нюанс самой Windows. На 64-битной системе две утилиты regsvr32 с одинаковым именем, но разной разрядностью:

Разрядность компонентыПуть к regsvr32 на 64-битной Windows
64-битная DLLC:\Windows\System32\regsvr32.exe
32-битная DLLC:\Windows\SysWOW64\regsvr32.exe

Да, названия каталогов сбивают с толку: System32 содержит 64-битные файлы, а SysWOW64 — 32-битные. Это особенность Windows, запомните как есть. Под 32-битную компоненту вызывайте regsvr32 именно из SysWOW64.

Регистрация нативной DLL через regsvr32

Порядок для обычной (не .NET) компоненты:

  1. Скопируйте DLL в постоянный каталог, откуда её не удалят, — например C:\COM\mylib.dll. Регистрация хранит путь к файлу; перенесёте файл — ссылка сломается.
  2. Откройте командную строку от имени администратора. Нажмите «Пуск», наберите cmd, в списке выберите пункт запуска с правами администратора.
  3. Выполните команду под нужную разрядность:
rem 64-битная компонента
C:\Windows\System32\regsvr32.exe "C:\COM\mylib.dll"

rem 32-битная компонента
C:\Windows\SysWOW64\regsvr32.exe "C:\COM\mylib.dll"
  1. При успехе Windows покажет окно DllRegisterServer succeeded (или по-русски «успешно выполнена»).
  2. Проверьте из 1С: Объект = Новый COMОбъект("ProgID");. ProgID берётся из документации к компоненте.

Полезные ключи regsvr32:

  • /u — отменить регистрацию : regsvr32 /u "C:\COM\mylib.dll". Выполняйте перед удалением или заменой файла.
  • /s — тихий режим, без диалоговых окон. Удобно для .bat-скриптов: regsvr32 /s "C:\COM\mylib.dll".

Без прав администратора regsvr32 не сможет записать в ветку реестра и выдаст ошибку доступа 0x80070005. Командную строку запускайте именно от администратора, а не просто под учёткой с правами админа.

Регистрация .NET-сборки через RegAsm

Если DLL написана на C# или VB.NET и помечена как видимая для COM ([ComVisible(true)]), её регистрирует RegAsm.exe. Эта утилита входит в состав .NET Framework и лежит в системных каталогах:

РазрядностьПуть к RegAsm.exe (пример для .NET 4.x)
32-битнаяC:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe
64-битнаяC:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe

Номер версии (v4.0.30319) может отличаться в зависимости от установленного .NET Framework — загляните в каталог Framework, он подскажет точное имя подпапки.

Команда регистрации (командная строка от администратора):

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe "C:\COM\mylib.dll" /codebase

Разбор ключей:

  • /codebase — записывает в реестр полный путь к файлу. Нужен, когда сборка не помещена в глобальный кэш сборок (GAC). Без него Windows будет искать DLL рядом с вызывающим процессом и не найдёт её.
  • /tlb — сгенерировать файл библиотеки типов (.tlb). Нужен редко, обычно если компонента так требует.
  • /u — отменить регистрацию сборки.

/codebase при регистрации сборки без строгого имени (strong name) даёт предупреждение — это нормально. Для разовой установки на конкретный ПК его можно игнорировать.

Как и с regsvr32, разрядность RegAsm.exe должна совпадать с разрядностью платформы 1С, которая будет вызывать объект. Под 64-битную 1С берите RegAsm из каталога Framework64.

COM-соединитель 1С (V83.COMConnector)

Отдельный, но очень частый случай — регистрация COM-соединителя самой платформы. Его ProgID для версии 8.3 — V83.COMConnector, а файл называется comcntr.dll и лежит в каталоге bin установленной платформы.

Через соединитель внешние программы (или другая база) подключаются к информационной базе 1С. Регистрируется он тем же regsvr32:

rem путь зависит от номера установленной платформы
regsvr32 "C:\Program Files\1cv8\8.3.24.1234\bin\comcntr.dll"

Номер релиза (8.3.24.1234) замените на свой — посмотрите подкаталоги внутри Program Files\1cv8. Разрядность comcntr.dll определяется тем, какую платформу вы установили: 64-битная платформа ставит 64-битный comcntr.dll в Program Files, 32-битная — в Program Files (x86).

Проверка из 1С или внешнего скрипта:

Соединитель = Новый COMОбъект("V83.COMConnector");
Соединение = Соединитель.Connect("File=""C:\Base\MyBase""");

Типичная ситуация: после обновления платформы соединитель перестаёт работать, потому что в реестре прописан путь к старому, уже удалённому каталогу bin. Решение — заново выполнить regsvr32 для comcntr.dll из каталога новой платформы.

Важный момент про разрядность соединителя. Если внешняя программа, которая вызывает V83.COMConnector, 32-битная (а таких немало — от старых обработок до некоторых скриптовых движков), ей нужен 32-битный comcntr.dll. При этом на сервере может стоять только 64-битная платформа. В этом случае ставят вторую, 32-битную платформу того же релиза и регистрируют соединитель из её каталога Program Files (x86)\1cv8.

Как убедиться, что регистрация прошла

«Успешно» в окне regsvr32 означает только, что DLL отработала саморегистрацию. Проверять нужно по факту — создаётся ли объект. Есть два способа.

Первый, самый прямой, — из встроенного языка 1С или внешнего скрипта:

Попытка
    Объект = Новый COMОбъект("ProgID");
    Сообщить("Компонента доступна");
Исключение
    Сообщить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;

Если объект создался — регистрация рабочая. Если выпало исключение, в тексте будет код ошибки (0x80040154 и подобные), по которому ищут причину в разделе ниже.

Второй способ — заглянуть в реестр. Запустите regedit и проверьте, что ProgID прописан:

  1. Ветка HKEY_CLASSES_ROOT\ProgID (например HKEY_CLASSES_ROOT\V83.COMConnector) — должна существовать и содержать вложенный ключ CLSID.
  2. По значению CLSID найдите ветку HKEY_CLASSES_ROOT\CLSID\{тот-же-идентификатор}\InprocServer32 — в ней прописан путь к DLL.
  3. Сверьте путь: он должен указывать на реально существующий файл. Битый путь после переноса или обновления — частая причина, почему «зарегистрированная» компонента не работает .

Для 32-битной компоненты на 64-битной Windows записи лежат в ветке HKEY_CLASSES_ROOT\WOW6432Node\CLSID. Если не нашли свой CLSID в обычной ветке — ищите там.

Права доступа и настройка DCOM

Для простого вызова Новый COMОбъект внутри самой 1С настройки DCOM обычно не нужны. Они становятся обязательными, когда компонента (чаще всего V83.COMConnector) вызывается из другого процесса или из-под другого пользователя — например, с веб-сервера IIS, из службы или с удалённой машины.

Права настраиваются через оснастку Службы компонентов:

  1. Нажмите «Пуск», наберите dcomcnfg и запустите утилиту.
  2. Раскройте Службы компонентов → Компьютеры → Мой компьютер → Настройка DCOM.
  3. Найдите в списке приложение по имени ProgID или описанию компоненты.
  4. Откройте его свойства, перейдите на вкладку Безопасность и задайте права на запуск, активацию и доступ для нужного пользователя (например, для учётной записи пула приложений IIS).
  5. На вкладке Удостоверение укажите, от какого пользователя запускать объект.

Если компонента вызывается с веб-сервера, права DCOM нужно дать именно той учётной записи, под которой работает пул приложений IIS, а не вашей текущей. Иначе при вызове получите «Отказано в доступе».

Отдельно учтите: 32-битные и 64-битные COM-приложения в оснастке DCOM отображаются в разных ветках. Если не видите свою компоненту в общем списке Настройка DCOM, запустите оснастку для другой разрядности — через mmc comexp.msc /32 для 32-битных объектов.

Разбор типичных ошибок регистрации

Чаще всего ошибка всплывает не на самой регистрации, а при Новый COMОбъект в 1С. Коды одинаковые, причины — тоже типовые.

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

Короткий порядок диагностики, когда объект не создаётся:

Если COM-объект не создаётся
Выполнено: 0 / 7

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

Нужно ли перезагружать компьютер после регистрации?
Нет. Регистрация вступает в силу сразу. Достаточно перезапустить сеанс 1С, чтобы платформа заново прочитала реестр перед вызовом Новый COMОбъект.
Как понять разрядность самой DLL, если в документации её нет?
Самый надёжный способ — метод проб: зарегистрируйте сначала 64-битной утилитой, при ошибке про разрядность повторите 32-битной. Либо откройте файл утилитой просмотра зависимостей — она покажет платформу бинарника.
Можно ли зарегистрировать компоненту без прав администратора?
Классическая регистрация через regsvr32 и RegAsm пишет в общую ветку реестра и требует администратора. Некоторые компоненты поддерживают регистрацию только для текущего пользователя, но это зависит от самой DLL и встречается редко.
Можно ли зарегистрировать компоненту сразу в 32- и 64-битной версиях?
Да, если поставщик дал обе сборки. Зарегистрируйте каждую своей утилитой: 64-битную — из System32, 32-битную — из SysWOW64. Записи попадают в разные ветки реестра и не конфликтуют, так что одна машина может обслуживать и 32-, и 64-битные вызовы.
После обновления платформы перестал работать COM-соединитель — почему?
В реестре остался путь к comcntr.dll старого релиза, каталог которого уже удалён. Выполните regsvr32 для comcntr.dll из каталога bin новой платформы.