gifts2017

Работа с PowerShell в 1С

Опубликовал Xer shi (Xershi) в раздел Программирование - Практика программирования

Возможно, вам уже приходилось работать с PowerShell.
Но всегда этот процесс был где-то вдалеке от 1С!
Пора провести интеграцию PowerShell с 1С!
Хотите узнать как? Читайте дальше...

Windows PowerShell — расширяемое средство автоматизации от Microsoft, состоящее из оболочки с интерфейсом командной строки и сопутствующего языка сценариев.

На текущий момент я знаю пару способов работы в 1С с PowerShell:

1) Самый простой, это просто запустить написанный скрипт:

ЗапуститьПриложение(<СтрокаКоманды>, <ТекущийКаталог>, <ДождатьсяЗавершения>, <КодВозврата>) 

2) Установить бесплатный activex от sapien. И работать по COM. 

3) Использовать платную разработку

3а) Самому сделать web сервер и написать код в 1C для взаимодействия.

Рассматривать первый вариант мы не будем. Здесь нет программирования в принципе, но для начинающих программистов это единственный выход.

Использовать платную разработку я бы не стал, а самому делать web сервер нужно еще научиться.

Поэтому вариант с работой по COM идеальное решение!

Итак, с чего же начать! 

Вам понадобится пакет установки ActiveXPoshV3:

1) Для 32-битного клиента ActiveXPoshV3x86.exe

2) Для 64-битного сервера ActiveXPoshV3x64.exe

Если ссылки будут недоступны, то зайдите на официальный сайт, там точно они будут.

Или смотрите в архиве! Пароль: infostart.

Для работы на стороне клиента, т.е. в пользовательском режиме установите 32-битную версию. А для работы и на сервере, например в регламентном задании 64-битную версию.

Так же возможно вам придется зарегистрировать компоненты через regasm 32-битный в папке Framework , 64-битный в Framework64.

Примерно так:

regasm путь\ActiveXPoSH.dll /CODEBASE 

Далее для надежности перезагружаем сервер. Все, можно создавать COM-объект.

Важно! Не забывайте для корректной работы у вас должны быть соответсвующие права в системе!

Работа в 1С

Пример работы с компонентой описан в файле ActiveXposhV3.vbs. Этот файл будет находиться в папке, где вы установили ActiveXposh.

Прочитав код, можно написать в 1С примерно такое:

Перем ActiveXPosh;
Перем OUTPUT_CONSOLE;
Перем OUTPUT_WINDOW;
Перем OUTPUT_BUFFER; 

Процедура КнопкаВыполнитьНажатие(Кнопка)

    ListServices();
    
КонецПроцедуры

Процедура ПриЗакрытии()
	
	ActiveXPosh = "";

КонецПроцедуры

Процедура ПриОткрытии()
	
	Попытка
		
		ActiveXPosh = Новый COMОбъект("SAPIEN.ActiveXPoSHV3");
		ActiveXPosh.OutputMode = OUTPUT_BUFFER;
		success = ActiveXPosh.Init(False);  	
    
	    Если success <> 0 Тогда
	        Сообщить("Init failed");
	    КонецЕсли;
		
		Если ActiveXPosh.IsPowerShellInstalled Тогда
			Сообщить("Готов выполнять команды PowerShell");
	    Иначе
	    	Сообщить("PowerShell не установлена");
		КонецЕсли; 		
	    							
		Для Каждого Строка Из ActiveXPosh.Output Цикл 
		
			Сообщить(Строка);
			
		КонецЦикла;

	Исключение
		Сообщить("SAPIEN.ActiveXPoSHV3 не установлена!");	
	КонецПопытки;

КонецПроцедуры

Функция ListServices()
	
	ActiveXPosh.OutputMode = OUTPUT_BUFFER;
	//Можно изменить ширину
	//ActiveXPosh.OutputWidth = 400;
	
	//Пример команд
	ActiveXPosh.Execute("Get-WmiObject -class Win32_Service | Format-Table -property Name, State");
        	
	Для Каждого Строка Из ActiveXPosh.Output Цикл 
		
		Сообщить(Строка);
		
	КонецЦикла;     
	
    ActiveXPosh.ClearOutput();
	
