Эта статья расскажет о способах написания пауз на встроенном языке 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 или веб-клиенте.
Спасибо. К 4 варианту могу добавить еще способ без создание com-объекта: ЗапуститьПриложение(«TIMEOUT /T 10»,,Истина);
так то да, но всегда будет открываться окно командной строки, перетягивая на себя фокус. Пользователи точно не оценят)