COM-библиотека для 1С:Предприятия 8.3: регистрация на клиенте и сервере
Содержание
Чтобы зарегистрировать DLL для 1С, запустите командную строку от имени администратора и выполните regsvr32 "путь\к\файлу.dll". Главное условие: разрядность библиотеки должна совпадать с разрядностью процесса 1С, который её загружает. 32-битную DLL регистрируют утилитой из C:\Windows\SysWOW64, 64-битную — из C:\Windows\System32.
Регистрация нужна только COM-библиотекам, которые код 1С создаёт через Новый COMОбъект("ProgID"). Внешние компоненты по технологии Native API регистрировать в Windows не нужно, их подключает сама платформа. Если не уверены, какой у вас случай, посмотрите, как объект создаётся в коде: Новый COMОбъект требует регистрации, Новый("AddIn.…") — нет.
Подготовка: какая разрядность нужна и где регистрировать
COM-библиотека в виде DLL загружается внутрь процесса, который её вызывает. 64-битный процесс не может загрузить 32-битную DLL, и наоборот. Поэтому сначала выясните, какой процесс 1С будет создавать объект.
| Где выполняется код | Какой процесс грузит DLL | Где регистрировать |
|---|---|---|
&НаКлиенте, тонкий или толстый клиент | 1cv8c.exe или 1cv8.exe | На каждом компьютере пользователя |
&НаСервере, файловая база | Тот же клиентский процесс | На каждом компьютере пользователя |
&НаСервере, клиент-серверная база | Рабочий процесс rphost.exe | На сервере 1С (на всех рабочих серверах кластера) |
| Терминальный сервер | Клиент 1С в терминальной сессии | Один раз на терминальном сервере |
Важная деталь про файловый вариант: серверный код там выполняется в клиентском процессе. Поэтому DLL нужна на машине пользователя, а не на компьютере, где лежит папка базы.
Как узнать разрядность 1С
Самый надёжный способ — спросить у самой платформы. Добавьте во внешнюю обработку команду:
&НаКлиенте
Процедура ПоказатьРазрядность(Команда)
Инфо = Новый СистемнаяИнформация;
Сообщить("Клиент: " + Строка(Инфо.ТипПлатформы) + ", версия " + Инфо.ВерсияПриложения);
Сообщить("Сервер: " + РазрядностьСервера());
КонецПроцедуры
&НаСервереБезКонтекста
Функция РазрядностьСервера()
Инфо = Новый СистемнаяИнформация;
Возврат Строка(Инфо.ТипПлатформы);
КонецФункции
Значение Windows_x86 означает 32-битный процесс, Windows_x86_64 — 64-битный. Ещё один ориентир — папка установки: 32-битная платформа на 64-битной Windows ставится в C:\Program Files (x86)\1cv8, 64-битная — в C:\Program Files\1cv8.
Что проверить до регистрации
- 📁 Положите DLL в постоянную папку, например
C:\1C-Components\. Путь записывается в реестр, и после переноса файла регистрация перестанет работать. - 🧩 Узнайте, нужны ли библиотеке другие файлы: среда Visual C++ нужной разрядности, сопутствующие DLL, конфигурационный файл.
- 🔑 Подготовьте учётную запись с правами локального администратора.
- 🏷️ Узнайте у разработчика DLL её ProgID — строку вида
Vendor.ClassName. По ней 1С создаёт объект.
Регистрация DLL через regsvr32: пошагово
Утилита regsvr32 вызывает внутри библиотеки функцию DllRegisterServer. Та записывает в реестр ProgID, CLSID и путь к файлу. Для обычной COM-библиотеки, написанной на C++, Delphi или VB6, этого достаточно.
Шаги для 32-битной библиотеки на 64-битной Windows
- Нажмите «Пуск», наберите
cmd, щёлкните правой кнопкой и выберите «Запуск от имени администратора». - Выполните команду, указав путь в кавычках:
%SystemRoot%\SysWOW64\regsvr32.exe "C:\1C-Components\MyLib.dll"
- Дождитесь окна с сообщением об успешном выполнении
DllRegisterServer. - Перезапустите клиент 1С, если он был открыт.
Шаги для 64-битной библиотеки
Те же действия, но утилита из System32:
%SystemRoot%\System32\regsvr32.exe "C:\1C-Components\MyLib64.dll"
Названия папок путают все. На 64-битной Windows System32 содержит 64-битные программы, а SysWOW64 — 32-битные. Это не опечатка.
Полезные ключи regsvr32
| Ключ | Что делает | Когда нужен |
|---|---|---|
/s | Тихий режим, без окон | В скриптах развёртывания |
/u | Отменяет регистрацию | Перед заменой версии или удалением |
/n /i | Вызывает только DllInstall | Редко, если так требует разработчик DLL |
При замене DLL на сервере 1С новую версию нельзя просто скопировать поверх: файл занят рабочим процессом rphost. Придётся перезапустить службу агента сервера 1С, а это оборвёт сеансы всех пользователей. Делайте это вне рабочего времени и предупредите людей заранее.
.NET-сборки: regasm вместо regsvr32, и где тут InstallUtil и PowerShell
Библиотека на C# или VB.NET устроена иначе: функции DllRegisterServer в ней нет. На такой файл regsvr32 ответит ошибкой о ненайденной точке входа. Сборки .NET Framework регистрируют утилитой RegAsm.exe.
Регистрация через RegAsm
Для 32-битного клиента 1С:
"%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" "C:\1C-Components\MyNetLib.dll" /codebase /tlb
Для 64-битного процесса используйте ту же команду из папки Framework64. Что значат ключи:
- 📌
/codebase— записывает в реестр путь к файлу. Без него сборку надо класть в глобальный кэш сборок (GAC). - 📌
/tlb— создаёт библиотеку типов. Без неё объект тоже создаётся, но часть сред хуже видит его методы. - 📌
/u— отменяет регистрацию.
Класс в сборке должен быть видим для COM (атрибут ComVisible(true)) и иметь конструктор без параметров. Это проверяет разработчик, а не администратор, но спросить об этом стоит до установки.
Сборки на .NET 5 и новее работают через отдельный файл-хост с окончанием .comhost.dll. Его регистрируют обычным regsvr32, а не RegAsm.
А InstallUtil?
InstallUtil.exe часто советуют на форумах, но он решает другую задачу. Утилита запускает в сборке классы-установщики: так ставят службы Windows. COM-классы она не регистрирует. Если разработчик не просил именно её, для 1С она не нужна.
Регистрация из PowerShell
PowerShell удобен, когда команду надо запустить с повышением прав и получить код возврата:
$dll = 'C:\1C-Components\MyLib.dll'
$p = Start-Process -FilePath "$env:SystemRoot\SysWOW64\regsvr32.exe" `
-ArgumentList "/s `"$dll`"" -Verb RunAs -Wait -PassThru
"Exit code: $($p.ExitCode)"
Код 0 означает успех. Остальные коды разобраны в разделе об ошибках.
Проверка регистрации DLL в коде 1С
Окно «успешно» от regsvr32 ещё не гарантирует, что 1С создаст объект. Проверяйте там, где объект будет жить: на клиенте или на сервере.
Функция-проверка
&НаСервереБезКонтекста
Функция ПроверитьCOMНаСервере(ProgID)
Результат = Новый Структура("Доступен, Ошибка", Ложь, "");
Попытка
Объект = Новый COMОбъект(ProgID);
Объект = Неопределено;
Результат.Доступен = Истина;
Исключение
Результат.Ошибка = ОписаниеОшибки();
КонецПопытки;
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ПроверитьCOM(Команда)
ProgID = "Vendor.ClassName";
Ответ = ПроверитьCOMНаСервере(ProgID);
Если Ответ.Доступен Тогда
Сообщить("На сервере объект " + ProgID + " создаётся");
Иначе
Сообщить("На сервере ошибка: " + Ответ.Ошибка);
КонецЕсли;
КонецПроцедуры
Для проверки на клиенте перенесите блок Попытка … Исключение в процедуру с директивой &НаКлиенте. В веб-клиенте COMОбъект недоступен, там проверка всегда закончится ошибкой.
Проверка без 1С
Иногда быстрее проверить из PowerShell. Учтите: обычный PowerShell на 64-битной Windows — 64-битный. Для 32-битной DLL запускайте C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe.
$obj = New-Object -ComObject 'Vendor.ClassName'
$obj.GetType().FullName
Если объект создаётся в PowerShell нужной разрядности, а в 1С нет, ищите разницу в учётной записи. Сервер 1С по умолчанию работает от пользователя USR1CV8. Ему нужны права на чтение папки с DLL и на ресурсы, к которым библиотека обращается.
Где запись лежит в реестре
$progId = 'Vendor.ClassName'
$clsid = (Get-ItemProperty "Registry::HKEY_CLASSES_ROOT\$progId\CLSID").'(default)'
"64-bit: " + (Test-Path "Registry::HKEY_CLASSES_ROOT\CLSID\$clsid\InprocServer32")
"32-bit: " + (Test-Path "Registry::HKEY_CLASSES_ROOT\WOW6432Node\CLSID\$clsid\InprocServer32")
Скрипт показывает, для какой разрядности класс зарегистрирован. Ответ 32-bit: True при 64-битном сервере 1С сразу объясняет ошибку «класс не зарегистрирован».
Внешние компоненты Native API: когда регистрировать ничего не нужно
Слово «DLL» в задаче не всегда означает COM. Современные внешние компоненты 1С (драйверы оборудования, библиотеки штрихкодов, обмен с ККТ) пишут по технологии Native API. Их не регистрируют через regsvr32. Компоненту кладут в конфигурацию как ZIP-архив с файлом MANIFEST.XML внутри общего макета типа «Двоичные данные».
Подключение на клиенте в платформе 8.3.18 и новее:
&НаКлиенте
Асинх Процедура ПодключитьКомпоненту(Команда)
Макет = "ОбщийМакет.МояКомпонента";
Подключено = Ждать ПодключитьВнешнююКомпонентуАсинх(Макет, "MyComp", ТипВнешнейКомпоненты.Native);
Если Не Подключено Тогда
Ждать УстановитьВнешнююКомпонентуАсинх(Макет);
Подключено = Ждать ПодключитьВнешнююКомпонентуАсинх(Макет, "MyComp", ТипВнешнейКомпоненты.Native);
КонецЕсли;
Если Подключено Тогда
Компонента = Новый("AddIn.MyComp.MainClass");
Иначе
Сообщить("Компонента не подключена");
КонецЕсли;
КонецПроцедуры
Имя MainClass замените на имя объекта из документации к компоненте. Установку платформа выполняет один раз на компьютер, права администратора для неё не нужны. Разрядность учитывается через манифест: в архиве лежат файлы для 32 и 64 бит, платформа выбирает подходящий.
| Признак | COM-библиотека | Компонента Native API |
|---|---|---|
| Как создаётся в коде | Новый COMОбъект("ProgID") | Новый("AddIn.Имя.Объект") |
| Регистрация в Windows | regsvr32 или RegAsm | Не нужна |
| Права администратора | Нужны | Не нужны |
| Работа на Linux | Нет | Да, если в архиве есть версия для Linux |
| Хранение | Файл на диске каждого ПК | Макет в конфигурации |
Если вы сами выбираете формат для новой разработки, Native API избавит от ручной регистрации на каждой машине.
Как зарегистрировать DLL на всех компьютерах сразу
Когда пользователей 30, ходить к каждому с флешкой долго. Регистрацию автоматизируют на стороне Windows, а не из 1С: кода 1С с правами администратора у обычного пользователя нет.
Скрипт развёртывания
@echo off
set SRC=\\fileserver\soft\1C-Components\MyLib.dll
set DST=C:\1C-Components
if not exist "%DST%" mkdir "%DST%"
copy /Y "%SRC%" "%DST%\" >nul
if exist "%SystemRoot%\SysWOW64\regsvr32.exe" (
"%SystemRoot%\SysWOW64\regsvr32.exe" /s "%DST%\MyLib.dll"
) else (
"%SystemRoot%\System32\regsvr32.exe" /s "%DST%\MyLib.dll"
)
echo Exit code: %ERRORLEVEL%
Скрипт рассчитан на 32-битную DLL и 32-битный клиент 1С. На 64-битной Windows он берёт утилиту из SysWOW64, на 32-битной — из System32. Для 64-битной библиотеки оставьте только вызов из System32.
Чем запускать
- 🖥️ Сценарий автозагрузки компьютера в групповой политике домена. Он выполняется от системной учётной записи, права администратора уже есть.
- 📦 Система управления ПО, если она есть в компании. Скрипт оформляется как пакет с проверкой кода возврата.
- 🧑💻 Удалённый запуск через PowerShell на списке компьютеров, если включено удалённое управление.
Не регистрируйте библиотеку из папки на сетевом диске. Если диск недоступен при старте, объект не создастся. Сначала копируйте файл локально, потом регистрируйте.
Если 32-битная DLL, а сервер 1С 64-битный
Переписать библиотеку не всегда возможно. Обходной путь — запустить её вне процесса 1С, в системном суррогате dllhost.exe. Для этого в реестре у класса прописывают раздел AppID с пустым параметром DllSurrogate. Тогда 64-битный rphost обращается к 32-битной библиотеке через межпроцессный вызов.
Приём рабочий, но требует аккуратной правки реестра и проверки на тестовом сервере. Вызовы через суррогат медленнее, а в нагруженных обработках это заметно. Если разработчик DLL может собрать 64-битную версию, это надёжнее.
Ошибки при регистрации и при создании объекта
Ошибки бывают двух видов: на этапе regsvr32 и на этапе Новый COMОбъект в 1С. Коды возврата утилиты в тихом режиме:
| Код | Что случилось | Что делать |
|---|---|---|
| 3 | Не загрузилась сама DLL | Проверьте путь, разрядность утилиты и зависимости |
| 4 | Нет точки входа DllRegisterServer | Это не COM-библиотека: сборка .NET или компонента Native API |
| 5 | DllRegisterServer завершилась ошибкой | Чаще всего нет прав администратора |
Ещё одна частая ситуация: на клиенте всё работает, а на сервере нет. Значит, код выполняется под директивой &НаСервере в клиент-серверной базе, а DLL зарегистрирована только у пользователя. Либо регистрируйте библиотеку на сервере 1С, либо перенесите вызов в клиентскую процедуру.
Частые вопросы
Нужна ли регистрация DLL при каждом обновлении 1С?
Можно ли зарегистрировать DLL без прав администратора?
regsvr32 пишет в общую часть реестра. Обходите это развёртыванием через групповую политику или переходом на компоненту Native API, которой права не нужны.Как полностью удалить старую версию библиотеки?
regsvr32 /u для старого файла той же разрядности, закройте 1С и только потом удалите или замените DLL. Для сборки .NET то же делает RegAsm с ключом /u.