Регистрация COM-библиотеки на сервере 1С:Предприятие через regsvr32

· 11 мин

Содержание

Чтобы серверный код 1С увидел библиотеку через Новый COMОбъект("ProgID"), DLL нужно зарегистрировать на самом сервере: от имени администратора запустить regsvr32 той же разрядности, что и серверные процессы 1С, и указать полный путь к файлу. Регистрация на клиентской машине серверу ничего не даёт: код выполняется в процессе rphost, а он ищет класс в реестре сервера.

Три вещи решают исход: разрядность библиотеки, учётная запись, под которой работает служба «Агент сервера 1С:Предприятия», и разрешения в профилях безопасности кластера. Ниже порядок действий и разбор того, что ломается чаще всего.

Библиотека без регистрации в реестре подключается только как внешняя компонента (Native API или COM-обёртка в макете). Если у производителя в описании написано «регистрация не требуется», regsvr32 вам не нужен, смотрите раздел про альтернативы.

Что проверить до регистрации DLL

Минут десять подготовки экономят часы поиска странных ошибок. Пройдитесь по списку.

  1. Разрядность сервера 1С. Для современных версий 8.3 серверная часть почти всегда 64-разрядная. Узнать точно можно в диспетчере задач: у процессов rphost.exe и ragent.exe на вкладке «Подробности» добавьте столбец «Платформа». Если рядом с именем нет пометки «32 бита» — процесс 64-разрядный.
  2. Разрядность DLL. Проверьте утилитой dumpbin /headers файл.dll из набора Visual Studio: в строке FILE HEADER VALUES будет machine (x64) или machine (x86). Без студии можно открыть файл в любом PE-просмотрщике или посмотреть описание на странице производителя.
  3. Зависимости. Библиотека редко приходит одна: рядом лежат вспомогательные DLL, среды выполнения Visual C++, иногда драйверы оборудования. Скопируйте всё вместе в одну папку.
  4. Постоянное место хранения. Не регистрируйте файл из папки «Загрузки» или с рабочего стола. Подойдёт, например, C:\Program Files\ИмяПродукта\ или отдельный каталог C:\1C_COM\. После регистрации файл нельзя двигать: в реестре хранится путь.
  5. Права на каталог. Учётная запись службы сервера должна иметь право чтения и выполнения на папку с DLL.

Какая учётная запись у службы, смотрится в оснастке services.msc, свойства службы «Агент сервера 1С:Предприятия 8.3», вкладка «Вход в систему». Часто это локальный пользователь USR1CV8. Запомните его: он понадобится в разделе про диагностику.

Разрядность DLLРазрядность серверных процессов 1СЧто делать
64 бита64 битаОбычный regsvr32 из System32
32 бита32 битаregsvr32 из SysWOW64
32 бита64 битаРаботать не будет: найдите 64-разрядную сборку или вынесите вызов с сервера
64 бита32 битаАналогично, нужна 32-разрядная сборка

Регистрация через regsvr32: команды и порядок

Откройте командную строку от имени администратора. Обычная командная строка выдаст ошибку 0x80070005, даже если ваш пользователь входит в группу администраторов: UAC срезает права.

Для 64-разрядной библиотеки

Путь к утилите в 64-разрядной Windows:

C:\Windows\System32\regsvr32.exe "C:\1C_COM\MyLib.dll"

Название папки System32 путает многих: в 64-разрядной системе там лежит именно 64-разрядная версия утилиты.

Для 32-разрядной библиотеки

C:\Windows\SysWOW64\regsvr32.exe "C:\1C_COM\MyLib32.dll"

Папка SysWOW64 содержит 32-разрядную утилиту. Название тоже не очевидное, но запомнить просто: «WOW» — режим совместимости 32-битных программ.

После успешной регистрации появится окно «DllRegisterServer в … выполнен успешно». Для установки без окна (скрипты, развёртывание по сети) добавьте ключ /s:

C:\Windows\System32\regsvr32.exe /s "C:\1C_COM\MyLib.dll"
echo %errorlevel%

Код 0 означает успех. Любое другое число смотрите в таблице ошибок ниже.

Если библиотека написана на .NET

