Как исправить ошибку «Разрешение отклонено» при запуске COM-объектов через веб-клиент 1С?

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

При разработке функционала, работающего через веб-клиент 1С, программисты часто сталкиваются с необходимостью выполнения скриптов или обращения к внешним приложениям (например, Microsoft Excel) на стороне сервера. Типичная ситуация: код прекрасно работает в толстом клиенте, но при попытке выполнить его из браузера возникает ошибка «Разрешение отклонено» (Permission Denied) на этапе создания объекта CreateObject. Разберем подробно, почему это происходит и как настроить сервер для корректной работы.

Анализируем исходную проблему

Рассмотрим ситуацию, когда в коде модуля 1С на сервере создается объект MSScriptControl.ScriptControl для выполнения VBScript. Цель скрипта — открыть файл Excel и вывести его на экран или отправить на печать. Пример кода, который вызывает ошибку:


ВБС = Новый COMОбъект("MSScriptControl.ScriptControl");
ВБС.Language = "vbscript";
текстСкрипта = "
    xlsFileName = ""D:\report.xlsx""
    set a = createobject(""excel.application"")
    a.visible = true
    set b = a.workbooks.open(xlsFileName)
";
ВБС.AddCode(текстСкрипта);
ВБС.Run();

При запуске этого кода через веб-клиент (под управлением Apache или IIS) сервер 1С выдает исключительную ситуацию. Проблема кроется не в самом языке 1С, а в правах доступа учетной записи, под которой работает служба веб-сервера в операционной системе Windows.

Выясняем причину: Особенности работы веб-сервера

Проанализируем, как работает Apache или IIS. По умолчанию эти службы устанавливаются и запускаются от имени системных учетных записей, таких как LocalSystem, LocalService или NetworkService. Эти учетные записи обладают широкими правами внутри системы, но у них есть критическое ограничение: отсутствие интерактивного профиля пользователя.

Для Microsoft Office (Excel, Word) крайне важно наличие настроенного профиля пользователя (ветки реестра HKEY_CURRENT_USER, папки временных файлов и папки рабочего стола). Когда служба пытается выполнить createobject("excel.application"), Windows блокирует это действие, так как системная служба не имеет прав на запуск интерактивного графического приложения. Это и приводит к ошибке «Разрешение отклонено».

Решение №1: Настройка службы Apache для работы от имени пользователя

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

  1. Откроем консоль управления службами (services.msc).
  2. Найдем в списке службу вашего веб-сервера (например, Apache2.4).
  3. Щелкнем правой кнопкой мыши и выберем «Свойства».
  4. Перейдем на вкладку «Вход в систему» (Log On).
  5. Вместо «С системной учетной записью» выберем переключатель «С учетной записью».
  6. Укажем имя пользователя (например, .\Администратор или специально созданный USER) и введем пароль. Важно: у пользователя обязательно должен быть установлен пароль, иначе служба может не запуститься.
  7. Нажмем «ОК» и перезапустим службу.

После этой манипуляции веб-сервер получит доступ ко всем ресурсам данного пользователя, включая возможность запускать Excel через COM.

Решение №2: Настройка папок Desktop для системного профиля

Если по соображениям безопасности вы не можете сменить пользователя службы, существует технический «лайфхак». Программа Excel при инициализации через COM часто ищет папку Desktop в профиле того, кто её запускает. Для системных служб эти папки отсутствуют. Мы можем создать их вручную.

Проанализируем структуру папок и создадим недостающие директории:

Важно: После создания папок убедитесь, что у группы «Все» или у конкретной учетной записи службы есть полные права доступа к этим папкам. Это часто помогает Excel успешно инициализироваться даже под системной учетной записью.

Решение №3: Настройка DCOM (dcomcnfg)

Иногда прав пользователя недостаточно, и нужно настроить права самого компонента COM. Рассмотрим алгоритм действий:

  1. Нажмем Win + R, введем dcomcnfg и нажмем Enter.
  2. Перейдем по пути: Службы компонентов -> Компьютеры -> Мой компьютер -> Настройка DCOM.
  3. Найдем в списке Microsoft Excel Application.
  4. Откроем «Свойства» и перейдем на вкладку «Безопасность».
  5. В разделах «Разрешения на запуск и активацию» и «Разрешения на доступ» выберем «Настроить» и добавим пользователя, под которым работает веб-сервер, предоставив ему все права.
  6. На вкладке «Удостоверение» (Identity) можно выбрать «Интерактивный пользователь» (тогда Excel будет запускаться в сессии того, кто сейчас залогинен на сервере) или жестко прописать данные администратора.

Рекомендации по архитектуре (почему COM на сервере — это плохо)

Несмотря на то, что мы нашли техническое решение, стоит помнить о рекомендациях Microsoft. Использование Excel на стороне сервера — это нестабильный путь. Рассмотрим причины:

Вместо использования Excel.Application на сервере, рекомендуем использовать встроенные средства 1С. Например, объект ТабличныйДокумент позволяет сохранять файлы в формате XLSX напрямую:


ТабДок = Новый ТабличныйДокумент;
// Заполнение документа...
ТабДок.Записать("D:\report.xlsx", ТипФайлаТабличногоДокумента.XLSX);

Для печати из веб-клиента лучше всего сформировать PDF-файл на сервере и передать его на клиент. Браузер предложит пользователю распечатать его стандартными средствами, что гарантированно сработает даже на ТСД или мобильных устройствах.

Подводя итог: если вам все же необходимо запустить скрипт через COM из веб-клиента, начните с проверки учетной записи службы веб-сервера и настройки прав DCOM. Это решит проблему с правами доступа в 99% случаев.

← На главную