При организации интеграции между информационными базами 1С с использованием COM-соединения разработчики и администраторы нередко сталкиваются с ошибкой инициализации объекта. В клиент-серверном варианте подключение может отрабатывать штатно, тогда как в файловой базе или при смене пользователя возникает исключение вида: Ошибка при вызове конструктора (COMОбъект) -2147024891(0x80070005): Отказано в доступе.
Разберем детально, чем отличается работа COM-коннектора в различных режимах работы 1С, почему возникает данная ошибка и какими способами можно восстановить корректный доступ к внешнему объекту.
Посмотрим на стандартный пример создания подключения в программном коде 1С:
Попытка
COMСоединитель = Новый COMОбъект("V83.COMConnector");
ПараметрыПодключения = "File=""C:\Bases\Demo""; Usr=""Admin""; Pwd=""123"";";
ВнешнееСоединение = COMСоединитель.Connect(ПараметрыПодключения);
Исключение
Сообщить("Не удалось установить соединение: " + ОписаниеОшибки());
КонецПопытки;
Проанализируем контекст исполнения кода. Разница между файловой базой и клиент-серверным вариантом (SQL) заключается в учетной записи операционной системы, от имени которой выполняется создание COM-объекта:
ragent.exe. Соответственно, запуск COM-компонента и обращение к ресурсам происходят от имени служебного пользователя операционной системы (например, usr1cv8), под которым стартует служба сервера 1С.1cv8.exe или 1cv8c.exe от имени текущего интерактивного пользователя Windows. Если у этого пользователя отсутствуют разрешения на запуск DCOM-компонентов, чтение соответствующих веток реестра или доступ к временным каталогам, операционная система возвращает ошибку 0x80070005.Выясним частую ошибку регистрации. Запуск утилиты regsvr32 по сетевому пути (например, \\Server\1C\bin\comcntr.dll) может приводить к сбоям из-за политик безопасности Windows для сетевых расположений.
Выполним шаги по локальной регистрации:
comcntr.dll нужной версии платформы находится на локальном диске компьютера.cmd.exe обязательно от имени администратора.
regsvr32 "C:\Program Files (x86)\1cv8\8.3.10.2561\bin\comcntr.dll"
Ошибка 0x80070005 напрямую указывает на нехватку разрешений в подсистеме DCOM операционной системы. Настроим параметры безопасности через системную оснастку:
dcomcnfg и нажмем Enter.СИСТЕМА (SYSTEM), Интерактивные (INTERACTIVE), а также текущего пользователя или группу пользователей. Предоставим им флаги Локальный доступ.Разберем дополнительные системные ограничения, которые могут блокировать работу коннектора:
regedit и проверим права на чтение подразделов HKEY_CLASSES_ROOT\V83.COMConnector, HKEY_CLASSES_ROOT\V83.COMConnector.1 и соответствующего ветке CLSID (включая InprocServer32). Пользователь или группа «Пользователи» должны иметь права на чтение этих разделов.1Cv8.1CD), а также на папки временных файлов %TEMP%, %APPDATA%\1C\1cv8 и %LOCALAPPDATA%\1C\1cv8.Для стабильной работы и устранения конфликтов прав доступа между разными процессами и разрядностями рекомендуется настроить серверное приложение COM+:
dcomcnfg (Службы компонентов).comcntr.dll.При таком подходе вызовы COM-объекта будут выполняться в изолированном процессе dllhost.exe от имени заданной учетной записи, что полностью решает проблему нехватки прав у локального пользователя.
Технология COM-соединения жестко привязана к операционной системе Windows, разрядности библиотек и точному совпадению версий платформы 1С. В современной разработке при возникновении сложностей с настройкой DCOM рекомендуется рассмотреть альтернативные способы взаимодействия: