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

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

При инициализации компонента выполнения сценариев в коде 1С разработчики нередко сталкиваются с аварийным завершением работы следующего вида:


Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
// Ошибка при вызове конструктора (COMОбъект):
// -2147024891(0x80070005): Отказано в доступе.

Проанализируем природу этой неполадки, разберем причины ее внезапного возникновения на рабочих базах и по шагам настроим систему для стабильной работы или полного отказа от устаревшей технологии.

Причины возникновения ошибки 0x80070005

Код 0x80070005 в операционной системе Windows однозначно указывает на ограничение прав доступа (E_ACCESSDENIED). В контексте 1С:Предприятия это чаще всего обусловлено тремя ключевыми факторами:

  1. Конфликт разрядности (32 и 64 бита): библиотека msscript.ocx исторически разработана исключительно в 32-разрядной версии. Корпорация Microsoft так и не выпустила 64-битный вариант этого модуля. Если клиентское приложение или служба сервера 1С работает под 64-разрядной платформой, прямой вызов 32-битной библиотеки из 64-битного процесса невозможен без суррогатного процесса dllhost.exe.
  2. Недостаток прав учетной записи службы 1С: при выполнении кода на стороне сервера процесс запускается от имени системного пользователя (обычно USR1CV8). У этой учетной записи по умолчанию могут отсутствовать разрешения на запуск и локальную активацию компонентов в подсистеме DCOM.
  3. Файловые разрешения и политики безопасности: у сервисного аккаунта могут отсутствовать права чтения библиотеки msscript.ocx, расположенной в системном каталоге, либо в операционной системе применены политики ограничения запуска скриптовых сред.

Решение 1. Создание приложения COM+ для 32-битного компонента

Если код выполняется в 64-битной среде (сервер 1С x64 или 64-битный толстый/тонкий клиент), классическим решением является размещение 32-битной библиотеки внутри изолированного пула приложений COM+. Разберем по шагам, как настроить такую обертку:

  1. Откроем оснастку управления компонентами: нажмем комбинацию клавиш Win + R, введем команду dcomcnfg и нажмем Enter.
  2. В дереве консоли перейдем по пути: Службы компонентов → Компьютеры → Мой компьютер → Приложения COM+.
  3. Нажмем правой кнопкой мыши на ветку Приложения COM+, выберем Создать → Приложение. В мастере создания выберем вариант Установить новое приложение, укажем понятное имя (например, MSScriptControl_x86) и зададим тип активации Серверное приложение.
  4. На шаге выбора удостоверения укажем учетную запись, имеющую достаточные полномочия в операционной системе (например, встроенную локальную службу или административного пользователя с фиксированным паролем).
  5. Откроем свойства созданного приложения, перейдем на вкладку Безопасность, снимем флаг Принудительная проверка доступа для приложений и установим политику программных ограничений в значение Неограниченный.
  6. Внутри созданного приложения раскроем ветку Компоненты, нажмем правой кнопкой мыши и выберем Создать → Компонент. Выберем вариант Установка новых компонентов и укажем файл C:\Windows\SysWOW64\msscript.ocx.

После этой процедуры 64-битный процесс 1С сможет прозрачно обращаться к MSScriptControl.ScriptControl через системный межпроцессный мост Windows.

Решение 2. Настройка прав по умолчанию в DCOM и прав на файлы

Если приложение уже настроено или код выполняется локально под пользователем с урезанными правами, скорректируем глобальные разрешения DCOM:

  1. В оснастке dcomcnfg откроем свойства узла Мой компьютер.
  2. Перейдем на вкладку Безопасность COM.
  3. В группах Разрешения на доступ и Разрешения на запуск и активацию нажмем кнопку Изменить значения по умолчанию.
  4. Добавим пользователя USR1CV8 (или локальную группу Пользователи DCOM) и предоставим флаги: Локальный доступ, Локальный запуск и Локальная активация.
  5. Проверим права на сам файл библиотеки: перейдем в папку C:\Windows\SysWOW64\, откроем свойства файла msscript.ocx, перейдем на вкладку Безопасность и убедимся, что для группы Пользователи или аккаунта службы 1С установлены флаги Чтение и выполнение.

Решение 3. Отказ от MSScriptControl в пользу встроенных механизмов 1С

Важно помнить, что технология VBScript признана устаревшей и постепенно выводится компанией Microsoft из состава современных операционных систем. Кроме того, COM-объекты делают код полностью несовместимым с серверами под управлением Linux. Рассмотрим альтернативные способы решения типовых задач без внешних библиотек:

  1. Вычисление математических формул и простых выражений: заменим скриптовые расчеты на штатную функцию Вычислить() встроенного языка:
    
    // Вместо вызова метода Скрипт.Eval()
    Формула = "150 * 1.20 + 45";
    Результат = Вычислить(Формула);
    
  2. Парсинг и формирование JSON: очень часто старый код использует MSScriptControl только ради разбора JSON-строк в JavaScript. В современной платформе 1С:Предприятие для этого есть быстрые нативные средства:
    
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(СтрокаJSON);
    Данные = ПрочитатьJSON(Чтение);
    Чтение.Закрыть();
    
  3. Выполнение внешних сценариев: если требуется запуск сложной внешней логики, надежнее вызывать системные утилиты через метод ЗапуститьПриложение() либо задействовать внешние компоненты, разработанные по технологии Native API.

Отказ от COM-компонентов в пользу встроенных объектов 1С не только решает проблему с правами доступа 0x80070005, но и гарантирует стабильность вашей информационной базы при последующих обновлениях платформы и серверной ОС.

← На главную