CLSID COM-коннектора 1С: где искать и как перерегистрировать
Содержание
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
Чтение реестра прав администратора не требует — он нужен только для регистрации.
- Нажмите
Win+R, введитеregedit, нажмите Enter. - В адресную строку regedit (вверху окна) вставьте путь
HKEY_CLASSES_ROOT\V83.COMConnector\CLSIDи нажмите Enter. - В правой панели прочитайте параметр
(По умолчанию)— это и есть ваш CLSID, строка вида{181E893D-...}. Берите значение именно из своего реестра: оно авторитетнее любого примера из статьи. - Чтобы увидеть, какой файл стоит за этим GUID, перейдите в
HKEY_CLASSES_ROOT\CLSID\{ваш-GUID}\InprocServer32. Значение по умолчанию — полный путь кcomcntr.dll. - Для 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.
Порядок работы:
- Запустите OLE/COM Viewer той же разрядности, что и искомый объект (для 32-битного коннектора — 32-битную версию утилиты).
- Раскройте группу классов объектов и найдите
V83.COMConnectorпо имени. - В правой панели утилита покажет 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 не получится — загрузчик вернёт ошибку.
Отдельный частый случай — перерегистрация после обновления платформы. Новая версия ставится в свою папку 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» сводятся к разрядности и к устаревшему пути после обновления. Сверьте симптом с причиной:
comcntr.dll не зарегистрирована или зарегистрирована в другой разрядности. Зарегистрируйте regsvr32 нужной разрядности от администратора.V83.Application дополнительно проверьте права запуска и доступа в dcomcnfg.comcntr.dll или не установлен распространяемый пакет Microsoft Visual C++ нужной разрядности. Проверьте путь, разрядность и наличие пакета.InprocServer32 указывает на удалённую версию. Перерегистрируйте comcntr.dll из папки текущего релиза.comcntr.dll разных релизов. Выровняйте версию библиотеки с версией информационной базы.Первое, что стоит проверить при ошибке 0x80040154, — не в той ли вы ветке ищете GUID. Если вызывающая программа 32-битная, а вы смотрите в HKEY_CLASSES_ROOT\CLSID, объекта там и не будет — он в WOW6432Node.
Второе по частоте — несовпадение версий коннектора и информационной базы. Библиотеку comcntr.dll берут из релиза, не ниже версии платформы, на которой работает база. Если база обновилась, а зарегистрирован старый коннектор, объект создастся, но часть вызовов вернёт ошибку совместимости. Решение простое: перерегистрировать comcntr.dll из папки актуального релиза.
Перед сменой разрядности сначала снимите старую регистрацию командой regsvr32 /u, иначе в реестре останутся два описания класса, и неясно, какое из них подхватит система.
Частые вопросы
Чем CLSID отличается от ProgID?
V83.COMConnector. CLSID — 128-битный GUID, по которому Windows физически находит библиотеку. ProgID существует для удобства и просто ссылается на CLSID.Меняется ли GUID коннектора при обновлении платформы 1С?
comcntr.dll и стабилен между релизами. Меняется только путь в InprocServer32 — на папку новой версии.Нужны ли права администратора, чтобы прочитать GUID?
regedit или PowerShell доступно обычному пользователю. Права администратора нужны только для регистрации библиотеки через regsvr32, потому что она пишет в HKEY_LOCAL_MACHINE.Как понять разрядность зарегистрированного коннектора?
HKEY_CLASSES_ROOT\CLSID, 32-битная — в HKEY_CLASSES_ROOT\WOW6432Node\CLSID. В какой ветке нашёлся ваш ключ — такой и разрядности коннектор.Что делать, если `V83.COMConnector` нет в реестре вообще?
comcntr.dll в папке bin установленной платформы и выполните regsvr32 с путём к нему от имени администратора — ключ и CLSID появятся.