0. StepByStep 3282 11.12.12 09:07 Сейчас в теме

1С и Windows Script Host (WSH) и Windows Management Instrumentation (WMI). ОТ ТЕОРИИ К ПРАКТИКЕ. Часть I

Описание возможностей Windows Script Host и Windows Management Instrumentation.
Подборка "скриптовых" функций и процедур.

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
1. wunderland 200 12.12.12 17:36 Сейчас в теме
за примеры в контексте 1С - отдельное спасибо
7. StepByStep 3282 13.12.12 12:58 Сейчас в теме
(1) wunderland,
Пожалуйста. Главное - чтобы было полезно.
2. pumbaE 629 12.12.12 19:00 Сейчас в теме
Только не позволяет выполнять это все на linux.
3. q_i 381 13.12.12 12:07 Сейчас в теме
(2) pumbaE, хорошую тему для хорошей статьи обозначил! ;)
Интереса ради посмотрел - в 8.3 работает КомандаСистемы("sh -c """ + ТекстКоманды + """");
8. StepByStep 3282 13.12.12 13:01 Сейчас в теме
(2) pumbaE,
Linux - не проверялось. Работаю только в Windows.
4. pumbaE 629 13.12.12 12:12 Сейчас в теме
6. q_i 381 13.12.12 12:15 Сейчас в теме
(4) pumbaE, я не обещал готового рецепта ))) я лишь сказал что хорошая тема для проработки.
47. q_i 381 03.04.13 16:09 Сейчас в теме
(4) pumbaE, на сервере ЗапуститьПриложение().
5. q_i 381 13.12.12 12:13 Сейчас в теме
Вместо реализации задержки через ping имхо логичнее использовать WScript.Sleep(...).
9. StepByStep 3282 13.12.12 13:10 Сейчас в теме
(5) q_i,
Метод Sleep действительно существует у объекта WScript.
НО WScript существует только для скриптов, которые вызываются из командной строки,
Объект WScript нельзя получить, используя COMОбъект.
Следовательно надо создавать файл, скажем во временной папке, записать туда текст скрипта, а потом его выполнять, после этого - в общем случае - удалить этот файл.
10. q_i 381 13.12.12 14:44 Сейчас в теме
11. astonvilla 228 14.12.12 10:54 Сейчас в теме
Не знаю, пригодиться ли это, но не плюсануть за картинку не мог :))))))
ЧИА; StepByStep; +2 Ответить
17. StepByStep 3282 14.12.12 11:34 Сейчас в теме
(11) astonvilla,
Мне тоже картинка понравилась .........
57. ЧИА 161 15.02.14 08:17 Сейчас в теме
проснулся в 5 утра, полазил по сайту, через рекламу и косвенные ссылки попал сюда, решил сохранить, а вот коммент (11) astonvilla, вначале не понял.
пересмотрел внизу картинки, почесал голову, поработал, еще раз пересмотрел
догадался посмотреть вверху

ржал минут 5
плюсую
12. DMSDeveloper 127 14.12.12 11:11 Сейчас в теме
Для работы со скриптами на уровне COM Используется MSScriptControl.
В примере есть упоминание о нем.
&НаКлиентеНаСервереБезКонтекста
Функция ВремяВМиллисекундах()


Но тут есть одна проблема с которой я столкнулся и разрешить так и не смог.

При создании объекта на 64 битном сервере 1С (Именно 1С, не Win) - объект не создается, что то там с политиками безопасности от мелкомягких. Не все 32 битные COM-ы могут быть вызваны 64 битным приложением.
MSScriptControl - один из них :(
StepByStep; +1 Ответить
13. ediks 329 14.12.12 11:19 Сейчас в теме
Нисколько не уменьшая ценности публикации:
Еще больше примеров, правда на VB, на ресурсе Разработка скриптов
wowik; a.podobin; StepByStep; +3 Ответить
15. StepByStep 3282 14.12.12 11:32 Сейчас в теме
(13) ediks,
Спасибо. Надо будет посмотреть.
14. SeiOkami 1223 14.12.12 11:30 Сейчас в теме
Плюс!
Автор, спасибо за примеры в контексте 1С. Напиши, пожалуйста, статью с бОльшим количеством примеров =)
StepByStep; +1 Ответить
16. StepByStep 3282 14.12.12 11:33 Сейчас в теме
(14) SeiOkami,
Статья обязательно пополнится примерами.
Есть еще определенные "вещички" ...
18. KliMich 14.12.12 12:01 Сейчас в теме
Спасибо! Очень полезно! Хотелось бы продолжения (часть 2, часть 3 и т.д.).
20. StepByStep 3282 17.12.12 10:45 Сейчас в теме
(18) KliMich,
ЕСТЬ ПРОДОЛЖЕНИЕ !
19. Stamper 38 14.12.12 14:03 Сейчас в теме
однозначно плюс. жаль, нельзя второй поставить за картинку -- просто ураган :)
StepByStep; +1 Ответить
21. mzelensky 53 20.12.12 07:52 Сейчас в теме
22. zarucheisky 20.12.12 13:25 Сейчас в теме
Автору стоило бы знать что большинство, что понаписано реализуется самой платформой не хуже.
Да и есть старый, добрый
www.script-coding.com
Шёпот теней; +1 Ответить
23. StepByStep 3282 23.12.12 12:35 Сейчас в теме
(22) zarucheisky,
Определенные - да.
Ссылка на старый-добрый www.script-coding.com была ранее 13. ediks
24. StepByStep 3282 23.12.12 12:36 Сейчас в теме
Добавлена новая функция СетевоеОкружение().
25. StepByStep 3282 27.12.12 21:03 Сейчас в теме
Добавлены новые функции:
1. SetDateTime() - Установка системных Даты и Времени.
2. ControlPanelItem() - Вызов оснастки из Панели управления.
26. StepByStep 3282 09.01.13 09:37 Сейчас в теме
Добавлена функция, позволяющая получить список подключенных принтеров локального/удаленного компьютера.
27. StepByStep 3282 13.01.13 23:18 Сейчас в теме
Добавлены:
1. Функция, позволяющая информацию о BIOS локального/удаленного компьютера.
2. Функция, позволяющая получить Имя пользователя, зарегистрировавшегося на локальном/удаленном компьютере.
28. StepByStep 3282 17.01.13 16:03 Сейчас в теме
Добавлено пояснение по настройке и проверке работы Windows Management Instrumentation - Инструментарий управления Windows.
29. StepByStep 3282 24.01.13 11:56 Сейчас в теме
Добавлены 2 новые функции: ServerSession и ServerConnection.
30. yuraos 957 26.01.13 13:31 Сейчас в теме
Спасибо автору!
Недавно озадачился, как можно в 1с8.х засечь время выполнения в коде миллесекундах.
И вот нашел здесь один из способов.
31. yuraos 957 29.01.13 09:07 Сейчас в теме
(30)
еще раз спасибо - реально пригодилось!
теперь могу засекать время выполнения запросов с точностью до миллисекунды.
---
проблемка с другой процедуркой:
SendKeys(KEYS_ENG = "^+z", KEYS_RUS = "^+я")
Пытаюсь имитировать вызов на редактирование поля ввода в форме по клавише 'F4'
(смотри код ниже) - ничего выходит (тип редактируемого значения - "СписокЗначений").
Процедура SendKeys(KEYS_ENG = "^+z", KEYS_RUS = "^+я")
	Если ПустаяСтрока(KEYS_ENG) И ПустаяСтрока(KEYS_ENG) Тогда
		Возврат;
	КонецЕсли; 
    
    Попытка
        WshShell = Новый COMОбъект("Wscript.Shell");
		Если НЕ ПустаяСтрока(KEYS_ENG) Тогда
	        WshShell.SendKeys(KEYS_ENG);    // для случая, если текущей является английская раскладка клавиатуры.
		КонецЕсли; 
		Если НЕ ПустаяСтрока(KEYS_RUS) Тогда
	        WshShell.SendKeys(KEYS_RUS);    // для случая, если текущей является русская раскладка клавиатуры.
		КонецЕсли; 
        // SendKeys(String) - имитируется нажатие клавиши или последовательности клавиш, указанных в параметре String.
        // В качестве параметра можно указывать как алфавитно-цифровые символы, так и символы специальных клавиш, например:
        // "Enter", "Tab", "F1", "Alt", "Shift", "Ctrl" и т.д. 
        // Для указания клавиш "Alt", "Shift", "Ctrl" существуют специальные коды:
        // "Shift" - +;
        // "Ctrl" - ^;
        // "Alt" - %.
        // Если возникнет необходимость передать специальные символы именно как символы, а не команды, 
        // нужно заключать их в фигурные скобки, например {+}.   
	Исключение
		Сообщить(ОписаниеОшибки());
    КонецПопытки;

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

Процедура СписокНомеровПС_КонтМенюИзменить(Кнопка)
	Если ЭтаФорма.ТекущийЭлемент <> ЭлементыФормы.СписокНомеровПС Тогда
		ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.СписокНомеровПС;
	КонецЕсли;
	SendKeys("F4","F4");
КонецПроцедуры

Показать
32. StepByStep 3282 30.01.13 12:09 Сейчас в теме
(31) yuraos,
Пожалуйста. Рад, что Вам пригодилось.

По поводу Вашего вопроса:
Некоторые специальные символы следует всегда задавать заключёнными в фигурные скобки.
В частности и F4:
SendKeys("{F4}","{F4}");

Попробуйте.

Удачи.
33. yuraos 957 31.01.13 06:51 Сейчас в теме
(32)
у щайтан-скобка!
SendKeys("{F4}","{F4}") - проканало.
спасибо огромное!!!

А нет в Windows Script Host каких-нибудь объектов,
которые позволили бы в 1С через подписку на события
перехватывать обработку ввода с мыши и клавиатуры?
34. StepByStep 3282 06.02.13 13:07 Сейчас в теме
(33) yuraos,
WSH - это работа в командной строке.
И опции типа SendKeys - это скорее приятные полезности.
Ответ: нет.
39. yuraos 957 13.02.13 18:45 Сейчас в теме
(33)
иище раз о ВремяВМиллисекундах():
В каких ситуациях в функции может сработать исключение и
вместо миллисекунд функция вернет 1С-ное текущее время-дату ???

PS:
В своем варианте по исключению я возвращаю значение:
1000*(ТекущаяДата() - '1970-01-01:06:00:00')
как более подходящее по смыслу - округленное до целых секунд число миллисекунд.
06:00:00 - это наверное из-за разницы времени между Новосибирском и Гринвичем.
42. StepByStep 3282 16.02.13 15:26 Сейчас в теме
(39) yuraos,
В каких ситуациях в функции может сработать исключение и
вместо миллисекунд функция вернет 1С-ное текущее время-дату ???

При тестировании на 32-битных системах "Исключение" не вызывалось.
Возможно ситуация, описанная (12) DMSDeveloper.
35. StepByStep 3282 06.02.13 13:09 Сейчас в теме
Добавлены новые функции: Computer_Processor(), Computer_RAM(), Computer_TotalPhysicalMemory(), Computer_VirtualMemory().
36. StepByStep 3282 08.02.13 16:58 Сейчас в теме
Добавлены новые функции: Computer_Motherboard() и Computer_Video().
37. StepByStep 3282 13.02.13 00:31 Сейчас в теме
Добавлены функции Computer_UserList(), Computer_GroupList(), Computer_GroupUsersList(), Computer_BuildINAdministrator().
38. soli_M_x6 13.02.13 00:47 Сейчас в теме
40. Матрос 14.02.13 04:52 Сейчас в теме
41. OVladius 32 14.02.13 13:23 Сейчас в теме
43. StepByStep 3282 17.02.13 17:25 Сейчас в теме
Добавлены функции: Computer_SystemService(), Computer_SystemProcess(), Computer_EventsList()
44. StepByStep 3282 20.02.13 11:25 Сейчас в теме
Добавлены функции: Computer_KillProccess(), Computer_RebootShutdown().
45. StepByStep 3282 01.03.13 01:47 Сейчас в теме
Добавлена функция: Computer_PING(), позволяющая невизуально "пропинговать" удаленный компьютер.
46. StepByStep 3282 25.03.13 01:59 Сейчас в теме
Добавлена Функция Computer_Terminal(), позволяющая получить информацию о терминальных сессиях на сервере (локальный/удаленный компьютер).
48. slaviksoft 73 12.07.13 14:07 Сейчас в теме
при вызове Win32Shutdown с флагами отличными от 0 - ничего не происходит
или я что-то не так делаю

Пример:
 WinMGMT = ПолучитьCOMОбъект("winmgmts:\\.\root\cimv2");
        Win32_OS = WinMGMT.ExecQuery("SEL ECT * FR OM Win32_OperatingSystem where Primary=true");
        
        Reserved = 0;   // Зарезервированный параметр. Игнорируется.
        Для Каждого OS ИЗ Win32_OS Цикл
            OS.Win32Shutdown(6, Reserved);
        КонецЦикла;
StepByStep; +1 Ответить
49. StepByStep 3282 23.09.13 01:58 Сейчас в теме
(48) slaviksoft,
Какая у Вас операционка ?
51. StepByStep 3282 23.09.13 12:29 Сейчас в теме
(48) slaviksoft,
СПАСИБО.

Вместо строчки:
WinMGMT = ПолучитьCOMОбъект("winmgmts:\\.\root\cimv2"); 


Необходимо:
WinMGMT = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate,(Shutdown)}!\\" + Computer + "\root\cimv2");


Проверил на Windows XP x32 и Windows 7 x64.
50. StepByStep 3282 23.09.13 02:00 Сейчас в теме
23.09.2013 г.

Добавлены функции:

Computer_WindowsInfo()
Computer_Monitor()
Computer_PhysicalMemory()
52. echo77 1100 01.10.13 09:24 Сейчас в теме
Функция NetworkNeighborhood() ничего не возвращает в ОС старше Win-XP
StepByStep; +1 Ответить
53. StepByStep 3282 01.10.13 10:09 Сейчас в теме
(52) echo77,
Да. Вы правильно указали.
В обработке 1С:Администратор http://infostart.ru/public/172189/ получение сетевого окружения переработано и дополнено для Windows Vista и выше.
Позднее подправлю статью.
СПАСИБО.
54. StepByStep 3282 08.10.13 00:55 Сейчас в теме
07.10.2013.
Функция Computer_MAC_IP() заменена на функцию Computer_NetworkAdapter().
55. MarSeN 972 16.10.13 08:59 Сейчас в теме
StepByStep,
А в каком случае SendKey может использоваться на сервере? К процедуре указана директива &НаКлиентеНаСервереБезКонтекста.
Я там понимаю, что для сендкея обязательно нужно открытое окно приложения и тем более открытая сессия (нормальная сессия с рабочим столом и т.п.), а на сервере такого вроде 1С сервер не создает?
StepByStep; +1 Ответить
56. StepByStep 3282 20.10.13 15:51 Сейчас в теме
(55) MarSeN,
Согласен с Вами, "физического" смысла это не имеет.
58. Voittamaton 29.03.14 16:31 Сейчас в теме
Почему-то не получается отправить символы с цифровой клавиатуры.
Нижеперечисленные варианты (также без скобок "()") приводят к ошибке "Произошла исключительная ситуация (0x80070057)".

1)
Ws = Новый COMОбъект("Wscript.shell");
Ws.SendKeys("^+({Pad-})");


2)
Ws = Новый COMОбъект("Wscript.shell");
Ws.SendKeys("^+({Subtract})");
61. StepByStep 3282 14.01.15 12:59 Сейчас в теме
(58) Voittamaton,
SendKeys("^+{SUBTRACT}"); - Ошибки не вызвало.
59. mzelensky 53 09.07.14 17:52 Сейчас в теме
Доброго времени суток! Подскажите плиз. Юзаю одну из ваших функций

Computer_GroupUsersList(

Она возвращает имя группы и имя пользователя. Можно ли как-то получить "полное имя пользователя" ну или как это назвать ПРЕДСТАВЛЕНИЕ. Т.е. то Имя, которое отображается у пользователя, если нажать кнопку "Пуск". Например имя пользователя может быть "Zelensky" а полное имя "Зеленский Максим". Вот мне нужно как-то получить это полное имя.
60. StepByStep 3282 14.01.15 12:42 Сейчас в теме
(59) mzelensky,
Функция Computer_UserList() возвращает таблицу значений, в которой есть FullName.
62. StepByStep 3282 14.01.15 13:00 Сейчас в теме
14.01.2015.
Добавлена функция
ПреобразоватьИзСтрокиВДату() - Ф., возвращающая результат преобразования строкового значения даты в значение в формате даты.
63. simple 19.01.15 17:57 Сейчас в теме
64. CaSH_2004 355 18.09.16 22:13 Сейчас в теме
Подскажите кто сталкивался, как решить проблему такую: пытаюсь получить список пользователей на удаленном сервере, так вот с одними серверами происходит нормально, а на одном не выполняет даже инициализацию: ПолучитьCOMОбъект("winmgmts:\\" + Computer + "\root\cimv2");
сначала ругался "Ошибка получения объекта COM: Сервер RPC недоступен."
Почитал тут что брэндмауэр нужно настраивать, пробовал но не помогало и я его вообще отключил, теперь ругается "Ошибка получения объекта COM: Отказано в доступе."

65. _1c_coder 31 30.09.17 12:48 Сейчас в теме
Подскажите как с помощью даного скрипта емулировать нажатие на маленькой клавиатуре NUM + и NUM -

так ошибка http://prntscr.com/gri3o7
ОбъектShell = Новый COMОбъект("Wscript.Shell");
	ОбъектShell.SendKeys("{Add}");
ОбъектShell.SendKeys("{Subtract}");



нужно когда картинка активизирована на форме кнопкой УМЕНЬШИТЬ УВЕЛИЧИТЬ менять масштаб
просто нажатие + и - работает,
ПОМОГИТЕ ЗНАТОКИ!!!!!!!!!!!
66. forusing 44 21.02.19 13:21 Сейчас в теме
(65) Для тех, кто долго искал как программно "нажать" Ctrl+Shift+{+} (развернуть все ветки; актуально для таблицы формы, представленной в виде дерева по произвольному запросу с группировкой). Работает следующий код:
	objShell = Новый COMОбъект( "WScript.Shell" );
	objShell.SendKeys( "^+" + Символ( 107 ) );
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Специалист техподдержки 1С
Москва
зарплата от 80 000 руб. до 120 000 руб.
Полный день

Системный аналитик 1С
Москва
зарплата от 80 000 руб. до 120 000 руб.
Полный день

Программист 1С
Москва
зарплата от 100 000 руб. до 200 000 руб.
Полный день

Тестировщик 1С
Москва
зарплата от 70 000 руб.
Полный день

Технический лидер, архитектор 1С, руководитель проектов
Санкт-Петербург
зарплата от 150 000 руб.
Полный день