При работе с внешними обработками, особенно теми, которые используют интеграцию с внешними сервисами (например, Эвотор или веб-сайты), разработчики часто сталкиваются с ошибкой: «Ошибка при вызове конструктора (COMОбъект): -2147221164(0x80040154): Класс не зарегистрирован». Чаще всего это происходит при попытке инициализировать объект MSScriptControl.ScriptControl.
В этой статье мы подробно разберем, почему возникает эта проблема, как она связана с разрядностью операционной системы и платформы 1С, и проанализируем пошаговые методы её решения.
Рассмотрим типовой сценарий. У нас есть работающий код, который используется для отправки HTTP-запросов через объект WinHttp.WinHttpRequest.5.1. Для тонкой настройки параметров запроса (например, игнорирования ошибок SSL-сертификатов) часто используется вспомогательный объект MSScriptControl.ScriptControl, который позволяет выполнять JavaScript-код прямо внутри 1С. Проанализируем пример такого кода:
Соединение = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.language = "javascript";
Скрипт.AddObject("WinHttp", Соединение);
Скрипт.Eval("WinHttp.Option(4)=13056"); // Игнорирование ошибок сертификатов
Соединение.Open("GET", "https://server.com/api", 0);
Соединение.Send();
Проблема заключается в том, что объект MSScriptControl.ScriptControl является 32-битным (x86). Если ваша платформа 1С или сервер 1С:Предприятие работают в 64-битном режиме, они физически не могут напрямую «увидеть» и создать этот объект, даже если библиотека зарегистрирована в системе. Это и вызывает ошибку «Класс не зарегистрирован».
Главная причина кроется в архитектуре Windows. В 64-битных версиях ОС реестр и системные папки разделены:
C:\Windows\System32 — здесь хранятся 64-битные системные файлы.C:\Windows\SysWOW64 — здесь хранятся 32-битные системные файлы.Когда вы запускаете 64-битную версию 1С, она ищет COM-классы в 64-битной ветке реестра. Поскольку msscript.ocx существует только в 32-битном варианте, поиск завершается неудачей. Интересно, что старая версия обработки может работать, если она запускается на клиенте (который может быть 32-битным), а новая версия пытается выполниться в серверном контексте (который на 99% 64-битный).
Это самый надежный и правильный способ заставить 64-битную 1С работать с 32-битным COM-объектом. Мы создадим специальную «оболочку», которая будет выступать мостом между разными архитектурами. Рассмотрим этот процесс по шагам:
comexp.msc).1C_MSScript. Установите флаг Серверное приложение.C:\Windows\SysWOW64\msscript.ocx.dllhost.exe, который будет пробрасывать вызовы из 64-битной среды в 32-битную.После этой настройки перезапустите сервер 1С, и ошибка должна исчезнуть.
Если вы уверены, что используете 32-битную платформу, но ошибка все равно возникает, возможно, библиотека просто не зарегистрирована корректно в нужном системном каталоге. Посмотрим, как это сделать правильно.
Важно помнить: для регистрации 32-битных библиотек в 64-битной Windows нужно использовать версию regsvr32.exe, которая находится в папке SysWOW64, а не в System32!
Выполните в командной строке (от имени администратора):
C:\Windows\SysWOW64\regsvr32.exe C:\Windows\SysWOW64\msscript.ocx
Если вы регистрируете comcntr.dll (COM-соединитель 1С), путь будет зависеть от версии вашей платформы:
C:\Windows\SysWOW64\regsvr32 "C:\Program Files\1cv8\8.3.22.2143\bin\comcntr.dll"
Проанализируем еще одну возможную причину. Если внешняя обработка запускается через справочник «Дополнительные отчеты и обработки», в настройках ее регистрации часто стоит флаг «Безопасный режим».
В безопасном режиме 1С блокирует создание любых COM-объектов в целях безопасности. Чтобы решить проблему, попробуйте:
Разберем ситуацию более глобально. Использование MSScriptControl и WinHttp — это «наследие» старых версий 1С (7.7 и ранние 8.x). Современная платформа 8.3 предоставляет мощные встроенные инструменты, которые работают быстрее, стабильнее и не зависят от разрядности или установленных в Windows компонентов.
Вместо сложной связки со скриптами, мы рекомендуем использовать объект HTTPСоединение. Посмотрим, как это выглядит на практике:
// Настройка защищенного соединения для игнорирования ошибок SSL
Защита = Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКлиентаWindows(),
Новый ВалидацияСертификатаДомена() // Здесь можно настроить проверку
);
// Создание соединения (аналог WinHttp)
Соединение = Новый HTTPСоединение(
ПараметрыПодключения.Сервер,
443,
ПараметрыПодключения.Пользователь,
ПараметрыПодключения.Пароль,
,
30,
Защита
);
Запрос = Новый HTTPЗапрос("/feedback/uc/i.php?data=" + ТекстЗапроса);
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
РезультатТекст = Ответ.ПолучитьТелоКакСтроку();
КонецЕсли;
Использование ЗащищенноеСоединениеOpenSSL полностью заменяет манипуляции со свойством Option(4)=13056 в WinHttp. Этот код будет работать одинаково хорошо и на 32-битном клиенте, и на 64-битном сервере, и даже на Linux-серверах 1С, где COM-объекты в принципе недоступны.
Резюмируем: если вам нужно срочное решение для старой обработки — используйте настройку приложения COM+. Если вы планируете долгосрочную поддержку решения — переходите на нативный объект HTTPСоединение.