Добавление поддержки VBScript и JScript - расширяем возможности 1С
Поиск подходящего COM-объекта
Необходимо было получить текущее время на сервере с точностью до миллисекунд. К сожалению платформа 1С вообще не знает что такое миллисекунды, у неё там свои моменты времени. Подходящего COM-объекта я не обнаружил, но на сайте MSDN нашел интересную технологию MS Script Control. Данная технология позволяет исполнять код в своем приложении на языке Visual Basic или JavaScript, то есть в 1С у нас развязываются руки и мы получаем инструмент для работы с системной информацией операционной системы WINDOWS: получить информацию о железе компьютера, записать параметр в реестр и т.д.
Что бы воспользоваться технологией MS Script Control, необходимо создать COM-объект с именем класса MSScriptControl.ScriptControl.1. На рисунке приведен ProgID (он же имя класса) в редакторе реестра:
![]() |
ProgID нужного COM-объекта |
Script = Новый COMОбъект("MSScriptControl.ScriptControl.1");
Свойства объекта
- AllowUI - булево, при установке Истина будут выводиться элементы пользовательского интерфейса, например MsgBox;
- CodeObject - коллекция, возвращает набор объектов, созданных с помощью метода AddObject;
- Error - объект Error, содержит информацию об ошибке в скрипте, по-умолчанию объект пустой;
- Language - строка, содержит язык скрипта, на котором будет исполняться код: VBScript или JScript;
- Modules - коллекция, содержит набор модулей;
- Procedures - коллекция, содержит набор процедур;
- SitehWnd - ссылка, дескриптор окна программы, которое будет использоваться для отображения графического интерфейса пользователя;
- State - число, описывает, как будут обрабатываться события объектов, добавленные с помощью метода AddObject, по-умолчанию 0;
- Timeout - число, максимальное время исполнения скрипта в миллисекундах, по истечению которого будет сгенерирована ошибка, по-умолчанию 10000;
- UseSafeSubset - булево, при установке Истина скрипт выполняется в безопасном режиме, по-умолчанию Ложь. Используйте это свойство, если скрипт может нанести вред вашему компьютеру.
Методы объекта
- AddCode - добавляет код, процедуру или функцию в объект ScriptControl;
- AddObject - добавляет объект, который доступен в скрипте. Вряд ли в 1С этот метод будет активно использоваться;
- Eval - выполняет программный код и возвращает результат выполнения. Можно выполнять произвольный код, а так же функции, добавленные с помощью метода AddCode;
- ExecuteStatement - выполняет одну инструкцию (процедуру или фнкцию), урезанная версия метода Run, так как нельзя передавать аргументы;
- Reset - реинициализирует обработчик сценариев ScripControl (сбрасывает все значения), как будто вы его только что создали;
- Run - выполняет указанную процедуру или функцию, добавленную с помощью метода AddCode и возвращает результат выполнения;
Пример использования
В принципе, выше перечисленной информации хватит, что бы реализовать универсальную функцию выполнения скриптов на языках VBScript и JScript. Параметры нашей функции будут такими:
- ЯзыкСкрипта - строка, язык, на котором будет исполняться код;
- КодФункции - строка, функция, написанная на скриптовом языке;
- ИмяФункции - строка, имя функции, которую передаем через параметр КодФункции;
- Параметры - массив, значения параметров функции.
Возвращать функция конечно же будет результат выполнения скрипта. Что ж, приступим к реализации:
// Функция выполняет скрипт на языке VBScript или JScript.
//
// Параметры
// ЯзыкСкрипта - Строка - "VBScript" или "JScript";
// КодФункции - Строка - код функции на языке скрипта;
// ИмяФункции - Строка - имя выполняемой функции;
// ПараметрыФункции - массив - параметры выполняемой функции;
//
// Возвращаемое значение
// Произвольный - результат выполнения функции.
//
Функция ВыполнитьСкрипт(ЯзыкСкрипта, КодФункции, ИмяФункции, ПараметрыФункции = Неопределено)
Script = Новый COMОбъект("MSScriptControl.ScriptControl.1");
Script.Language = ЯзыкСкрипта;
СтрокаПараметров = "";
Если ПараметрыФункции <> Неопределено Тогда
Для Индекс = 0 По ПараметрыФункции.Количество() - 1 Цикл
СтрокаПараметров = СтрокаПараметров + ",ПараметрыФункции[" + Строка(Индекс) + "]";
КонецЦикла;
КонецЕсли;
СтрокаВызова = "ВозвращаемоеЗначение = Script.Run(""" + ИмяФункции + """" + СтрокаПараметров + ")";
ВозвращаемоеЗначение = Неопределено;
Попытка
Script.AddCode(КодФункции);
Выполнить(СтрокаВызова);
Исключение
ГдеОшибка = "{" + Script.Error.Line + ", " + Script.Error.Column + "}";
КакаяОшибка = Script.Error.Source + ": " + Script.Error.Description;
Если Не ПустаяСтрока(Script.Error.Text) Тогда
КакаяОшибка = КакаяОшибка + " (" + Script.Error.Text + ")";
КонецЕсли;
ВызватьИсключение ГдеОшибка + " " + КакаяОшибка;
КонецПопытки;
Возврат ВозвращаемоеЗначение;
КонецФункции // ВыполнитьСкрипт()
Код функции простой, используется два метода объекта ScriptControl - это AddCode и Run, а так же указывается язык скрипта. Пример вызова функции, которая прибавляет один день к текущей дате:
КодФункции =
"Function Tomorrow(CurDate)
|
| Tomorrow = DateAdd(""d"", 1, CurDate)
|
|End Function";
мПараметры = Новый Массив;
мПараметры.Добавить(ТекущаяДата());
РезультатВыплнения = ВыполнитьСкрипт("vbscript", КодФункции, "Tomorrow", мПараметры);
Сообщить(РезультатВыплнения);
ScriptControl = Новый COMОбъект("MSScriptControl.ScriptControl.1")
ОтветитьУдалить--\/--
Ошибка при вызове конструктора (COMОбъект): Интерфейс не поддерживается: Интерфейс не поддерживается
--/\--
как победить? Win7x64Prof_Sp1, установлен c:\Windows\SysWOW64\msscript.ocx
1c_8.2.19.130
https://osergey.ru/ru/call-32-bit-com-objects-to-side-64-bi/#more-508
ОтветитьУдалить