Для управляемых сборок regsvr32 не подходит: он скажет, что точка входа DllRegisterServer не найдена. Используйте regasm из каталога нужной версии .NET Framework:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe "C:\1C_COM\MyNetLib.dll" /codebase /tlb

Для 32-разрядной сборки подставьте Framework вместо Framework64. Ключ /codebase записывает в реестр путь к файлу, иначе сборка должна лежать в глобальном кэше (GAC), а это отдельная история.

Если сборка предназначена для COM, у неё в коде помечены классы атрибутами ComVisible и, как правило, задан ProgId. Без них регистрация пройдёт, но создать объект по имени из 1С не получится.

Проверка, что класс появился

Не полагайтесь на сообщение об успехе, проверьте в реестре. Откройте regedit и найдите ветку HKEY_CLASSES_ROOT\ИмяProgID. Для 32-разрядных компонентов на 64-разрядной системе смотрите ещё и HKEY_CLASSES_ROOT\WOW6432Node\CLSID. В подветке InprocServer32 должен быть путь именно к вашему файлу.

Быстрая проверка из PowerShell, без подключения к 1С:

$o = New-Object -ComObject "ИмяБиблиотеки.ИмяКласса"
$o | Get-Member

В 64-разрядной консоли PowerShell проверяется 64-разрядная регистрация, в консоли Windows PowerShell (x86) — 32-разрядная. Если объект создался, проблема дальше только в 1С.

Как 1С-сервер находит и запускает зарегистрированный COM-объект

Теперь о том, что происходит на стороне платформы. Код, помеченный &НаСервере, и серверные вызовы из регламентных заданий выполняются в процессах rphost. Вызов Новый COMОбъект читает реестр того компьютера, где работает этот процесс, и по ProgID находит InprocServer32. Сервис не обращается ни к реестру клиентского ПК, ни к реестру другого узла кластера.

Отсюда следствия, о которых забывают:

  • 📌 Кластер из нескольких рабочих серверов требует регистрации на каждом сервере, где могут работать рабочие процессы.
  • 📌 Клиент-серверная база в режиме &НаКлиенте обращается к библиотеке на машине пользователя. Два вызова одной и той же библиотеки в одном обработчике могут работать по-разному, если их выполняют в разных контекстах.
  • 📌 Библиотека загружается в память процесса rphost один раз и держится, пока он живёт. После перерегистрации или замены файла на диске процесс может продолжать использовать старую версию.

Поэтому после любых изменений перезапускайте рабочие процессы. Мягкий способ: в консоли администрирования кластера отключить, а затем заново включить рабочий процесс. Надёжный способ: перезапустить службу «Агент сервера 1С:Предприятия 8.3» ночью или в окно без сеансов.

Перезапуск службы обрывает все активные сеансы пользователей. Сначала предупредите людей и дождитесь завершения регламентных заданий.

Отдельный нюанс связан с учётной записью. Если служба работает от USR1CV8, а библиотека хранит настройки в HKEY_CURRENT_USER, она не найдёт их: у этого пользователя свой куст реестра, пустой. Настройки нужно прописывать под этим же пользователем или искать в документации производителя режим «для всех пользователей» (параметры в HKEY_LOCAL_MACHINE).

Диагностика ошибок регистрации и вызова

Ошибки делятся на два типа: упала сама регистрация в regsvr32 и упало создание объекта в 1С уже после успешной регистрации. Разберём по очереди.

Ошибки regsvr32

Код или сообщениеВероятная причинаЧто сделать
0x80070005 (отказано в доступе)Командная строка без прав администратора, либо антивирус блокирует запись в реестрЗапустите консоль от администратора; на время регистрации добавьте исключение для папки
0x8007007E (не найден указанный модуль)Не хватает зависимостей: другой DLL, среды Visual C++, либо разрядность не таПоложите зависимости рядом, установите нужный Visual C++ Redistributable, сверьте разрядность
0x80004005Общий сбой внутри DllRegisterServerПерезапустите консоль с правами администратора; посмотрите журнал самой библиотеки, если он есть
«Точка входа DllRegisterServer не найдена»Файл не COM-библиотека (Native-компонента, .NET-сборка)Для .NET — regasm; для Native API — подключайте как внешнюю компоненту
«Не удалось загрузить модуль … Проверьте, что двоичный файл… и… совместим с версией Windows»Несовпадение разрядностиВозьмите утилиту regsvr32 другой разрядности

