При разработке функционала, работающего через веб-клиент 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 блокирует это действие, так как системная служба не имеет прав на запуск интерактивного графического приложения. Это и приводит к ошибке «Разрешение отклонено».
Самый быстрый и эффективный способ решить проблему — заставить веб-сервер работать от имени обычного пользователя Windows, у которого есть пароль и полноценный профиль. Выполним следующие шаги вместе:
services.msc)..\Администратор или специально созданный USER) и введем пароль. Важно: у пользователя обязательно должен быть установлен пароль, иначе служба может не запуститься.После этой манипуляции веб-сервер получит доступ ко всем ресурсам данного пользователя, включая возможность запускать Excel через COM.
Если по соображениям безопасности вы не можете сменить пользователя службы, существует технический «лайфхак». Программа Excel при инициализации через COM часто ищет папку Desktop в профиле того, кто её запускает. Для системных служб эти папки отсутствуют. Мы можем создать их вручную.
Проанализируем структуру папок и создадим недостающие директории:
C:\Windows\SysWOW64\config\systemprofile\DesktopC:\Windows\System32\config\systemprofile\DesktopВажно: После создания папок убедитесь, что у группы «Все» или у конкретной учетной записи службы есть полные права доступа к этим папкам. Это часто помогает Excel успешно инициализироваться даже под системной учетной записью.
Иногда прав пользователя недостаточно, и нужно настроить права самого компонента COM. Рассмотрим алгоритм действий:
Win + R, введем dcomcnfg и нажмем Enter.Несмотря на то, что мы нашли техническое решение, стоит помнить о рекомендациях Microsoft. Использование Excel на стороне сервера — это нестабильный путь. Рассмотрим причины:
Вместо использования Excel.Application на сервере, рекомендуем использовать встроенные средства 1С. Например, объект ТабличныйДокумент позволяет сохранять файлы в формате XLSX напрямую:
ТабДок = Новый ТабличныйДокумент;
// Заполнение документа...
ТабДок.Записать("D:\report.xlsx", ТипФайлаТабличногоДокумента.XLSX);
Для печати из веб-клиента лучше всего сформировать PDF-файл на сервере и передать его на клиент. Браузер предложит пользователю распечатать его стандартными средствами, что гарантированно сработает даже на ТСД или мобильных устройствах.
Подводя итог: если вам все же необходимо запустить скрипт через COM из веб-клиента, начните с проверки учетной записи службы веб-сервера и настройки прав DCOM. Это решит проблему с правами доступа в 99% случаев.