2

Как сделать паузу в коде?

Эта статья расскажет о способах написания пауз на встроенном языке 1С:Предприятие 8, их достоинствах и недостатках. Также Вы узнаете, какой способ является самым оптимальным с точки зрения потребляемых ресурсов компьютера. 

Использование пауз в 1С — стародавняя головная боль. До сих пор этот механизм никак не реализован на уровне платформы. Поэтому программистам приходится изобретать велосипеды и ходить по граблям.

1). Использование целочисленных циклов

Самый старый (встречал такие шедевры еще на платформе 1с:Предприятие 7.7), самый грубый и самый ресурсоемкий способ — использование цикла, ограниченного целым числом:

Функция Тест(Параметр = 0)
  ...
  Для Инд = 1 По 1000 Цикл
    //пока выполняется цикл поток прерван
  КонецЦикла;
  ...
КонецФункции

Грубый — потому что невозможно точно предсказать, сколько будет длиться цикл, ведь скорость  его выполнения напрямую зависит от вычислительной мощности компьютера. Ресурсоемкий — потому что процесс 1С занимает 100% ресурсов ПК.

Его мы однозначно отметаем!

2). Использование цикла с датой

Другой древний способ, чуть более точный, но такой же ресурсоемкий — использование цикла, ограниченного датой:

Функция Тест(Параметр = 0)
  ...
  ДатаКон = ТекущаяДата() + 1;//1 секундой больше
  Пока ТекущаяДата() < ДатаКон Цикл
    //пока выполняется цикл поток прерван
  КонецЦикла;
  ...
КонецФункции

По-прежнему, точность данного алгоритма оставляет желать лучшего, т.к. погрешность может составлять 100 и более миллисекунд. Да и быстродействие не на высоте.

Его мы тоже отметаем!

3) Использование обработчиков ожидания

При работе с формами для реализации повторяющихся во времени действий, можно воспользоваться механизмом обработчиков ожидания:

Функция Тест(Параметр = 0)
  //подключаем периодический обработчик ожидания каждые 500 мсек
  ПодключитьОбработчикОжидания("ОбработчикОжидания", 0.5);
КонецФункции
Процедура ОбработчикОжидания() Экспорт
  ...
КонецПроцедуры

В данном примере мы определили экспортную процедуру ОбработчикОжидания() модуля формы, а затем подключили ее на повторный вызов каждые 500 миллисекунд, используя метод ПодключитьОбработчикОжидания().

Из плюсов метода: точность и низкое потребление ресурсов ПК. Из недостатков этого метода можно отметить ограниченность его использования только клиентской частью приложения (на сервере обработчики ожидания не работают). Кроме того, его невозможно использовать для вставки в выполняемый код, т.к. обработчики 1С  задействованы только в свободное от основных вычислений время.

4) Использование скриптов WShell

Паузу можно реализовать с помощью VBScript и методов COM-объекта WScript.Shell. Ниже приведена готовая процедура, лишенная описанных ранее недостатков:

Процедура ПаузаИсполнения(Секунд) Экспорт	
Перем ИмяВременногоФайла;

  //имя файла, куда сохраним скрипт
  ИмяВременногоФайла = ПолучитьИмяВременногоФайла("vbs");
	
  Попытка
    Скрипт = Новый ТекстовыйДокумент;
    Скрипт.УстановитьТекст("WScript.sleep " + XMLСтрока(Цел(Секунд * 1000)));
    Скрипт.Вывод = ИспользованиеВывода.Разрешить;
    Скрипт.Записать(ИмяВременногоФайла, КодировкаТекста.Системная);
		
    WshShell=Новый COMОбъект("WScript.Shell");
    WshShell.Run("wscript.exe """ + ИмяВременногоФайла + """", 0, -1);
		
    //удаляем временный файл
    УдалитьФайлы(ИмяВременногоФайла);
		
  Исключение
    Сообщить(ОписаниеОшибки());
  КонецПопытки;
	
КонецПроцедуры//ПаузаИсполнения()

Но у приведенной процедуры есть свои недостатки: вряд ли удастся использовать ее на платформе Linux или веб-клиенте.

Поделиться страницей в соц.сетях

2 комментария к записи “Как сделать паузу в коде?

  1. Спасибо. К 4 варианту могу добавить еще способ без создание com-объекта: ЗапуститьПриложение(«TIMEOUT /T 10»,,Истина);

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

Добавить комментарий для Александр Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *