CLSID COM-коннектора 1С: где искать и как перерегистрировать

· 9 мин

Содержание

GUID (он же CLSID) COM-объекта 1С хранится в реестре Windows, в ветке HKEY_CLASSES_ROOT. Чтобы его получить, откройте редактор реестра regedit и прочитайте значение в ключе с программным идентификатором объекта — например V83.COMConnector\CLSID. Тот же идентификатор отдаёт PowerShell одной строкой и показывает утилита OLE/COM Viewer.

1С регистрирует в системе несколько COM-объектов. V83.COMConnector — это внешнее соединение через библиотеку comcntr.dll, оно работает внутри процесса вызывающей программы. V83.Application запускает толстый клиент как отдельный COM-сервер, V83C.Application — тонкий клиент. У каждого объекта свой программный идентификатор (ProgID) и свой GUID. В платформе 8.2 имена начинались с V82.

GUID нужен, когда внешняя программа (Excel, веб-сервис, планировщик заданий) создаёт соединение не по имени, а по идентификатору класса, либо когда соединение не создаётся — и надо проверить, тем ли файлом зарегистрирован класс и совпадает ли разрядность.

Как устроена регистрация COM-объекта в реестре

У любого COM-класса два имени. ProgID — читаемое, вроде V83.COMConnector. CLSID — тот самый 128-битный GUID в фигурных скобках, по которому Windows физически находит библиотеку. ProgID существует только для удобства: он ссылается на CLSID, а уже CLSID ведёт к файлу.

Отсюда и расположение ключей в реестре:

  • HKEY_CLASSES_ROOT\V83.COMConnector\CLSID — значение по умолчанию равно {GUID} нужного объекта.
  • HKEY_CLASSES_ROOT\CLSID\{GUID}\InprocServer32 — путь к comcntr.dll для внутрипроцессного объекта (V83.COMConnector).
  • HKEY_CLASSES_ROOT\CLSID\{GUID}\LocalServer32 — путь к 1cv8.exe для внепроцессного V83.Application.
  • HKEY_CLASSES_ROOT\CLSID\{GUID}\ProgID — обратная ссылка на имя.

Разница между InprocServer32 и LocalServer32 — не формальность. Внутрипроцессный объект (V83.COMConnector) загружается как DLL прямо в адресное пространство вызывающей программы: быстро, но объект живёт и падает вместе с ней. Внепроцессный (V83.Application) — это отдельный 1cv8.exe, который общается с клиентом через механизмы Windows и требует настроек безопасности DCOM. Поэтому у двух объектов и устройство регистрации разное: у первого в ключе путь к библиотеке, у второго — к исполняемому файлу.

Ключевой момент — разрядность. На 64-разрядной Windows 64-битные регистрации лежат в HKEY_CLASSES_ROOT\CLSID, а 32-битные — отдельно, в HKEY_CLASSES_ROOT\WOW6432Node\CLSID. Соответственно и ProgID 32-битного объекта находится в HKEY_CLASSES_ROOT\WOW6432Node\V83.COMConnector. Это главная причина, по которой «GUID не находится»: вы смотрите не в ту ветку.

Ветка HKEY_CLASSES_ROOT — это объединённое представление HKEY_LOCAL_MACHINE\SOFTWARE\Classes (регистрация для всех пользователей) и HKEY_CURRENT_USER\SOFTWARE\Classes (для текущего). Коннектор 1С регистрируется машинно, поэтому те же ключи вы найдёте и в HKLM\SOFTWARE\Classes\CLSID. Удобнее работать через HKEY_CLASSES_ROOT — там всё собрано в одном месте.

Сам CLSID задан в библиотеке типов внутри comcntr.dll и не меняется от релиза к релизу. При обновлении платформы меняется только путь в InprocServer32 — на папку новой версии.

Как найти GUID через редактор реестра regedit

Чтение реестра прав администратора не требует — он нужен только для регистрации.

  1. Нажмите Win+R, введите regedit, нажмите Enter.
  2. В адресную строку regedit (вверху окна) вставьте путь HKEY_CLASSES_ROOT\V83.COMConnector\CLSID и нажмите Enter.
  3. В правой панели прочитайте параметр (По умолчанию) — это и есть ваш CLSID, строка вида {181E893D-...}. Берите значение именно из своего реестра: оно авторитетнее любого примера из статьи.
  4. Чтобы увидеть, какой файл стоит за этим GUID, перейдите в HKEY_CLASSES_ROOT\CLSID\{ваш-GUID}\InprocServer32. Значение по умолчанию — полный путь к comcntr.dll.
  5. Для 32-битного коннектора повторите в ветке HKEY_CLASSES_ROOT\WOW6432Node\V83.COMConnector\CLSID.

