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

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

При работе с внешними обработками, особенно теми, которые используют интеграцию с внешними сервисами (например, Эвотор или веб-сайты), разработчики часто сталкиваются с ошибкой: «Ошибка при вызове конструктора (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-битном режиме, они физически не могут напрямую «увидеть» и создать этот объект, даже если библиотека зарегистрирована в системе. Это и вызывает ошибку «Класс не зарегистрирован».

Выясняем причины: Разница в разрядности (32 vs 64 бит)

Главная причина кроется в архитектуре Windows. В 64-битных версиях ОС реестр и системные папки разделены:

  1. C:\Windows\System32 — здесь хранятся 64-битные системные файлы.
  2. C:\Windows\SysWOW64 — здесь хранятся 32-битные системные файлы.

Когда вы запускаете 64-битную версию 1С, она ищет COM-классы в 64-битной ветке реестра. Поскольку msscript.ocx существует только в 32-битном варианте, поиск завершается неудачей. Интересно, что старая версия обработки может работать, если она запускается на клиенте (который может быть 32-битным), а новая версия пытается выполниться в серверном контексте (который на 99% 64-битный).

Решение №1: Использование «Служб компонентов» (COM+)

Это самый надежный и правильный способ заставить 64-битную 1С работать с 32-битным COM-объектом. Мы создадим специальную «оболочку», которая будет выступать мостом между разными архитектурами. Рассмотрим этот процесс по шагам:

  1. Откройте Панель управления —> Администрирование —> Службы компонентов (или нажмите Win+R и введите comexp.msc).
  2. В дереве консоли перейдите: Компьютеры —> Мой компьютер —> Приложения COM+.
  3. Нажмите правой кнопкой на «Приложения COM+» и выберите Создать —> Приложение.
  4. В мастере создания выберите Создать новое приложение. Введите имя, например, 1C_MSScript. Установите флаг Серверное приложение.
  5. На вкладке «Удостоверение» (Identity) укажите пользователя, под которым будет запускаться этот объект. Лучше всего выбрать Локальная служба (Local Service) или конкретного системного пользователя с достаточными правами.
  6. После создания приложения раскройте его ветку, нажмите правой кнопкой на папку Компоненты —> Создать —> Компонент.
  7. Выберите Установка новых компонентов и найдите файл C:\Windows\SysWOW64\msscript.ocx.
  8. Завершите мастер. Теперь система создала специальный процесс dllhost.exe, который будет пробрасывать вызовы из 64-битной среды в 32-битную.

После этой настройки перезапустите сервер 1С, и ошибка должна исчезнуть.

Решение №2: Правильная регистрация библиотеки через regsvr32

Если вы уверены, что используете 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"

Решение №3: Проверка безопасного режима

Проанализируем еще одну возможную причину. Если внешняя обработка запускается через справочник «Дополнительные отчеты и обработки», в настройках ее регистрации часто стоит флаг «Безопасный режим».

В безопасном режиме 1С блокирует создание любых COM-объектов в целях безопасности. Чтобы решить проблему, попробуйте:

  1. Зайти в карточку регистрации обработки.
  2. Снять галочку «Безопасный режим» или перевести ее в режим «Запрашивать разрешения».
  3. Если используется механизм БСП (Библиотека стандартных подсистем), необходимо нажать кнопку «Настроить разрешения» и разрешить использование COM-объектов.

Рекомендуемая альтернатива: Отказ от COM в пользу нативных методов 1С

Разберем ситуацию более глобально. Использование 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Соединение.

← На главную