КонецФункции 

OUTPUT_CONSOLE = 0;
OUTPUT_WINDOW = 1;
OUTPUT_BUFFER = 2;

Данная компонента поддерживает выполнение следующих команд: 
ClearOutput() - Этот метод очищает внутренний буфер вывода. 
Execute(strcommand) - Выполняет команду PowerShell или сценария. 
Eval(strExpression) - Вычисляет выражение PowerShell. 
Init(execProfile) - Первоначальный вызов экземпляра движка PowerShell. 
IsPowerShellInstalled - Возвращает Истина / Ложь. 
Output - Коллекция строк заполнены с выходом из PowerShell команды. 
OutputString - Содержание буфера вывода в виде одной строки. 
OutputMode - Устанавливает или получает режим вывода результата. 
OutputWidth - Задает или получает желаемую ширину выходного результата. 

Оригинал: 
ClearOutput() - This method clears the internal output buffer. 
Execute(strcommand) - Executes a PowerShell command or script. 
Eval(strExpression) - Evaluates a PowerShell expression. 
Init(execProfile) - Initial call to instantiate a PowerShell engine. 
IsPowerShellInstalled - Returns True/False. 
Output - A collection of strings filled with output from PowerShell commands. 
OutputString - The content of the output buffer as a single string. 
OutputMode - Sets or gets the current output mode. 
OutputWidth - Sets or gets the desired output width.

Обработка изнутри

Разработка представляет собой набор кода для работы PowerShell в 1С, используя компоненту "SAPIEN.ActiveXPoSHV3" через COM.

Особенностью разработки является возможность работы с удаленной командной консолью MS Exchange. Справка.

Это позволяет с сервера 1С подключиться к почтовому серверу MS Exchange и продолжить работу PowerShell на нем.

Так же в разработку встроен код универсального парсера CSV-файлов. Это помогает решить специфическую задачу, получения всех данных после выполнения сценария PowerShell в читаемой таблице 1С.

Т.е. что происходит. Вы написали сценарий PowerShell, результат выгрузили в файл CSV. И затем загрузили эти данные на экран в удобном виде. 

Благодарности

Особая благодарность пользователю cool.vlad4. Очень помог с первоначальной настройкой и примером кода.

Также выражаю благодарность всем толковым админам. Без вашей помощи запускать компоненты на сервере очень сложно!

Обновление от 09.11.2015

Улучшен интерфейс:

Добавлены реквизиты периода.

Для ознакомления добавлены кнопки для записи регистра сведений (заполнение измерений) и полной очистки самого регистра сведений.

Улучшен пример сценария на PowerShell.

Обновлен универсальный парсер CSV-файлов.

Скачать файлы

Наименование Файл Версия Размер
Работа с PowerShell 7
.epf 15,72Kb
09.11.15
7
.epf 2 15,72Kb Скачать
ActiveXPoshV3 6
.rar 1,60Mb
22.10.15
6
.rar 1,60Mb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Юрий Гончарук (yukon) 23.10.15 16:39
Использовать платную разработку я бы не стал, а самому делать web сервер нужно еще научиться.

Раз в деле PowerShell, то нет ничего проще:
$HttpListener = New-Object System.Net.HttpListener
$HttpListener.Prefixes.Add("http://localhost:8080/")
$HttpListener.Start() 
While ($HttpListener.IsListening) {
	$Context    = $HttpListener.GetContext()
	$Request    = $context.Request
	$Response   = $context.Response
	...
	$Response.StatusCode = 200
	$Response.Close()
}
$HttpListener.Stop()
...Показать Скрыть
2. Xer shi (Xershi) 23.10.15 19:04
(1) yukon, не совсем понял к чему этот код?
3. Юрий Гончарук (yukon) 26.10.15 12:50
(2) Xershi,
К тому, что веб-сервер в powershell поднимается в дюжину строк. Т.е. это решение проблемы "самому делать web сервер нужно еще научиться" в самом примитивном виде.
4. Xer shi (Xershi) 26.10.15 12:53
(3) yukon, так речь поднять веб сервер кодом 1С.
Чтобы он поднял powershell.

А ты я так понял предлагаешь обратную последовательность?