Если точного имени ключа не знаете, нажмите Ctrl+F и найдите V83.COMConnector поиском по реестру — regedit встанет на нужный узел.

Правой кнопкой по параметру (По умолчанию) → «Изменить» открывает поле, из которого GUID удобно скопировать целиком, вместе со скобками.

Тот же способ работает для других объектов 1С: вместо V83.COMConnector подставьте V83.Application или V83C.Application — и прочитайте их CLSID по той же схеме.

Поиск CLSID утилитой OLE/COM Viewer

Редактор реестра показывает «сырые» ключи. Если нужно видеть не только GUID, но и интерфейсы, библиотеку типов и целостность регистрации сразу — удобнее OLE/COM Object Viewer (oleview.exe). Утилита входит в состав Windows SDK и Visual Studio; существует и отдельный порт OleViewDotNet.

Порядок работы:

  1. Запустите OLE/COM Viewer той же разрядности, что и искомый объект (для 32-битного коннектора — 32-битную версию утилиты).
  2. Раскройте группу классов объектов и найдите V83.COMConnector по имени.
  3. В правой панели утилита покажет CLSID класса, путь к библиотеке в InprocServer32, связанный ProgID и библиотеку типов.

Главное преимущество перед regedit — видно, подхватывается ли библиотека типов и отвечает ли класс на запрос интерфейса. Если OLE Viewer показывает CLSID, но не может загрузить объект, проблема не в GUID, а в самой регистрации или разрядности файла.

Отдельно полезен просмотр библиотеки типов: в ней перечислены методы и свойства, которые коннектор отдаёт наружу (Connect, свойства возвращаемого объекта базы). Если библиотека типов не читается, внешняя программа получит объект, но не сможет вызвать его методы — и это видно в утилите раньше, чем в коде. Для разовой проверки OLE Viewer избыточен; его берут, когда соединение ведёт себя странно и нужно заглянуть внутрь регистрации.

Как получить GUID через PowerShell

PowerShell достаёт CLSID из реестра одной командой — это удобно для скриптов и проверки на нескольких машинах. Значение по умолчанию ключа читается методом GetValue("").

CLSID по программному идентификатору:

(Get-Item "Registry::HKEY_CLASSES_ROOT\V83.COMConnector\CLSID").GetValue("")

Путь к зарегистрированной библиотеке по полученному GUID:

$clsid = (Get-Item "Registry::HKEY_CLASSES_ROOT\V83.COMConnector\CLSID").GetValue("")
(Get-Item "Registry::HKEY_CLASSES_ROOT\CLSID\$clsid\InprocServer32").GetValue("")

Проверка, что объект не просто числится в реестре, а реально создаётся:

$conn = New-Object -ComObject "V83.COMConnector"
$conn.GetType().FullName

Если последняя команда отрабатывает без ошибки — коннектор исправен. Если падает с «класс не зарегистрирован», переходите к перерегистрации.

Чтобы увидеть, какие объекты 1С вообще зарегистрированы на машине (пригодится, когда стоит несколько платформ), переберите подходящие ProgID:

Get-ChildItem "Registry::HKEY_CLASSES_ROOT" |
  Where-Object { $_.PSChildName -match '^V8\d(C)?\.(COMConnector|Application)$' } |
  Select-Object -ExpandProperty PSChildName

Команда выведет имена вроде V82.COMConnector, V83.COMConnector, V83.Application — по ним видно, коннекторы каких версий присутствуют в системе.

Четыре способа дают один и тот же GUID, но подходят под разные задачи:

СпособКогда удобенЧто ещё покажет
regeditразовый просмотр вручнуюпуть к DLL, соседние ключи
OLE/COM Viewerнужно проверить интерфейсыбиблиотеку типов, целостность
PowerShellскрипты, проверка на многих ПКсразу путь и факт создания
New-Object / Connectпроверка живого соединенияошибку подключения целиком

Чтобы прочитать 32-битную регистрацию, запускайте 32-разрядный PowerShell — %SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe. 64-битный процесс по пути HKEY_CLASSES_ROOT\V83.COMConnector увидит только 64-битную ветку; 32-битная лежит в WOW6432Node, и запрашивать её нужно явно.

Регистрация и перерегистрация COM-коннектора 1С

Если ключа V83.COMConnector в реестре нет, GUID брать неоткуда — библиотека не зарегистрирована. Регистрируют её утилитой regsvr32.

Сначала найдите файл. Он лежит в папке bin установленной платформы:

  • 64-битный: C:\Program Files\1cv8\<версия>\bin\comcntr.dll
  • 32-битный: C:\Program Files (x86)\1cv8\<версия>\bin\comcntr.dll

Точный номер версии в пути можно подсмотреть в заголовке окна запущенной 1С (пункт меню «О программе») или по имени подпапки внутри C:\Program Files\1cv8 — там каждая установленная платформа лежит в своей папке.

