Объект Microsoft Script Control
Объект Microsoft Script Control в среде 1С:Предприятие v7.7 может быть создан следующим образом:
ScrCtrl = СоздатьОбъект("MSScriptControl.ScriptControl");
После этого вы можете вызывать и использовать методы и свойства этого объекта.
Объект позволит исполнить любой код на VBScript или JScript. Может быть очень полезен, если нужно исполнить код, который не может быть исполнен непосредственно в 1С:Предприятии. Например:
[+] Для работы с некоторыми OLE-объектами (например, при работе с технологией WMI - образцы кода см. ниже) нужно использовать функцию "GetObject". Этой функции нет во встроенном языке 1С:Предприятие v7.7, но используя Microsoft Script Control, вы сможете работать с ней.
[+] Не все методы и свойства различных OLE-объектов корректно работают непосредственно в 1С:Предприятии v7.7. Иногда не удаётся передать или получить какой-то параметр, т.к. не поддерживается тот или иной тип данных. С помощью Microsoft Script Control эти проблемы решаются.
[+] В VBScript и JScript есть функции, которых нет во встроенном языке 1С:Предприятие v7.7 (например, функция, вычисляющая квадратный корень числа). Используя Microsoft Script Control, вы сможете полноценно работать с этими функциями.
[+] 1С:Предприятие v7.7 не всегда корректно работает с объектами так называемых "коллекций", которые могут быть возвращены различными свойствами и методами тех или иных OLE-объектов. Используя Microsoft Script Control, вы сможете полноценно работать с любыми коллекциями, например, с помощью цикла "for each", которого нет во встроенном языке 1С:Предприятие v7.7.
Полное описание объекта на английском языке можно скачать вместе с его дистрибутивом с сайта Microsoft. При этом, если у вас не слишком старая версия Windows, ничего устанавливать вам скорее всего вообще не придётся. Описание свойств и методов объекта на русском языке в формате синтакс-помощника 1С:Предприятие v7.7 (als-файл) вы можете скачать здесь: http://www.script-coding.info/Automation.zip . Скопируйте ALS-файл в каталог программы (например, "C:\Program Files\1Cv77\BIN\"), и в конфигураторе в синтакс-помощнике появится ветка "Некоторые объекты Automation". CHM-файл справки на русском языке по встроенным константам и функциям языка VBScript вы можете скачать здесь: http://www.script-coding.info/wsh_chm.zip . Примеры работы с объектом Microsoft Script Control вы можете также получить, рассмотрев код маленькой конфигурации для 1С:Предприятия v7.7 "Администратор 1С", которую вы можете скачать на этой страничке: http://www.script-coding.info/filez.html .
Примеры работы
Функция читает список компьютеров, зарегистрированных в доменах локальной сети, и возвращает таблицу значений с колонками "Домен" и "Компьютер":
Функция глПолучитьКомпьютеры() Экспорт ТаблЗнач=СоздатьОбъект("ТаблицаЗначений"); ТаблЗнач.НоваяКолонка("Домен"); ТаблЗнач.НоваяКолонка("Компьютер"); Попытка ScrptCtrl=СоздатьОбъект("MSScriptControl.ScriptControl"); ScrptCtrl.Language="vbscript"; ScrptCtrl.AddCode(" |Function GetComputers() | Set WinNT = GetObject(""WinNT:"") | WinNT.Filter = Array(""domain"") | strInfo=vbNullString | For Each Domain In WinNT | Set ADSI = GetObject(""WinNT://"" & Domain.Name) | ADSI.Filter = Array(""computer"") | For Each Comp In ADSI | strInfo=strInfo & Domain.Name & vbTab & Comp.Name & vbCrLf | Next | Next | GetComputers = strInfo |End Function |"); Текст=СокрЛП(ScrptCtrl.Run("GetComputers")); Исключение Сообщить(ОписаниеОшибки()); Возврат ТаблЗнач; КонецПопытки; Для ы=1 по СтрКоличествоСтрок(Текст) Цикл СтрКомп=СтрПолучитьСтроку(Текст,ы); Разд=Найти(СтрКомп,СимволТабуляции); Домен=Лев(СтрКомп,Разд-1); Компьютер=Прав(СтрКомп,СтрДлина(СтрКомп)-Разд); ТаблЗнач.НоваяСтрока(); ТаблЗнач.Домен=Домен; ТаблЗнач.Компьютер=Компьютер; КонецЦикла; ТаблЗнач.Сортировать("Домен,Компьютер"); Возврат ТаблЗнач; КонецФункции //глПолучитьКомпьютеры
Функция читает список зарегистрированных информационных баз 1С из реестра Windows и возвращает таблицу значений с колонками "Название" и "Путь":
Функция глПолучитьСписокИБ() Экспорт ТаблЗнач=СоздатьОбъект("ТаблицаЗначений"); ТаблЗнач.НоваяКолонка("Название"); ТаблЗнач.НоваяКолонка("Путь"); Попытка ScrptCtrl=СоздатьОбъект("MSScriptControl.ScriptControl"); ScrptCtrl.Language="vbscript"; ScrptCtrl.AddCode(" |Function Get1CV77Titles() | const HKEY_CURRENT_USER = &H80000001 | Set oReg=GetObject(""winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv"") | strKeyPath = ""Software\1C\1Cv7\7.7\Titles"" | oReg.EnumValues HKEY_CURRENT_USER, strKeyPath, arrValues | strInfo=vbNullString | For i = LBound(arrValues) To UBound(arrValues) | call oReg.GetStringValue(HKEY_CURRENT_USER,strKeyPath,arrValues(i),Value) | strInfo=strInfo & arrValues(i) & vbTab & Value & vbCrLf | Next | Get1CV77Titles = strInfo |End Function |"); Текст=СокрЛП(ScrptCtrl.Run("Get1CV77Titles")); Исключение Сообщить(ОписаниеОшибки()); Возврат ТаблЗнач; КонецПопытки; Для ы=1 по СтрКоличествоСтрок(Текст) Цикл СтрБазы=СтрПолучитьСтроку(Текст,ы); Разд=Найти(СтрБазы,СимволТабуляции); Путь=Лев(СтрБазы,Разд-1); Название=Прав(СтрБазы,СтрДлина(СтрБазы)-Разд); ТаблЗнач.НоваяСтрока(); ТаблЗнач.Название=Название; ТаблЗнач.Путь=Путь; КонецЦикла; ТаблЗнач.Сортировать("Название"); Возврат ТаблЗнач; КонецФункции //глПолучитьСписокИБ
Процедура делает Log Off (Парам=4), Shutdown (Парам=5) или Reboot (Парам=6) выбранному компьютеру:
Процедура глViolateComputer(ИмяКомпа,Парам) Экспорт Попытка ScrptCtrl=СоздатьОбъект("MSScriptControl.ScriptControl"); ScrptCtrl.Language="vbscript"; ScrptCtrl.AddCode(" |Function ViolateComputer() | Set WMI = GetObject(""winmgmts:{(Shutdown,RemoteShutdown)}\\"+СокрЛП(ИмяКомпа)+"\Root\CIMV2"") | For Each OS In WMI.ExecQuery(""SELECT * FROM Win32_OperatingSystem"") | OS.Win32Shutdown("+Парам+") | Next |End Function |"); ScrptCtrl.Run("ViolateComputer"); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; КонецПроцедуры //глViolateComputer
Функция вычисляет квадратный корень числа:
Функция КвКорень(Чсл) Попытка ScrptCtrl=СоздатьОбъект("MSScriptControl.ScriptControl"); ScrptCtrl.Language="vbscript"; ScrptCtrl.AddCode(" |Function GetSqr(x) | GetSqr = Sqr(x) |End Function |"); Рез=ScrptCtrl.Modules("Global").CodeObject.GetSqr(Чсл); Исключение Сообщить(ОписаниеОшибки()); Возврат 0; КонецПопытки; Возврат Рез; КонецФункции //КвКорень