Регистрация COM-компоненты для работы с 1С 8.3
Содержание
Регистрация 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С, откройте О программе (меню в правом верхнем углу, пункт со значком «i»).
- В строке версии будет пометка
(64-bit)или(32-bit). - Либо посмотрите, в каком
Program Filesлежит каталог1cv8:Program Files (x86)— 32-битная сборка, обычныйProgram Files— 64-битная.
Теперь ключевой нюанс самой Windows. На 64-битной системе две утилиты regsvr32 с одинаковым именем, но разной разрядностью:
| Разрядность компоненты | Путь к regsvr32 на 64-битной Windows |
|---|---|
| 64-битная DLL | C:\Windows\System32\regsvr32.exe |
| 32-битная DLL | C:\Windows\SysWOW64\regsvr32.exe |
Да, названия каталогов сбивают с толку: System32 содержит 64-битные файлы, а SysWOW64 — 32-битные. Это особенность Windows, запомните как есть. Под 32-битную компоненту вызывайте regsvr32 именно из SysWOW64.
Регистрация нативной DLL через regsvr32
Порядок для обычной (не .NET) компоненты:
- Скопируйте DLL в постоянный каталог, откуда её не удалят, — например
C:\COM\mylib.dll. Регистрация хранит путь к файлу; перенесёте файл — ссылка сломается. - Откройте командную строку от имени администратора. Нажмите «Пуск», наберите
cmd, в списке выберите пункт запуска с правами администратора. - Выполните команду под нужную разрядность:
rem 64-битная компонента
C:\Windows\System32\regsvr32.exe "C:\COM\mylib.dll"
rem 32-битная компонента
C:\Windows\SysWOW64\regsvr32.exe "C:\COM\mylib.dll"
- При успехе Windows покажет окно
DllRegisterServer succeeded(или по-русски «успешно выполнена»). - Проверьте из 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 прописан:
- Ветка
HKEY_CLASSES_ROOT\ProgID(напримерHKEY_CLASSES_ROOT\V83.COMConnector) — должна существовать и содержать вложенный ключCLSID. - По значению CLSID найдите ветку
HKEY_CLASSES_ROOT\CLSID\{тот-же-идентификатор}\InprocServer32— в ней прописан путь к DLL. - Сверьте путь: он должен указывать на реально существующий файл. Битый путь после переноса или обновления — частая причина, почему «зарегистрированная» компонента не работает .
Для 32-битной компоненты на 64-битной Windows записи лежат в ветке HKEY_CLASSES_ROOT\WOW6432Node\CLSID. Если не нашли свой CLSID в обычной ветке — ищите там.
Права доступа и настройка DCOM
Для простого вызова Новый COMОбъект внутри самой 1С настройки DCOM обычно не нужны. Они становятся обязательными, когда компонента (чаще всего V83.COMConnector) вызывается из другого процесса или из-под другого пользователя — например, с веб-сервера IIS, из службы или с удалённой машины.
Права настраиваются через оснастку Службы компонентов:
- Нажмите «Пуск», наберите
dcomcnfgи запустите утилиту. - Раскройте
Службы компонентов → Компьютеры → Мой компьютер → Настройка DCOM. - Найдите в списке приложение по имени ProgID или описанию компоненты.
- Откройте его свойства, перейдите на вкладку Безопасность и задайте права на запуск, активацию и доступ для нужного пользователя (например, для учётной записи пула приложений IIS).
- На вкладке Удостоверение укажите, от какого пользователя запускать объект.
Если компонента вызывается с веб-сервера, права DCOM нужно дать именно той учётной записи, под которой работает пул приложений IIS, а не вашей текущей. Иначе при вызове получите «Отказано в доступе».
Отдельно учтите: 32-битные и 64-битные COM-приложения в оснастке DCOM отображаются в разных ветках. Если не видите свою компоненту в общем списке Настройка DCOM, запустите оснастку для другой разрядности — через mmc comexp.msc /32 для 32-битных объектов.
Разбор типичных ошибок регистрации
Чаще всего ошибка всплывает не на самой регистрации, а при Новый COMОбъект в 1С. Коды одинаковые, причины — тоже типовые.
System32, 32-битную — из SysWOW64. Проверьте, что ProgID в коде написан точно.dcomcnfg.regsvr32 из парного каталога (System32 ↔ SysWOW64).RegAsm.exe, а не regsvr32.Короткий порядок диагностики, когда объект не создаётся:
Частые вопросы
Нужно ли перезагружать компьютер после регистрации?
Новый COMОбъект.Как понять разрядность самой DLL, если в документации её нет?
Можно ли зарегистрировать компоненту без прав администратора?
regsvr32 и RegAsm пишет в общую ветку реестра и требует администратора. Некоторые компоненты поддерживают регистрацию только для текущего пользователя, но это зависит от самой DLL и встречается редко.Можно ли зарегистрировать компоненту сразу в 32- и 64-битной версиях?
System32, 32-битную — из SysWOW64. Записи попадают в разные ветки реестра и не конфликтуют, так что одна машина может обслуживать и 32-, и 64-битные вызовы.После обновления платформы перестал работать COM-соединитель — почему?
comcntr.dll старого релиза, каталог которого уже удалён. Выполните regsvr32 для comcntr.dll из каталога bin новой платформы.