Как исправить ошибку 2147024891 0x80070005 «Отказано в доступе» при работе с COM-объектами в 1С?

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с внешним оборудованием (например, весами или сканерами) или при организации обмена данными между базами 1С через COMConnector, системные администраторы и разработчики часто сталкиваются с ошибкой 2147024891 0x80070005: отказано в доступе — для этой задачи пригодится готовый инструмент обмена данными между базами 1С через COM-соединение или веб-сервис. Эта проблема особенно актуальна для систем, работающих под управлением 64-битных версий Windows и использующих веб-сервер IIS. Разберем детально, почему возникает эта ошибка и как её устранить несколькими способами.

Разбираемся в причинах ошибки

Код ошибки 0x80070005 является стандартным ответом операционной системы Windows, указывающим на проблемы с правами доступа в подсистеме DCOM (Distributed Component Object Model). В контексте 1С это чаще всего происходит в следующих сценариях:

  1. Разрядность систем: Попытка вызвать 32-битную COM-библиотеку из 64-битного процесса сервера 1С или IIS.
  2. Ограничения прав: Учетная запись, от имени которой запущен сервер 1С (обычно USR1CV8) или веб-сервер (IUSR), не имеет прав на запуск и активацию конкретного COM-объекта.
  3. Интерактивный вход: COM-объект пытается инициализировать окружение пользователя, которое не загружено для сервисной учетной записи.

Способ 1: Создание и настройка приложения COM+

Этот метод является наиболее эффективным, так как он позволяет создать «обертку» (суррогатный процесс dllhost.exe) для вашей библиотеки. Это решает проблему разрядности и позволяет явно указать права доступа. Рассмотрим по шагам процесс настройки на примере библиотеки comcntr.dll или драйвера весов (для обхода проблем с DCOM удобно использовать драйвер интеграции электронных весов без COM и DLL).

  1. Откроем Панель управления — Администрирование — Службы компонентов.
  2. В дереве консоли перейдем: Компьютеры — Мой компьютер — Приложения COM+.
  3. Нажмем правой кнопкой мыши на «Приложения COM+» и выберем Создать — Приложение.
  4. В мастере выберем «Создать новое приложение», введем понятное имя (например, 1C_COM_Connector) и выберем способ установки Серверное приложение.
  5. На вкладке выбора учетной записи выберем Указанный пользователь. Здесь крайне важно указать данные учетной записи администратора сервера (или специально созданного пользователя с правами локального администратора).
  6. После создания приложения зайдем в его ветку, найдем папку Компоненты. Нажмем Создать — Компонент.
  7. Выберем «Установка новых компонентов» и укажем путь к нужной библиотеке, например: C:\Program Files\1cv8\8.3.X.XXXX\bin\comcntr.dll.

Важный этап настройки безопасности:

После регистрации компонента необходимо настроить политику ограничений, чтобы избежать блокировок со стороны Windows:

  1. Нажмем правой кнопкой мыши на созданное приложение (например, 1C_COM_Connector) — Свойства.
  2. Перейдем на вкладку Безопасность.
  3. Снимем флажок Принудительная проверка доступа для приложений.
  4. В блоке «Политика программных ограничений» установим флажок Применить политику программных ограничений и выберем уровень Неограниченный.

Проанализируем ситуацию: эти действия позволяют системе запускать COM-объект с максимальными правами, игнорируя контекст безопасности вызывающего процесса (например, анонимного пользователя IIS).

Способ 2: Перерегистрация библиотеки в системе

Иногда ошибка вызвана некорректной регистрацией DLL в реестре Windows после обновления платформы 1С. В таком случае попробуем выполнить ручную регистрацию через командную строку от имени администратора.

Для 64-битной платформы команда будет выглядеть так:

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

Если вы используете 32-битную версию платформы на 64-битном сервере, убедитесь, что вы регистрируете библиотеку из соответствующей папки (Program Files (x86)).

Способ 3: Особенности программного вызова (Параметры конструктора)

Разберем интересный нюанс, связанный с тем, как 1С обрабатывает конструктор Новый COMОбъект. Исследования показывают, что при работе в сетевой среде или через IIS, второй параметр конструктора (имя компьютера) играет ключевую роль — это критично, если вы используете перенос данных между УТ и БП через OLE/COM-подключение.

Если мы используем следующий код:


// Ошибочный вариант или вариант, вызывающий проблемы доступа
Весы = Новый COMОбъект("ComServ.Ves_", "localhost"); 
// Или
Весы = Новый COMОбъект("ComServ.Ves_", "");

Система может выдать ошибку 0x80070005. Выясним причину: при указании localhost или пустой строки механизмы DCOM могут накладывать более жесткие требования к авторизации. Попробуем изменить код, указав IP-адрес сервера или не указывая второй параметр вовсе, если объект создается локально:


// Рекомендуемый вариант
Весы = Новый COMОбъект("ComServ.Ves_");
// Или с использованием IP
Соединитель = Новый COMОбъект("V83.COMConnector", "192.168.1.10");

Способ 4: Настройка прав в DCOMConfig

Если создание приложения COM+ по каким-то причинам нежелательно, мы можем настроить права напрямую в системной конфигурации DCOM.

  1. Выполним команду dcomcnfg.
  2. Перейдем в Службы компонентов — Компьютеры — Мой компьютер — Настройка DCOM.
  3. Найдем в списке нужный объект (например, V83.COMConnector или ComServ.Ves_) — правильная настройка его прав обязательна, чтобы стабильно работал обмен данными между Розницей и БП через OLE/COM.
  4. В свойствах на вкладке Безопасность в разделах «Права на запуск и активацию» и «Права доступа» выберем «Настроить» и добавим пользователей IUSR, Network Service и USR1CV8, предоставив им полный доступ.

Способ 5: Настройка окружения пользователя в IIS

Если ваша база опубликована на IIS и ошибка возникает при работе веб-клиента, проанализируем настройки пула приложений — это часто помогает, когда не запускается выгрузка документов и справочников через COM/OLE-соединение. Часто системе не удается создать COM-объект, потому что для анонимного пользователя не загружен профиль.

Рассмотрим порядок действий в консоли IIS:

  1. Выберем Пулы приложений (Application Pools).
  2. Найдем пул, который обслуживает вашу базу 1С.
  3. Нажмем Дополнительные параметры (Advanced Settings).
  4. В разделе «Модель процесса» найдем пункт Загружать профиль пользователя (Load User Profile) и установим его в значение True.

Это действие создаст необходимые временные папки в профиле пользователя, к которым часто обращаются COM-библиотеки в процессе инициализации.

Резюме

Мы рассмотрели комплексный подход к решению проблемы 0x80070005. В большинстве случаев самым надежным решением является Способ 1 (создание серверного приложения COM+), так как он полностью изолирует работу библиотеки и позволяет выполнять её от имени пользователя с административными правами, что критически важно для доступа к COM-портам и другим аппаратным ресурсам сервера.

← На главную