По результатам чтения форума http://forum.infostart.ru/forum9/topic42820/ и некоторых других форумов, остался вопрос: а какой вариант работает, какой лучше использовать. Для проверки была создана предлагаемая обработка. В ней можно протестировать найденные варианты. Для себя я нашел только 2 варианта: с использованием ping и winmgmts.
Более подробно про проверенные варианты:
1) ping и winmgmts. Оба варианта прекрасно работают, практически не нагружая процессор.
2) Пустой цикл. Вариант работающий, часто предлагаемый на форумах. Имеет большой минус - грузит процессор.
3) Вариант с использованием Sleep. Насколько я понимаю, требуют наличия программы sleep.exe. На моем компьютере такой нет, варианты проверить не удалось.
4) SleepJs и SleepVbs. Работают. Неплохой вариант. Варианты отличаются только алгоритмом запуска команды.
5) TimeoutWs и Timeout. Работают. Неплохой вариант. Варианты отличаются только алгоритмом запуска команды. Timeout показывает черное окно при каждом запуске паузы.
6) DynamicWrapper. Нужна dll. Этот вариант не проверял, так как искал вариант без внешних компонент.
В прилагаемой обработке все варианты можно протестировать в своей базе и выбрать наиболее подходящий.
Есть обычная и управляемая форма, поэтому запускать можно в любой базе. Код открыт.
Протестировано на версиях 8.2 и 8.3.11.
Процедура СделатьПаузу(ЗадержкаСекунд = 3, Вариант = "Ping")
Если ЗадержкаСекунд = 0 Тогда
Возврат
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ЗафиксироватьТранзакцию();
КонецЕсли;
Сообщить("начало: "+ТекущаяДата());
Если Вариант = "Ping" Тогда
СтрокаЗапроса = "ping -n 1 -w "+Формат(1000 * ЗадержкаСекунд, "ЧДЦ=0; ЧГ=") + " 127.255.255.255";
WshShell = Новый COMОбъект("WScript.Shell");
WshShell.Run(СтрокаЗапроса, 0, -1);
ИначеЕсли Вариант = "smaharbA" Тогда
Для к = 1 По ЗадержкаСекунд Цикл
ПолучитьCOMОбъект("winmgmts:").ExecNotificationQuery("Select * from __instancemodificationevent where TargetInstance isa 'Win32_UTCTime'").NextEvent();
КонецЦикла;
ИначеЕсли Вариант = "Пустой цикл" Тогда
// грузит процессор
ДатаВыхода = ТекущаяДата() + ЗадержкаСекунд;
Пока ТекущаяДата() < ДатаВыхода Цикл
ОбработкаПрерыванияПользователя();
КонецЦикла;
ИначеЕсли Вариант = "Sleep" Тогда
// не работает
scr = Новый ComОбъект("WScript.Shell");
scr.Run("sleep "+Формат(ЗадержкаСекунд, "ЧДЦ=0; ЧГ="), 0, 1);
ИначеЕсли Вариант = "SleepJs" Тогда
// работает
Скрипт = Новый ТекстовыйДокумент();
Скрипт.УстановитьТекст
(
"if (WScript.Arguments.Count()==0)
| WScript.Quit();
|else
| if (isNaN(parseInt(WScript.Arguments(0))))
| WScript.Quit();
|WScript.Sleep(WScript.Arguments(0));"
);
Скрипт.Записать(КаталогВременныхФайлов()+"sleep.js", КодировкаТекста.ANSI);
WshShell = Новый COMОбъект("wscript.shell");
WshShell.Run("wscript.exe """+КаталогВременныхФайлов()+"sleep.js"" "+Формат(ЗадержкаСекунд*1000,"ЧГ=0"), 0, -1);
УдалитьФайлы(КаталогВременныхФайлов()+"sleep.js");
ИначеЕсли Вариант = "SleepVbs" Тогда
// работает
Сигнатура = Формат(ТекущаяДата(), "ДФ=yyyyMMddhhmmss");
ПутьСкрипта = КаталогВременныхФайлов()+"SleepScript"+Сигнатура+".vbs";
СкриптФайл = Новый ТекстовыйДокумент;
СкриптФайл.ДобавитьСтроку("WScript.Sleep("+Формат(ЗадержкаСекунд*1000, "ЧГ=0")+")");
СкриптФайл.Записать(ПутьСкрипта, КодировкаТекста.OEM);
WSHShell = Новый COMОбъект("WScript.Shell");
WSHShell.Run("wscript.exe """+ПутьСкрипта+"""", 0, 1);
УдалитьФайлы(ПутьСкрипта);
ИначеЕсли Вариант = "TimeoutWS" Тогда
// работает
КомандаWindows = "Timeout /T " + Формат(ЗадержкаСекунд, "ЧГ=0") + " /NoBreak";
WshShell = Новый COMОбъект("WScript.Shell");
WshShell.Run(КомандаWindows, 0, -1);
ИначеЕсли Вариант = "Timeout" Тогда
// работает, показывает черное окно
КомандаWindows = "Timeout /T " + Формат(ЗадержкаСекунд, "ЧГ=0") + " /NoBreak";
ЗапуститьПриложение(КомандаWindows,,Истина);
ИначеЕсли Вариант = "DynamicWrapper" Тогда
// нужна библиотека
Wrapper = Новый ComОбъект("DynamicWrapper");
Wrapper.Register("KERNEL32.DLL", "Sleep", "i=l", "f=s");
Wrapper.Sleep(ЗадержкаСекунд);
КонецЕсли;
Сообщить("^^^^^^: "+ТекущаяДата());
КонецПроцедуры