Использование объекта Microsoft Script Control в среде 1С:Предприятие v7.7

25.08.06

Разработка - Универсальные функции

Исполнение кода VBScript или JScript в среде 1С:Предприятие v7.7
Оригинал статьи находится здесь: http://www.script-coding.info/MSScriptControl.html .

Объект 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;
	КонецПопытки;
	Возврат Рез;
КонецФункции //КвКорень

См. также

Библиотека процедур и функций для технологической платформы "1С: Предприятие 7.7"

Универсальные функции Платформа 1С v7.7 Россия Абонемент ($m)

В библиотеку собраны различные функции по работе с документами, журналами, типами данных, строками, датой и временем, таблицами значений, Excel, файлами, XML, JSON, Http-сервисами, SMTP серверами и т.п.

1 стартмани

22.12.2023    657    9    user706545_kseg1971    0    

4

1С 7.7 и новый 1С:Контрагент

Универсальные функции Платформа 1С v7.7 Конфигурации 1cv7 Россия Бесплатно (free)

Получение реквизитов контрагентов из 1С:Контрагент для старых конфигураций под 1с 7.7.

25.04.2022    1820    zhenyat    7    

6

Печать таблицы значений в 1С 7.7 при отладке

Универсальные функции Платформа 1С v7.7 Россия Бесплатно (free)

Функция выводит таблицу значений в табличный документ. (v7.7) Особенно полезно при отладке. Не нужно вносить изменения в код, вызываем функцию как вычисляемое выражение при останове. Если таблица обрабатывается в несколько этапов, можно вывести её после каждого и визуально проследить эволюцию.

30.06.2021    4399    Zoltan_Black    11    

2

Установка принтера по умолчанию для 1С 7.7

Универсальные функции Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Установка принтера по умолчанию в 1С 7.7. Обработка может быть полезна в том случае, когда нужно установить принтер по умолчанию, а доступа к рабочему столу нет (например, терминальный режим без рабочего стола или remoteApp)

1 стартмани

13.02.2019    13286    4    alsen    3    

4

Формирование строки json в 1С: 7.7

Универсальные функции Платформа 1С v7.7 Конфигурации 1cv7 1С:Комплексная 7.7 Абонемент ($m)

Предлагается набор функций 1с 7.7 для формирования строки json стандартными средствами.

1 стартмани

10.12.2018    10094    malovandrey    2    

18

Как создать индикатор в 1С:Предприятии 7.7

Универсальные функции Работа с интерфейсом Платформа 1С v7.7 Конфигурации 1cv7 Россия Абонемент ($m)

В статье дано описание создания индикатора на форме в среде разработки 1С:Предприятие 7.7 исключительно типовыми средствами.

1 стартмани

27.09.2016    18672    2    HAMMER_59    6    

2
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. alex_bob 246 11.09.06 15:31 Сейчас в теме
Минус подобного подхода - сложность отладки кодов на VBScript/JScript. Можно конечно заранее отлаживать в файле и потом вставлять, но гемор остается. Кроме того, надо быть уверенным, что у всех в сети нужная версия WScript/
2. support 4484 26.08.06 09:27 Сейчас в теме
3. mdzen 238 26.08.06 09:58 Сейчас в теме
В тему. +1 Боролся с передачей параметров из АктивИкса WebBrowser. На форумах предлагался вариант использования события TitleChange - все работало пока в WebBrowser не передавалась команда JScript - после исполнения команды TitleChange отказывается срабатывать. Проблема решилась с использованием свойств JScript и VBScript . Поэксперементировав с VBScript и JScript можн сделать вывод, что при использовании VBScript и JScript и добавив 1С++ в 1С 7.7 можно делать чудные вещи, ничем не уступающие "восьмерке".
4. The gray Cardinal 117 26.08.06 12:40 Сейчас в теме
Я так понял, мне немного помогли с публикацией :) Изначально страничка со статьёй "разъехалась" вширь (из-за табов в примерах кода, видимо). В чём секрет?
5. support 4484 26.08.06 13:57 Сейчас в теме
Это была общая проблема на сайте, в связи с переездом, затерли таблицу стилей, в которой код показывался маленьким шрифтом, и фиксированной ширины. Сейчас восстановили.
6. O-Planet 6431 27.08.06 00:57 Сейчас в теме
+1 Люблю такие статьи. Вот, блин! Кто бы первый выложил толковую статью "для чайников" по ВК?
7. metaeditor 944 01.09.06 23:19 Сейчас в теме
помнится на Т1С с полгода назад был целый бум по скриптконтролу... чеготолько нанём неделали )
а про ВК читаем какобычно воттут,
http://effes.fatal.ru/manual/tsvk/tsvk00.html
8. karat60 07.09.06 20:02 Сейчас в теме
+1, теперь с восьмеркой погодИм
9. artbear 1448 28.01.10 09:37 Сейчас в теме
(0) Забыл упомянуть, что можно добавлять собственные объекты для кода скрипта через AddObject - очень удобно.
10. artbear 1448 28.01.10 11:34 Сейчас в теме
В восьмерке код
Код
ScrptCtrl=Новый COMОбъект("MSScriptControl.ScriptControl");
      ScrptCtrl.Language="vbscript";
      ScrptCtrl.AddCode("
      |Function GetSqr(x)
      |   GetSqr = Sqr(x)
      |End Function
      |");
      Рез=ScrptCtrl.Modules("Global").CodeObject.GetSqr(15);
// или вариант      Рез=ScrptCtrl.Modules.Item(1)..CodeObject.GetSqr(15);
Сообщить("Рез = <"+?(Рез = Неопределено, "Неопределено", Рез)+">");       
Показать полностью

не работает:
функция не найдена GetSqr :(
пока не удалось решить эту проблему и в результате непонятно, как вызывать функции :(
11. alex_bob 246 10.02.10 16:31 Сейчас в теме
Например, так:
Рез=ScrptCtrl.Eval("GetSqr("+Строка(15)+")");
Оставьте свое сообщение