При разработке и сопровождении конфигураций 1С часто требуется динамическое выполнение кода на языке JavaScript или VBScript, а также разбор структур данных. Для этих целей традиционно использовался COM-объект MSScriptControl.ScriptControl. Однако при вызове конструктора разработчики нередко сталкиваются со следующей ошибкой:
обMSScriptControl = Новый COMОбъект("MSScriptControl.ScriptControl");
// Ошибка при вызове конструктора (COMОбъект):
// -2147221164(0x80040154): Класс не зарегистрирован
В ряде ситуаций код успешно отрабатывает на одном компьютере (или на 32-битном сервере), но на локальной файловой базе выдает ошибку. Проанализируем детально, почему это происходит и какие существуют пути решения проблемы.
Разберем природу поведения операционной системы и платформы 1С:
msscript.ocx: Компонент Microsoft Script Control существует исключительно в 32-разрядном (x86) исполнении. Корпорация Microsoft никогда не выпускала официальную 64-битную версию данной библиотеки.Windows x86-64), 64-битный процесс платформы 1cv8.exe не может напрямую загрузить 32-битную DLL/OCX в свое адресное пространство. Система Windows не находит подходящей записи класса в 64-битной ветке реестра и возвращает код ошибки 0x80040154 (Класс не зарегистрирован).SysWOW64, иначе 32-битные процессы также не смогут получить к ним доступ.Если код выполняется в файловой базе или на клиенте в клиент-серверном режиме, самым простым решением является явный запуск 32-битного исполняемого файла платформы 1С:
C:\Program Files (x86)\1cv8\....Если на компьютере используется 32-битный клиент 1С, но ошибка сохраняется, необходимо убедиться, что библиотека зарегистрирована в операционной системе. Разберем по шагам правильный порядок действий:
msscript.ocx в системной папке C:\Windows\SysWOW64\ (для 64-битной Windows) или C:\Windows\System32\ (для 32-битной Windows).cmd.exe от имени администратора.
%SystemRoot%\SysWOW64\regsvr32.exe %SystemRoot%\SysWOW64\msscript.ocx
Если приложение 1С обязательно должно работать в 64-разрядном режиме (например, на 64-битном сервере 1С:Предприятия или под 64-битным клиентом), настроим межпроцессный вызов 32-битного компонента через системный суррогат dllhost.exe:
dcomcnfg через меню «Выполнить»).Корень консоли -> Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.MSScriptControl_x64) и укажем тип активации Серверное приложение.MSScriptControl.ScriptControl и завершим настройку.После этой настройки 64-битный процесс 1С сможет успешно создавать объект через вызов COM+ суррогата без изменения исходного программного кода 1С.
Рассмотрим современные альтернативы, позволяющие полностью отказаться от устаревшей технологии MSScriptControl, которая не поддерживается в среде Linux и вызывает сложности на 64-битных платформах:
HTML = Новый COMОбъект("htmlfile");
HTML.Open();
HTML.Write("<script>function ВычислитьСумму(a, b) { return a + b; }</script>");
Результат = HTML.parentWindow.ВычислитьСумму(10, 25);
Если ScriptControl использовался для парсинга данных в формате JSON, воспользуемся штатными объектами платформы ЧтениеJSON, ЗаписьJSON и методами ПрочитатьJSON() и ЗаписатьJSON(), доступными в 1С, начиная с версии 8.3.6.