Ошибки уже при работе в 1С

Классические тексты, которые видит пользователь или журнал регистрации:

  • Класс не зарегистрирован (код 0x80040154) — на этом сервере в реестре нет такого ProgID. Проверьте имя класса на опечатки, разрядность и сервер, на котором работает процесс. Бывает и так, что зарегистрировали на одном узле кластера, а процесс стартовал на другом.
  • Ошибка при вызове конструктора (COMОбъект) — обобщённое сообщение, причину ищите в подробной части текста и в журнале Windows.
  • Не найден указанный модуль при создании объекта — в этом случае не хватает зависимой библиотеки именно для учётной записи службы. Для проверки запустите cmd от имени USR1CV8 (через runas или PsExec, у локального пользователя без интерактивного входа это потребует предварительной настройки) и повторите команду.
  • Отказано в доступе при вызове метода — у учётной записи нет прав на каталог библиотеки либо на ветки реестра/файлы, которые она использует в работе.

Чем искать причину

Самый быстрый инструмент — Process Monitor от Sysinternals. Фильтр: Process Name is rphost.exe, плюс Result is NAME NOT FOUND и ACCESS DENIED. В списке сразу видно, какого файла или раздела реестра не хватает и по какому пути процесс его искал. Для проверки списка зависимостей хорошо работает dumpbin /dependents библиотека.dll или утилита Dependencies (современная замена Dependency Walker).

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

Профили безопасности кластера и защита сервера

Даже зарегистрированная DLL может не запуститься, если в кластере включены профили безопасности. Это механизм, ограничивающий, что может делать код 1С в серверном контексте: запускать программы, открывать файлы, создавать COM-объекты, подключать внешние компоненты.

Если для базы или всего кластера задан профиль безопасности, который запрещает COM, сообщение об ошибке будет таким же, как при отсутствии регистрации, или явно скажет о нарушении ограничений безопасности. Поэтому, когда в regedit всё в порядке, а в 1С нет, первым делом откройте консоль администрирования серверов 1С и проверьте профили.

Что нужно сделать, если профиль включён:

  1. В консоли серверов откройте нужный кластер и перейдите в раздел «Профили безопасности».
  2. Найдите профиль, который назначен вашей информационной базе (смотрится в свойствах базы или в разделе кластера с настройками безопасности).
  3. В свойствах профиля откройте список разрешённых COM-классов.
  4. Добавьте запись для нужного класса: имя и идентификатор (CLSID), по которым 1С будет его находить, и при необходимости путь к файлу.
  5. Сохраните и перезапустите рабочие процессы.

Точные названия вкладок отличаются от версии к версии платформы, поэтому ищите блок «COM-классы» в свойствах профиля. Основная идея: безопасный профиль работает по принципу «запрещено всё, что не разрешено», и новый COM-класс нужно вписать в список явно.

Выдавайте минимальные права. Разрешайте только тот класс, который нужен, и только в профиле той базы, которой он нужен. Общий профиль с открытым COM для всего кластера — это лазейка: любой разработчик расширения получает возможность создать произвольный COM-объект на сервере.

Что ещё стоит учесть с точки зрения безопасности:

  • 🔒 Источник DLL. Регистрация COM-библиотеки — это запуск чужого кода с правами службы. Берите файлы только у проверенного поставщика и сверяйте контрольные суммы, если он их публикует.
  • 🔒 Учётная запись службы. Не запускайте службу от доменного администратора ради того, чтобы «заработало». Выдайте нужные права пользователю службы на конкретные папки.
  • 🔒 Отдельный сервер или рабочий процесс. Если компонента нестабильна (падает, подвисает, течёт по памяти), её сбой может утащить с собой рабочий процесс со всеми сеансами. Вынесите нагрузку на отдельный рабочий сервер кластера и зарегистрируйте библиотеку только там.
  • 🔒 Резервная копия реестра. Перед массовой регистрацией на боевом сервере экспортируйте ключевые ветки или сделайте снимок виртуальной машины. Откат кривой регистрации через regsvr32 /u не всегда чистит всё до конца.