Запустите командную строку от имени администратора (регистрация пишет в HKEY_LOCAL_MACHINE) и выполните, подставив свою версию платформы:

regsvr32 "C:\Program Files\1cv8\8.3.24.1548\bin\comcntr.dll"

Снять регистрацию (перед сменой разрядности или версии):

regsvr32 /u "C:\Program Files\1cv8\8.3.24.1548\bin\comcntr.dll"

Разрядность должна совпадать с вызывающей программой. 32-битному клиенту (например, 32-битному Excel) нужен 32-битный comcntr.dll, и регистрировать его надо 32-битным regsvr32 из C:\Windows\SysWOW64\regsvr32.exe. 64-битному вызову — 64-битную библиотеку обычным regsvr32 из System32. Зарегистрировать 32-битный DLL 64-битным regsvr32 не получится — загрузчик вернёт ошибку.

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

Отдельный частый случай — перерегистрация после обновления платформы. Новая версия ставится в свою папку bin, а в InprocServer32 остаётся путь на старую, уже удалённую. GUID при этом в реестре есть, но указывает в пустоту. Лечится повторным regsvr32 с путём к comcntr.dll текущего релиза.

Объект V83.Application — внепроцессный (LocalServer32, то есть 1cv8.exe). Для него, помимо регистрации, может понадобиться настройка прав запуска и доступа в dcomcnfg. Для V83.COMConnector этого не требуется — он загружается внутри процесса клиента.

Как применить полученный GUID в подключении

Внешняя программа создаёт объект двумя путями — по ProgID или по CLSID. По имени проще, и в большинстве случаев достаточно его. Пример внешнего соединения с серверной базой из PowerShell:

$conn = New-Object -ComObject "V83.COMConnector"
$base = $conn.Connect('Srvr="server-1c";Ref="buh";Usr="Иванов";Pwd="пароль";')

Для файловой базы строка подключения другая:

$base = $conn.Connect('File="C:\bases\buh";Usr="Администратор";Pwd="";')

GUID вместо имени нужен тогда, когда на машине стоит несколько платформ и ProgID может разрешиться не в ту версию, либо когда среда вообще не умеет работать с ProgID. В .NET и PowerShell объект создают по CLSID так:

$type = [Type]::GetTypeFromCLSID([Guid]"{ваш-CLSID}")
$conn = [Activator]::CreateInstance($type)

Вместо {ваш-CLSID} подставьте значение, прочитанное из реестра одним из способов выше. Такой вызов жёстко привязывается к конкретному зарегистрированному классу и не зависит от того, какой ProgID окажется «главным».

Разрядность вызывающей среды и comcntr.dll должна совпадать. 32-битный процесс не создаст объект из 64-битной регистрации, даже если GUID указан правильно.

Частые ошибки регистрации и их устранение

Больше половины обращений «не получаю GUID» сводятся к разрядности и к устаревшему пути после обновления. Сверьте симптом с причиной:

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

Первое, что стоит проверить при ошибке 0x80040154, — не в той ли вы ветке ищете GUID. Если вызывающая программа 32-битная, а вы смотрите в HKEY_CLASSES_ROOT\CLSID, объекта там и не будет — он в WOW6432Node.

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

Перед сменой разрядности сначала снимите старую регистрацию командой regsvr32 /u, иначе в реестре останутся два описания класса, и неясно, какое из них подхватит система.

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

Чем CLSID отличается от ProgID?
ProgID — это читаемое имя класса, например V83.COMConnector. CLSID — 128-битный GUID, по которому Windows физически находит библиотеку. ProgID существует для удобства и просто ссылается на CLSID.
Меняется ли GUID коннектора при обновлении платформы 1С?
Нет. CLSID задан в библиотеке типов внутри comcntr.dll и стабилен между релизами. Меняется только путь в InprocServer32 — на папку новой версии.
Нужны ли права администратора, чтобы прочитать GUID?
Нет. Чтение реестра через regedit или PowerShell доступно обычному пользователю. Права администратора нужны только для регистрации библиотеки через regsvr32, потому что она пишет в HKEY_LOCAL_MACHINE.
Как понять разрядность зарегистрированного коннектора?
64-битная регистрация лежит в HKEY_CLASSES_ROOT\CLSID, 32-битная — в HKEY_CLASSES_ROOT\WOW6432Node\CLSID. В какой ветке нашёлся ваш ключ — такой и разрядности коннектор.
Что делать, если `V83.COMConnector` нет в реестре вообще?
Библиотека не зарегистрирована. Найдите comcntr.dll в папке bin установленной платформы и выполните regsvr32 с путём к нему от имени администратора — ключ и CLSID появятся.