Добавление поддержки 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");

Свойства объекта



  1. AllowUI - булево, при установке Истина будут выводиться элементы пользовательского интерфейса, например MsgBox;
  2. CodeObject - коллекция, возвращает набор объектов, созданных с помощью метода AddObject;
  3. Error - объект Error, содержит информацию об ошибке в скрипте, по-умолчанию объект пустой;
  4. Language - строка, содержит язык скрипта, на котором будет исполняться код: VBScript или JScript;
  5. Modules - коллекция, содержит набор модулей;
  6. Procedures - коллекция, содержит набор процедур;
  7. SitehWnd - ссылка, дескриптор окна программы, которое будет использоваться для отображения графического интерфейса пользователя;
  8. State - число, описывает, как будут обрабатываться события объектов, добавленные с помощью метода AddObject, по-умолчанию 0;
  9. Timeout - число, максимальное время исполнения скрипта в миллисекундах, по истечению которого будет сгенерирована ошибка, по-умолчанию 10000;
  10. UseSafeSubset - булево, при установке Истина скрипт выполняется в безопасном режиме, по-умолчанию Ложь. Используйте это свойство, если скрипт может нанести вред вашему компьютеру.


Методы объекта



  1. AddCode - добавляет код, процедуру или функцию в объект ScriptControl;
  2. AddObject - добавляет объект, который доступен в скрипте. Вряд ли в 1С этот метод будет активно использоваться;
  3. Eval - выполняет программный код и возвращает результат выполнения. Можно выполнять произвольный код, а так же функции, добавленные с помощью метода AddCode;
  4. ExecuteStatement - выполняет одну инструкцию (процедуру или фнкцию), урезанная версия метода Run, так как нельзя передавать аргументы;
  5. Reset - реинициализирует обработчик сценариев ScripControl (сбрасывает все значения), как будто вы его только что создали;
  6. Run - выполняет указанную процедуру или функцию, добавленную с помощью метода AddCode и возвращает результат выполнения;


Пример использования


В принципе, выше перечисленной информации хватит, что бы реализовать универсальную функцию выполнения скриптов на языках VBScript и JScript. Параметры нашей функции будут такими:

  1. ЯзыкСкрипта - строка, язык, на котором будет исполняться код;
  2. КодФункции - строка, функция, написанная на скриптовом языке;
  3. ИмяФункции - строка, имя функции, которую передаем через параметр КодФункции;
  4. Параметры - массив, значения параметров функции.

Возвращать функция конечно же будет результат выполнения скрипта. Что ж, приступим к реализации:

// Функция выполняет скрипт на языке 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", мПараметры);

Сообщить(РезультатВыплнения);


Комментарии

  1. ScriptControl = Новый COMОбъект("MSScriptControl.ScriptControl.1")
    --\/--
    Ошибка при вызове конструктора (COMОбъект): Интерфейс не поддерживается: Интерфейс не поддерживается
    --/\--
    как победить? Win7x64Prof_Sp1, установлен c:\Windows\SysWOW64\msscript.ocx
    1c_8.2.19.130

    ОтветитьУдалить
  2. https://osergey.ru/ru/call-32-bit-com-objects-to-side-64-bi/#more-508

    ОтветитьУдалить

Отправить комментарий