Чтобы убрать регистрацию, используйте ключ /u:

C:\Windows\System32\regsvr32.exe /u "C:\1C_COM\MyLib.dll"

Когда регистрация DLL не нужна: альтернативные способы

Регистрация в системе — самый тяжёлый способ подключить код. Часто задачу решают проще и безопаснее.

Внешняя компонента Native API. Если производитель поставляет компоненту для 1С в виде ZIP-архива с манифестом, регистрировать её через regsvr32 не нужно. Её загружают в макет конфигурации или справочник и подключают методом подключения внешней компоненты. Для сервера используется вариант подключения, который выполняется в серверном контексте; для клиента — клиентский. Так компонента хранится в самой базе, и переносить её между серверами вручную не надо.

Вынос вызова на клиентскую часть. Если библиотека работает с устройством на рабочем месте (весы, сканер, кассовый аппарат), ей и положено быть на клиентской машине. Регистрируйте её на компьютере пользователя, а серверный код не трогайте: данные передавайте в клиентскую процедуру.

Отдельный сервис-посредник. Библиотеку запускают на выделенной машине, а 1С обращается к ней по HTTP: через HTTP-сервис конфигурации либо через обычные запросы к веб-сервису. Это снимает вопросы разрядности и безопасности, добавляя сетевую задержку и необходимость поддерживать ещё один узел.

Использование встроенных средств платформы. До написания обмена через COM проверьте, нет ли в 1С готового механизма: работа с XML, JSON, HTTP-запросы, сжатие файлов, чтение Excel без Excel-приложения. Часто DLL заводили по привычке, когда этих возможностей в платформе не было.

СпособКогда подходитМинусы
regsvr32 / regasm на сервереБиблиотека COM, нужна в серверном коде, поставщик не даёт другого вариантаРучная установка на каждый узел, разрядность, права
Внешняя компонента Native APIЕсть пакет компоненты с манифестомНужна поддержка платформой разрядности и ОС сервера
Регистрация на клиентеРабота с оборудованием пользователяНастройка на каждом рабочем месте
HTTP-сервис / посредникНужна изоляция, разная разрядность, Linux-серверУсложняет схему, добавляет задержку

Отдельно про Linux: на сервере 1С под Linux regsvr32 и COM-объекты Windows недоступны вообще. Если у вас или у заказчика планируется переход, закладывайте внешние компоненты Native API или вынесение вызовов во внешний сервис заранее.

Проверка после регистрации DLL на сервере
Выполнено: 0 / 8

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

Нужно ли перезагружать сервер после regsvr32?
Нет. Достаточно перезапустить рабочие процессы 1С или службу агента сервера, чтобы rphost перечитал реестр и загрузил библиотеку заново. Перезагрузка Windows нужна редко: например, если файл DLL заблокирован и его не удалось заменить.
Можно ли регистрировать DLL на клиенте, если база клиент-серверная?
Можно, но это работает только для клиентского кода. Серверные процедуры по-прежнему ищут класс в реестре сервера. Если библиотека нужна и там, и там, регистрируйте на обеих сторонах.
Как зарегистрировать DLL, если у неё нет `DllRegisterServer`?
Значит, это не COM-библиотека. Проверьте, не .NET ли это (тогда regasm), не Native-компонента для 1С (подключается через внешние компоненты) или обычная библиотека функций, которую 1С не может вызвать напрямую.
Что делать, если одна и та же DLL нужна в 32- и 64-разрядном виде?
Зарегистрировать обе версии, каждую своей утилитой regsvr32. Разные сборки хранятся в разных разделах реестра и друг другу не мешают. Файлы при этом должны лежать в разных папках.
Почему после обновления библиотеки 1С работает со старой версией?
Процесс rphost держит загруженную DLL в памяти. Остановите нагрузку, перезапустите рабочие процессы, и новая версия подхватится. Если файл занят и не заменяется, это верный признак того, что процесс его ещё использует.