Реализация паузы выполнения кода, используя Wscript

19.06.13

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

Мне понадобилось реализовать паузу в одном алгоритме, и пауза должна была быть не более полусекунды.
Поиски в интернете особо не удались, т.к. варианты либо кривы, либо не совсем оптимальны.

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

Наименование Файл Версия Размер
sleep.vbs
.vbs 0,04Kb
21
.vbs 0,04Kb 21 Скачать

Начну с того, что я нашел и почему мне это не подошло. Мои требования были такими, необходимо было остановить выполнение кода на 0.1-0.5 секунды, клиент-серверный вариант работы, управляемые формы, тонкий клиент, пауза на клиентской части.

1) Первый вариант, который я нашел, был таким:

Процедура Спать(Время)
    Если Время = 0 Тогда
        Возврат
    КонецЕсли;
    Сигнатура = Формат(ТекущаяДата(), "ДФ=yyyyMMddhhmmss");
    ПутьСкрипта = КаталогВременныхФайлов()+"SleepScript"+Сигнатура+".vbs";
    СкриптФайл = Новый ТекстовыйДокумент;
    СкриптФайл.ДобавитьСтроку("WScript.Sleep("+Формат(Время*1000, "ЧГ=0")+")");
    СкриптФайл.Записать(ПутьСкрипта, КодировкаТекста.OEM);
    WSHShell = Новый COMОбъект("WScript.Shell");
    WSHShell.Run("wscript.exe """+ПутьСкрипта+"""", 0, Истина);
    УдалитьФайлы(ПутьСкрипта);
КонецПроцедуры

Я даже хотел начать его использовать, но потом подумал, что постоянно создавать файл не эффективное решение.

2)Второй вриант был довольно таки удобный, и подходил бы мне, если бы можно было поставить задержку менее секунды:

Процедура глПауза(Сек)
    scr = СоздатьОбъект("WScript.Shell");
    scr.Run("ping 127.0.0.1 -n "+СокрЛП(Число(Сек)+1),0,1);
КонецПроцедуры;

Такой вариант паузы я использовал еще в .bat файлах. Но он не подходит из-за минимального времени в 1 секунду.

3)Вариант с циклом и проверкой времени был отметен, как ересь, в связи с нагрузкой на процессор, и минимальным временем в 1 секунду.

4)Этот вариант вообще достаточно странный, я уж решил что это именно то, что мне нужно, но потом посмотрел и понял, что нужен некий файлик sleep. Без него выдаётся ошибка  0x80070002. А качать из интернета файл sleep.exe не очень хочется.

Процедура глПауза(Сек)
    scr = СоздатьОбъект("WScript.Shell");
    scr.Run("sleep "+СокрЛП(Число(Сек)),0,1);
КонецПроцедуры;

5)Был еще вариант с предупреждением и выбором из списка с таймером, но там опять же минимальная пауза 1 сек + еще окна лишние.

В итоге я понял, что нормальной реализации с помощью языка 1С нету, так как в большинстве случаев используется подключение Wscript.Wshell, и видимо не просто так. Но использовать первый вариант я совершенно не хотел, из за записи файла на диск. 

У меня был небольшой опыт работы c VBScript, поэтому я знал, что в скрипт можно переадавать параметры. Этим я  и воспользовался.  Был написан простой скрипт ожидания, который принимал один параметр:

wscript.sleep wscript.arguments(0)

Сделать это очень просто: открываем блокнот, вставляем строчку , которая написана выше, жмем "Сохранить как...",  и сохраням как sleep.vbs.

Этот файл необходимо положить на сервер(для вызова на сервере) и на клиент(для вызова на клиенте), в моём случае(сервер терминалов), я положил файл на оба сервера(терминальный и на сервер 1С).

Теперь у нас есть скрипт который будет ждать столько, сколько мы скажем, осталось его вызвать из программы.

Вызов происходит в две строчки кода:

Процедура ОбработкаОжидания(Секунда)
    scr = Новый COMОбъект("WScript.Shell");
    scr.Run("Wscript.exe ""C:\temp\sleep.vbs"" "+секунда*1000,0,1);
КонецПроцедуры

Я положил процедуру в общий модуль на клиенте, и в общий модуль на сервере, так же в параметр задал ПутьХраненияФайла. Вот таким образом с помощью Wscript, без постоянного создания файлов скрипта можно реализовать паузу в работе кода с минимальным значением ~0,001 секунда.

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

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

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2655    0    John_d    8    

53

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4590    atdonya    22    

45

Переоткрытие внешних обработок

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

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3950    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8799    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2069    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16139    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7241    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. Alximikkk 20 21.06.13 17:17 Сейчас в теме
(1) я же перечислил варианты, которые не подошли, и в итоге привел пример варианта, который адекватно работает и выполняет все необходимые мне функции, и которого еще не было, по крайней мере я не нашел. Многие предлагают создавать файл на диске прямо во время исполнения кода , но этот вариант мне не подходит. Поэтому я описал своё видение этого решения, а так же альтернативные варианты.
3. KonstB 180 21.06.13 23:11 Сейчас в теме
(2) Alximikkk,

Чем же Вам не подошел вариант с созданием файла... Вы так и так используете файл. НО Ваш вариант, который через параметр меннее "жизниспособный", ибо
- удалили файл
- файл не досупен
- порезали права
- подключился на другой терминал (а профиль не мигрировал), а файл лежит не в шаре...
и все капут, задержки нет...

Почитайте (или обновите платформу) про ТекущаяУниверсальнаяДатаВМиллисекундах() (с помощью этого...)
4. Alximikkk 20 22.06.13 22:29 Сейчас в теме
(3) KonstB, не подошел мне этот вариант, потому что необходимо каждый раз создавать новый файл. Это конечно не очень критично, и я бы наверное использовал его, так как он на самом деле более устойчив при постоянно изменяющейся рабочей обстановке. Мой же вариант предполагает, что рабочая обстановка более менее устойчива, к тому же он быстрее и оптимальнее, что немаловажно. Вот например, при варианте с созданием, нам вначале нужно создать текст скрипта, перезаписать файл в нашей ФС, и выполнить скрипт; В моем же варианте достаточно просто выполнить скрипт, и если предположить, что скрипт всегда доступен, то мой вариант работает оптимальнее. Удаление файла решается правами доступа, и тут скорее "права доступа" работают в пользу моего варианта, так пользователю надо иметь только право на чтение файла, в варианте с созданием - необходимо право так же и на запись(я понимаю, что скорее всего будет использован каталог пользователя, на который он имеет права, но всё же). Можно конечно проверять наличие файла, но это тоже не очень гуд.
За ТекущаяУниверсальнаяДатаВМиллисекундах() спасибо, не знал. Я предполагаю, что вы предлагаете циклить и проверять на дату, это конечно более простой с точки зрения разработки и понимая алгоритм, но загружать одно ядро на 100%(ведь пустой цикл будет грузить 1 ядро полностью, так?) даже на 0,1 секунду не очень хочется, ведь пауза подразумевает под собой остановку(паузу) в выполнении, а не нагрузку системы до такого состояния, что она может сожрать все ресурсы сервера)))
7. baradist 08.12.13 04:32 Сейчас в теме
(4) Alximikkk, в цикле записывать один и тот же файл, что за извращение?
Кто мешает записать нужный vbs, перед циклом и в цикле использовать его?
9. Rothschild 13.01.14 07:30 Сейчас в теме
(3) KonstB,
(8) KrackMan,
---
1. иногда имеется разделение труда:
обновляют платформу - ОДМИНЫ, а кодят программеры 1С.
и не всегда бывает вообще возможно просто так обновить,
если база крутится например на 8.1.

2. а кто скажет на какой релиз (минимально) надо обновить
чтобы длиннюща радость в виде "ТекущаяУниверсальнаяДатаВМиллисекундах()" появилась ???
10. Rothschild 13.01.14 07:34 Сейчас в теме
(1)
соглашусь с вами, товариш, Федель!
и не только в гугле, но и на Инфостарте:

1С и WSH и WMI. ОТ ТЕОРИИ К ПРАКТИКЕ. Часть I: http://infostart.ru/public/165702/
1С и WSH и WMI. ОТ ТЕОРИИ К ПРАКТИКЕ. Часть II: http://infostart.ru/public/166391/
1С и WSH и WMI. ОТ ТЕОРИИ К ПРАКТИКЕ. Часть III: http://infostart.ru/public/166440/

Практическая реализация:
Обработка 1С:Системный Администратор (WSH&WMI): http://infostart.ru/public/172189/



--------------------------------------------------------------------------------
5. CagoBHuK 32 26.06.13 09:52 Сейчас в теме
1. А что делать, если 1С на Линукс? Почему программисты рассматривают только Windows-машины? Ваш вариант в таком случае работать не будет.
2. Я не знаю, чем не угодило ПодключитьОбработчикОжидания(). Отлично работает во всех конфигурациях 1С от Раруса.
Резюме: незачем изобретать велосипед, тем более который ездит только по рельсам.
6. Alximikkk 20 26.06.13 10:22 Сейчас в теме
1)Под Линукс не работает, это да, поэтому я и поставил платформу windows. Так же в заголовке быо написано wscript, что подразумевает работу на Windows. С Линуксом просто плотно не работал, поэтому не могу точно сказать, но скорее всего там тоже можно реализовать нечто подобное.(естественно не на Vbscript, а на встроенном языке, или на Python'е например)
2)ПодключитьОбработчикОжидания() не угодил тем, что выполняется он параллельно с кодом, а не останавливает его, к тому же в, вызываемую обработчиком ожидания, процедуру нельзя передавать параметры. Но основное это то, что пауза нужна не для того, чтобы отложить запуск процедуры, а для того, чтобы приостановить выполнение программного кода.
deemaa; veiuper; +2 Ответить
8. KrackMan 13.01.14 03:59 Сейчас в теме
Процедура Пауза(Арг)
Нач = ТекущаяДата();
Кон = ТекущаяДата();
Пока Кон-Нач < Арг Цикл
Кон = ТекущаяДата();
КонецЦикла;
КонецПроцедуры

Арг - в секундах. Если использовать ТекущаяУниверсальнаяДатаВМиллисекундах(), то можно задавать и миллисекундах.
13. eugeniezheludkov 43 22.01.15 05:36 Сейчас в теме
(8) KrackMan, только ваша функция займет процессор этим циклом, а виндовый sleep как раз таки не занимает процессорное время выполняясь на сервере , отдавая его другим процессам, что бывает очень важно , в тех же регламентных заданиях
15. KrackMan 28.07.17 10:43 Сейчас в теме
(13)
KrackMan, только ваша функция займет процессор этим циклом

Первый момент: в Сабже не указано, что это нужно реализовать на сервере - поэтому я отталкивался от кода под локальное выполнение.
Второй момент: Всё что выполняется программами использует процессорное время, в том числе и виндовый sleep.
Поэтому очень интересно ознакомиться с вашим методом анализирования загруженности процессорного времени 1С и Виндовым sleep'ом.

Моё мнение таково: что Виндовый sleep, что мой метод заблокирует 1С ровно на то время что задано пользователем в ожидании окончания выполнения задачи. Т.е. 1С висит и пользователь не работает.

"виндовый sleep как раз таки не занимает процессорное время выполняясь на сервере" - тогда каким магических способом реализован sleep если он процессор не грузит вообще? Такой подход имеет место быть при сильном сервере и оносительно не большом количестве пользователей, а как себя поведет система если на том же сервере будут работать 1500 человек и 800 из них будут использовать обработку выполняющую слип на стороне сервера?

Но я могу ошибаться, поэтому прошу вас ознакомить нас с практическими замерами загруженности процессора при выполнении методов паузы. Заранее спасибо!
11. StaticUnsafe 28.01.14 10:14 Сейчас в теме
КомандаСистемы("timeout /T 10");
scar-67rus; chilyagin; p1l1gr1m; +3 Ответить
14. my_espe 11.04.16 08:51 Сейчас в теме
(11) Osiris_, - не работает на сервере
16. extraterrestria1 04.12.17 14:18 Сейчас в теме
(11) прерывание потока выполнения кода не осуществляет
12. AlexanderKai 14.11.14 09:56 Сейчас в теме
Интересный эффект при использовании последнего метода(scr.Run("Wscript.exe ""C:\temp\sleep.vbs"" "+секунда*1000,0,1);, другие не использовал) - если поставить 100 секунд, то программой после установления паузы можно спокойно пользоваться дальше.
Интересно, как нибудь заблокировать действия с программой можно?
Оставьте свое сообщение