При работе с платформой 1С:Предприятие версии 8.3 на 64-битном сервере, мы часто сталкиваемся с необходимостью использования сторонних COM-объектов. Одним из таких объектов является MSScriptControl.ScriptControl, который предоставляет функциональность для выполнения скриптов на VBScript или JScript прямо из кода 1С. Однако, поскольку MSScriptControl.ScriptControl является 32-разрядным компонентом, его прямое использование в 64-битной среде сервера 1С вызывает ошибку "Класс не зарегистрирован" (0x80040154).
Давайте разберемся, почему возникает эта проблема и как мы можем ее преодолеть. Основная причина заключается в несовместимости разрядности: 64-битное приложение (сервер 1С) не может напрямую загрузить 32-битную библиотеку (msscript.ocx). Для успешного взаимодействия требуются специальные механизмы, которые позволяют 64-битному процессу общаться с 32-битным компонентом.
Мы рассмотрим два основных подхода к решению этой проблемы: использование обертки с помощью Служб компонентов (COM+) и установку 64-битного аналога компонента MSScriptControl.ScriptControl. Каждый из этих подходов имеет свои особенности и преимущества, которые мы подробно проанализируем.
Этот метод позволяет нам заставить 32-битный компонент работать в 64-битной среде, создав специальное COM+ приложение. COM+ приложение будет выступать в роли "суррогатного" 32-битного процесса, в котором будет запускаться наш MSScriptControl.ScriptControl. Сервер 1С (64-бит) будет взаимодействовать с этим суррогатным процессом через межпроцессное взаимодействие (IPC), обеспечивая корректную работу.
Перед тем как приступить к настройке COM+, убедимся, что MSScriptControl.ScriptControl корректно зарегистрирован в 32-разрядном системном реестре. Обычно это делается следующей командой:
regsvr32 C:\Windows\SysWOW64\msscript.ocx
Убедившись в регистрации, перейдем к шагам настройки Служб компонентов.
%windir%\system32\comexp.msc в строке "Выполнить" (Win+R) или найдя ее в "Средствах администрирования".Приложения COM+ кликаем правой кнопкой мыши и выбираем Создать -> Приложение.Создать новое приложение.1С_ScriptControl. Очень важно выбрать способ активации: Серверное приложение. Это гарантирует, что компонент будет запускаться в отдельном процессе, что критично для 32/64-битного взаимодействия.Локальная служба — это встроенная учетная запись службы. Она обычно обладает достаточными правами для работы с системными компонентами.CreatorOwner, помимо существующих учетных записей, мы обязательно должны добавить System и учетную запись, под которой работает сервер 1С. Это может быть учетная запись пользователя, если сервер запущен под ней, или встроенная учетная запись, если это стандартная установка. Также мы можем добавить группу Пользователи, чтобы любой пользователь мог обращаться к этой компоненте через COM. Это крайне важный шаг для обеспечения доступа сервера 1С к нашему новому COM+ приложению.MSScriptControl:
1С_ScriptControl переходим на Компоненты.Компоненты и выбираем Создать -> Компонент.Импорт уже зарегистрированных компонентов.32 разряда. Это позволит мастеру найти и импортировать 32-битный MSScriptControl. Мы увидим в списке MSScriptControl.ScriptControl. Выбираем его и завершаем мастер.После выполнения этих шагов наше COM+ приложение готово. Сервер 1С теперь сможет успешно создавать COMОбъект("MSScriptControl.ScriptControl"), который будет фактически работать внутри 32-битного процесса, управляемого COM+.
Если нам не хочется заниматься настройкой COM+ или нужна более простая установка, мы можем воспользоваться 64-битным аналогом MSScriptControl.ScriptControl, который называется Tablacus Script Control 64 (TSC64). Этот компонент разработан сторонними разработчиками и предоставляет ту же функциональность, но скомпилирован как 64-битная библиотека. Это позволяет 64-битному серверу 1С напрямую использовать компонент без необходимости в COM+ обертке.
tsc64.dll. Рекомендуется искать этот компонент на надежных ресурсах или в репозиториях, предоставляемых разработчиками.tsc64.dll мы можем поместить в системную папку, например, C:\Windows\System32 (для 64-битных DLL) или в любую другую папку, которая находится в системной переменной PATH.regsvr32. Запускаем командную строку (cmd) от имени администратора и выполняем следующую команду:
regsvr32 tsc64.dll
После успешной регистрации tsc64.dll, сервер 1С сможет напрямую создавать COM-объект, используя то же имя класса, что и для оригинального MSScriptControl.ScriptControl, а именно "MSScriptControl.ScriptControl".
Важное замечание о безопасности: При использовании сторонних компонентов, таких как Tablacus Script Control 64, всегда существует риск. Некоторые антивирусные программы могут обнаруживать в нем потенциально нежелательное или вредоносное ПО (например, HEUR:Trojan.Script.SAgent.gen). Это может быть ложным срабатыванием из-за его способности выполнять скрипты, но мы должны быть осторожны. Всегда скачиваем подобные компоненты из надежных источников и проверяем их актуальным антивирусным ПО. Если возникают сомнения, использование COM+ обертки для оригинального MSScriptControl.ScriptControl может быть более безопасным и контролируемым вариантом.
Независимо от выбранного метода решения, код 1С для работы с объектом MSScriptControl.ScriptControl останется прежним. Рассмотрим пример, который демонстрирует получение имени принтера по умолчанию (быстро подготовить каркас подобных функций поможет Консоль кода + ИИ-помощник):
scrptCtrl = Новый COMОбъект("MSScriptControl.ScriptControl");
scrptCtrl.language = "vbscript";
scrptCtrl.addcode("
|Function GetDefaultPrinter
| GetDefaultPrinter = vbNullString
| Set objWMIService = GetObject(""winmgmts:"" _
| & ""{impersonationLevel=impersonate}!\\\\.\\root\\cimv2"")
| Set colInstalledPrinters = objWMIService.ExecQuery _
| (""Sel ect * fr om Win32_Printer"")
| For Each objPrinter In colInstalledPrinters
| If objPrinter.Attributes And 4 Then
| GetDefaultPrinter = objPrinter.Name
| Exit For
| End If
| Next
|End Function
");
ПринтерПоУмолч = scrptCtrl.run("GetDefaultPrinter");
Возврат ПринтерПоУмолч;
В этом примере мы:
MSScriptControl.ScriptControl.vbscript.GetDefaultPrinter. Эта функция использует WMI (Windows Management Instrumentation), подобно тому как процессор схемы запроса работает со структурами данных, для запроса списка установленных принтеров и определения принтера по умолчанию.GetDefaultPrinter с помощью метода run() объекта ScriptControl и получаем результат.Данный подход позволяет нам выполнять различные скриптовые задачи, используя всю мощь VBScript или JScript (или даже расширяя 1С кодом на C#), прямо из серверного кода 1С.
При возникновении проблем с любым из предложенных решений, мы можем предпринять следующие шаги для отладки:
tsc64.dll. Для COM+ это включает права на активацию и запуск приложения.msscript.ocx (для COM+) или tsc64.dll (для 64-битного аналога) с помощью команды regsvr32.regsvr32 (из SysWOW64) и 64-битную DLL 64-битным regsvr32 (из System32). Хотя в данном случае regsvr32 сам определяет, какой версии регистрировать компонент, стоит помнить о разнице.Выбор конкретного решения зависит от требований к производительности, сложности скриптов и уровня безопасности, который мы готовы принять. Использование COM+ обертки обеспечивает высокую стабильность и совместимость с оригинальным компонентом, в то время как Tablacus Script Control 64 предлагает более прямолинейный и простой способ интеграции для 64-битных систем.
Мы успешно рассмотрели и проанализировали основные подходы к решению проблемы запуска 32-битного COM-объекта MSScriptControl.ScriptControl на 64-битном сервере 1С:Предприятия. Надеемся, что эти инструкции помогут вам эффективно интегрировать скриптовую функциональность в ваши серверные решения 1С.