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 не будет опубликован. Обязательные поля помечены *