Почему возникает ошибка «Класс не зарегистрирован» при создании COM-объекта MSScriptControl и как её исправить?

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

При разработке и сопровождении конфигураций 1С часто требуется динамическое выполнение кода на языке JavaScript или VBScript, а также разбор структур данных. Для этих целей традиционно использовался COM-объект MSScriptControl.ScriptControl. Однако при вызове конструктора разработчики нередко сталкиваются со следующей ошибкой:


обMSScriptControl = Новый COMОбъект("MSScriptControl.ScriptControl");
// Ошибка при вызове конструктора (COMОбъект):
// -2147221164(0x80040154): Класс не зарегистрирован

В ряде ситуаций код успешно отрабатывает на одном компьютере (или на 32-битном сервере), но на локальной файловой базе выдает ошибку. Проанализируем детально, почему это происходит и какие существуют пути решения проблемы.

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

Разберем природу поведения операционной системы и платформы 1С:

  1. Разрядность библиотеки msscript.ocx: Компонент Microsoft Script Control существует исключительно в 32-разрядном (x86) исполнении. Корпорация Microsoft никогда не выпускала официальную 64-битную версию данной библиотеки.
  2. Несовместимость адресного пространства процессов: Если запуск файловой информационной базы выполняется через 64-разрядный клиент 1С (Windows x86-64), 64-битный процесс платформы 1cv8.exe не может напрямую загрузить 32-битную DLL/OCX в свое адресное пространство. Система Windows не находит подходящей записи класса в 64-битной ветке реестра и возвращает код ошибки 0x80040154 (Класс не зарегистрирован).
  3. Отсутствие регистрации в подсистеме WOW64: На 64-разрядных операционных системах 32-битные библиотеки должны быть зарегистрированы через утилиту из каталога SysWOW64, иначе 32-битные процессы также не смогут получить к ним доступ.

Способ 1. Запуск 32-разрядного тонкого/толстого клиента 1С

Если код выполняется в файловой базе или на клиенте в клиент-серверном режиме, самым простым решением является явный запуск 32-битного исполняемого файла платформы 1С:

  1. Откроем список баз в окне запуска 1С:Предприятия.
  2. Выберем нужную базу, нажмем кнопку Изменить и перейдем на последнюю страницу параметров запуска.
  3. В поле Основной режим запуска или в параметрах разрядности укажем принудительное использование версии 32-разрядная (x86).
  4. Проверим, что на рабочей станции установлен 32-битный дистрибутив клиента, расположенный по пути C:\Program Files (x86)\1cv8\....

Способ 2. Регистрация библиотеки msscript.ocx в Windows

Если на компьютере используется 32-битный клиент 1С, но ошибка сохраняется, необходимо убедиться, что библиотека зарегистрирована в операционной системе. Разберем по шагам правильный порядок действий:

  1. Убедимся в наличии файла msscript.ocx в системной папке C:\Windows\SysWOW64\ (для 64-битной Windows) или C:\Windows\System32\ (для 32-битной Windows).
  2. Запустим командную строку cmd.exe от имени администратора.
  3. Выполним команду регистрации для 64-битной ОС: %SystemRoot%\SysWOW64\regsvr32.exe %SystemRoot%\SysWOW64\msscript.ocx
  4. Дождемся сообщения об успешной регистрации класса в реестре.

Способ 3. Использование Dllhost Surrogate (COM+) для 64-битных процессов

Если приложение 1С обязательно должно работать в 64-разрядном режиме (например, на 64-битном сервере 1С:Предприятия или под 64-битным клиентом), настроим межпроцессный вызов 32-битного компонента через системный суррогат dllhost.exe:

  1. Откроем консоль управления Службы компонентов (выполним команду dcomcnfg через меню «Выполнить»).
  2. Перейдем в ветку Корень консоли -> Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.
  3. Нажмем правой кнопкой мыши на Приложения COM+, выберем Создать -> Приложение.
  4. В мастере создания нажмем Далее, выберем Создать новое приложение, зададим имя (например, MSScriptControl_x64) и укажем тип активации Серверное приложение.
  5. На вкладке учетной записи выберем системную учетную запись или пользователя, от имени которого работает служба сервера 1С.
  6. В созданном приложении откроем папку Компоненты, нажмем правой кнопкой мыши: Создать -> Компонент.
  7. Выберем Установка уже зарегистрированных компонентов, найдем в списке MSScriptControl.ScriptControl и завершим настройку.

После этой настройки 64-битный процесс 1С сможет успешно создавать объект через вызов COM+ суррогата без изменения исходного программного кода 1С.

Способ 4. Переход на кроссплатформенные и штатные альтернативы

Рассмотрим современные альтернативы, позволяющие полностью отказаться от устаревшей технологии MSScriptControl, которая не поддерживается в среде Linux и вызывает сложности на 64-битных платформах:

  1. Использование COM-объекта htmlfile: Данный объект поставляется в составе движка Internet Explorer/MSHTML, существует как в 32-битном, так и в 64-битном виде:
    
    HTML = Новый COMОбъект("htmlfile");
    HTML.Open();
    HTML.Write("<script>function ВычислитьСумму(a, b) { return a + b; }</script>");
    Результат = HTML.parentWindow.ВычислитьСумму(10, 25);
    
  2. Встроенные средства платформы 1С:

    Если ScriptControl использовался для парсинга данных в формате JSON, воспользуемся штатными объектами платформы ЧтениеJSON, ЗаписьJSON и методами ПрочитатьJSON() и ЗаписатьJSON(), доступными в 1С, начиная с версии 8.3.6.

  3. Использование внешних компонент Native API: Для выполнения сложных JavaScript-сценариев на сервере рекомендуется подключать современные кроссплатформенные движки (например, QuickJS или V8), упакованные во внешнюю компоненту 1С.
← На главную