1С 8.3 Пауза в коде процедуры/функции
Данные > Примеры кода 1С > 1С 8.3 Процедуры и Функции
Перейти в раздел примеры кода 1С 8.3:
📰 Актуальные новости с тегом #Пауза:
- В версии 8.3.25 во встроенный язык платформы добавлен метод глобального контекста ВызватьПаузу (CallSleep), останавливающий выполнение потока сеанса на заданное время и может быть вызван из фоновых заданий, веб-сервисов, http-сервисов, ботов и т.п., но недоступен в клиент-серверном вызове. Метод может отключить пользовательский интерфейс (так как останавливает выполнение кода), если метод вызван из клиентского кода. Для выполнения паузы в клиентском коде предлагается использовать другие средства, например, "механизм фоновых заданий или нижеприведённые костыли.
Программу Sleep для первого примера можно скачать по ссылке:https://koder.by/files/sleep_1cnik_by.rar
позволяет установить задержку при выполнении Bat-файла, поскольку штатной команды для этого нет. Пример использования:
//rem запуск первой программы
start /wait Program.exe
//rem Запуск sleep (пауза 20 сек.)
start /wait Sleep.exe 20
//rem запуск второй программы через 20 сек.
start /wait Program2.exe
Вариант 1. Сборник из самых популярных методов для пауз в 1С 8.3:
Процедура ВыполнитьПаузу(ЗадержкаВСекундах = 5, Вариант = "Ping")
Если ЗадержкаВСекундах = 0 Тогда
Сообщить("Не задана задержка!");
Возврат
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ЗафиксироватьТранзакцию();
КонецЕсли;
Сообщить("старт паузы в: "+ТекущаяДата());
Если Вариант = "Ping" Тогда //не грузит процессор
ПараметрыЗапроса = "ping -n 1 -w "+Формат(1000 * ЗадержкаВСекундах, "ЧДЦ=0; ЧГ=") + " 127.8.8.8";
WScriptShell = Новый COMОбъект("WScript.Shell");
WScriptShell.Run(ПараметрыЗапроса, 0, -1);
ИначеЕсли Вариант = "smaharbA" Тогда //не грузит процессор
Для к = 1 По ЗадержкаВСекундах Цикл
ПолучитьCOMОбъект("winmgmts:").ExecNotificationQuery("Select * from __instancemodificationevent where TargetInstance isa 'Win32_UTCTime'").NextEvent();
КонецЦикла;
ИначеЕсли Вариант = "Пустой цикл" Тогда // загрузка процессора до 100%
ДатаЗавершенияПаузы = ТекущаяДата() + ЗадержкаВСекундах;
Пока ТекущаяДата() < ДатаЗавершенияПаузы Цикл
ОбработкаПрерыванияПользователя();
КонецЦикла;
ИначеЕсли Вариант = "Sleep" Тогда // нужна установленная программа sleep.exe
WScriptShell = Новый ComОбъект("WScript.Shell");
WScriptShell.Run("sleep "+Формат(ЗадержкаВСекундах, "ЧДЦ=0; ЧГ="), 0, 1);
ИначеЕсли Вариант = "DynamicWrapper" Тогда // используется внешняя библиотека. д.б. установлена KERNEL32.DLL
DynamicWrapper = Новый ComОбъект("DynamicWrapper");
DynamicWrapper.Register("KERNEL32.DLL", "Sleep", "i=l", "f=s");
DynamicWrapper.Sleep(ЗадержкаВСекундах);
ИначеЕсли Вариант = "SleepJs" Тогда // используется WScript.Shell
WScriptSleep = Новый ТекстовыйДокумент();
WScriptSleep.УстановитьТекст
("if (WScript.Arguments.Count()==0)
| WScript.Quit();
|else
| if (isNaN(parseInt(WScript.Arguments(0))))
| WScript.Quit();
|WScript.Sleep(WScript.Arguments(0));");
WScriptSleep.Записать(КаталогВременныхФайлов()+"sleep.js", КодировкаТекста.ANSI);
WScriptShell = Новый COMОбъект("wscript.shell");
WScriptShell.Run("wscript.exe """+КаталогВременныхФайлов()+"sleep.js"" "+Формат(ЗадержкаВСекундах*1000,"ЧГ=0"), 0, -1);
УдалитьФайлы(КаталогВременныхФайлов()+"sleep.js");// обязательно чистим каталог
ИначеЕсли Вариант = "SleepVbs" Тогда // используется WScript.Shell
SignS = Формат(ТекущаяДата(), "ДФ=yyyyMMddhhmmss");
ПутьScript = КаталогВременныхФайлов()+"SleepScript"+SignS+".vbs";
WScriptSleep = Новый ТекстовыйДокумент;
WScriptSleep.ДобавитьСтроку("WScript.Sleep("+Формат(ЗадержкаВСекундах*1000, "ЧГ=0")+")");
WScriptSleep.Записать(ПутьScript, КодировкаТекста.OEM);
WScriptShell = Новый COMОбъект("WScript.Shell");
WScriptShell.Run("wscript.exe """+ПутьScript+"""", 0, 1);
УдалитьФайлы(ПутьScript);// обязательно чистим каталог
ИначеЕсли Вариант = "TimeoutWS" Тогда // используется WScript.Shell
TimeoutWindows = "Timeout /T " + Формат(ЗадержкаВСекундах, "ЧГ=0") + " /NoBreak";
WScriptShell = Новый COMОбъект("WScript.Shell");
WScriptShell.Run(TimeoutWindows, 0, -1);
ИначеЕсли Вариант = "Timeout" Тогда // используется WScript.Shell, но показывает черное окно при каждом старте паузы
TimeoutWindows = "Timeout /T " + Формат(ЗадержкаВСекундах, "ЧГ=0") + " /NoBreak";
ЗапуститьПриложение(TimeoutWindows,,Истина);
КонецЕсли;
Сообщить("финиш паузы в: "+ТекущаяДата());
КонецПроцедуры
Если ЗадержкаВСекундах = 0 Тогда
Сообщить("Не задана задержка!");
Возврат
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ЗафиксироватьТранзакцию();
КонецЕсли;
Сообщить("старт паузы в: "+ТекущаяДата());
Если Вариант = "Ping" Тогда //не грузит процессор
ПараметрыЗапроса = "ping -n 1 -w "+Формат(1000 * ЗадержкаВСекундах, "ЧДЦ=0; ЧГ=") + " 127.8.8.8";
WScriptShell = Новый COMОбъект("WScript.Shell");
WScriptShell.Run(ПараметрыЗапроса, 0, -1);
ИначеЕсли Вариант = "smaharbA" Тогда //не грузит процессор
Для к = 1 По ЗадержкаВСекундах Цикл
ПолучитьCOMОбъект("winmgmts:").ExecNotificationQuery("Select * from __instancemodificationevent where TargetInstance isa 'Win32_UTCTime'").NextEvent();
КонецЦикла;
ИначеЕсли Вариант = "Пустой цикл" Тогда // загрузка процессора до 100%
ДатаЗавершенияПаузы = ТекущаяДата() + ЗадержкаВСекундах;
Пока ТекущаяДата() < ДатаЗавершенияПаузы Цикл
ОбработкаПрерыванияПользователя();
КонецЦикла;
ИначеЕсли Вариант = "Sleep" Тогда // нужна установленная программа sleep.exe
WScriptShell = Новый ComОбъект("WScript.Shell");
WScriptShell.Run("sleep "+Формат(ЗадержкаВСекундах, "ЧДЦ=0; ЧГ="), 0, 1);
ИначеЕсли Вариант = "DynamicWrapper" Тогда // используется внешняя библиотека. д.б. установлена KERNEL32.DLL
DynamicWrapper = Новый ComОбъект("DynamicWrapper");
DynamicWrapper.Register("KERNEL32.DLL", "Sleep", "i=l", "f=s");
DynamicWrapper.Sleep(ЗадержкаВСекундах);
ИначеЕсли Вариант = "SleepJs" Тогда // используется WScript.Shell
WScriptSleep = Новый ТекстовыйДокумент();
WScriptSleep.УстановитьТекст
("if (WScript.Arguments.Count()==0)
| WScript.Quit();
|else
| if (isNaN(parseInt(WScript.Arguments(0))))
| WScript.Quit();
|WScript.Sleep(WScript.Arguments(0));");
WScriptSleep.Записать(КаталогВременныхФайлов()+"sleep.js", КодировкаТекста.ANSI);
WScriptShell = Новый COMОбъект("wscript.shell");
WScriptShell.Run("wscript.exe """+КаталогВременныхФайлов()+"sleep.js"" "+Формат(ЗадержкаВСекундах*1000,"ЧГ=0"), 0, -1);
УдалитьФайлы(КаталогВременныхФайлов()+"sleep.js");// обязательно чистим каталог
ИначеЕсли Вариант = "SleepVbs" Тогда // используется WScript.Shell
SignS = Формат(ТекущаяДата(), "ДФ=yyyyMMddhhmmss");
ПутьScript = КаталогВременныхФайлов()+"SleepScript"+SignS+".vbs";
WScriptSleep = Новый ТекстовыйДокумент;
WScriptSleep.ДобавитьСтроку("WScript.Sleep("+Формат(ЗадержкаВСекундах*1000, "ЧГ=0")+")");
WScriptSleep.Записать(ПутьScript, КодировкаТекста.OEM);
WScriptShell = Новый COMОбъект("WScript.Shell");
WScriptShell.Run("wscript.exe """+ПутьScript+"""", 0, 1);
УдалитьФайлы(ПутьScript);// обязательно чистим каталог
ИначеЕсли Вариант = "TimeoutWS" Тогда // используется WScript.Shell
TimeoutWindows = "Timeout /T " + Формат(ЗадержкаВСекундах, "ЧГ=0") + " /NoBreak";
WScriptShell = Новый COMОбъект("WScript.Shell");
WScriptShell.Run(TimeoutWindows, 0, -1);
ИначеЕсли Вариант = "Timeout" Тогда // используется WScript.Shell, но показывает черное окно при каждом старте паузы
TimeoutWindows = "Timeout /T " + Формат(ЗадержкаВСекундах, "ЧГ=0") + " /NoBreak";
ЗапуститьПриложение(TimeoutWindows,,Истина);
КонецЕсли;
Сообщить("финиш паузы в: "+ТекущаяДата());
КонецПроцедуры
Вариант 2. Пример паузы, ожидания в процедуре/функции в 1С 8.3:
//Процедура используется в Общем модуле с включенными признаками: Сервер, Вызов сервера
Процедура ПаузаВКоде(КоличСек) Экспорт // Работает во всех ОС
Если ТипЗнч(КоличСек) <> Тип("Число") ИЛИ (КоличСек = 0) Тогда
Возврат; // Фикс.зависание бесконечной паузы
КонецЕсли;
// Контроль запущено ли фоновое задание:
ФоновоеЗаданиеСеанс = ПолучитьТекущийСеансИнформационнойБазы().ПолучитьФоновоеЗадание();
Если ФоновоеЗаданиеСеанс = Неопределено Тогда
// Алгоритм запуска фонового задания и ожидания завершения по времени :
МассивПараметров = Новый Массив(1);
МассивПараметров.Установить(0, КоличСек);
ИмяМетода = "ОбщийМодульФоновоеЗадание.ПаузаВКоде"; // Полное имя метода текущей процедуры
// Старт фонового задания без использования расширений конфигурации (снижаем нагрузку на сервер)
ФоновоеЗаданиеСеанс = РасширенияКонфигурации.ВыполнитьФоновоеЗаданиеБезРасширений(ИмяМетода, МассивПараметров);
КонецЕсли;
ФоновоеЗаданиеСеанс.ОжидатьЗавершенияВыполнения(КоличСек);
КонецПроцедуры
Процедура ПаузаВКоде(КоличСек) Экспорт // Работает во всех ОС
Если ТипЗнч(КоличСек) <> Тип("Число") ИЛИ (КоличСек = 0) Тогда
Возврат; // Фикс.зависание бесконечной паузы
КонецЕсли;
// Контроль запущено ли фоновое задание:
ФоновоеЗаданиеСеанс = ПолучитьТекущийСеансИнформационнойБазы().ПолучитьФоновоеЗадание();
Если ФоновоеЗаданиеСеанс = Неопределено Тогда
// Алгоритм запуска фонового задания и ожидания завершения по времени :
МассивПараметров = Новый Массив(1);
МассивПараметров.Установить(0, КоличСек);
ИмяМетода = "ОбщийМодульФоновоеЗадание.ПаузаВКоде"; // Полное имя метода текущей процедуры
// Старт фонового задания без использования расширений конфигурации (снижаем нагрузку на сервер)
ФоновоеЗаданиеСеанс = РасширенияКонфигурации.ВыполнитьФоновоеЗаданиеБезРасширений(ИмяМетода, МассивПараметров);
КонецЕсли;
ФоновоеЗаданиеСеанс.ОжидатьЗавершенияВыполнения(КоличСек);
КонецПроцедуры
Вариант 3. Пример паузы, ожидания в процедуре/функции в 1С 8.3:
Процедура Пауза(МиллиСекунды)
ТаймерМС = ТекущаяУниверсальнаяДатаВМиллисекундах() + МиллиСекунды;
Пока ТаймерМС > ТекущаяУниверсальнаяДатаВМиллисекундах() Цикл
Состояние(ОКР((ТаймерМС-ТекущаяУниверсальнаяДатаВМиллисекундах())/1000),1);
КонецЦикла;
КонецПроцедуры
ТаймерМС = ТекущаяУниверсальнаяДатаВМиллисекундах() + МиллиСекунды;
Пока ТаймерМС > ТекущаяУниверсальнаяДатаВМиллисекундах() Цикл
Состояние(ОКР((ТаймерМС-ТекущаяУниверсальнаяДатаВМиллисекундах())/1000),1);
КонецЦикла;
КонецПроцедуры
Вариант 4. Пример паузы, ожидания в процедуре/функции в 1С 8.3:
//Пауза в 1С, длительностью до 20 секунд
Функция Ожидание(Секунды) Экспорт
Если Секунды<> 0 Тогда
НастройкиProxy = Новый ИнтернетПрокси(Ложь);
НастройкиProxy.НеИспользоватьПроксиДляЛокальныхАдресов = Истина;
НастройкиProxy.НеИспользоватьПроксиДляАдресов.Добавить("127.0.0.0");
Попытка
СоединениеHTTP = Новый HTTPСоединение("127.0.0.0",,,,НастройкиProxy,Секунды);
СоединениеHTTP.Получить(Новый HTTPЗапрос());
Исключение
Возврат Неопределено;
КонецПопытки;
КонецЕсли;
КонецФункции
Функция Ожидание(Секунды) Экспорт
Если Секунды<> 0 Тогда
НастройкиProxy = Новый ИнтернетПрокси(Ложь);
НастройкиProxy.НеИспользоватьПроксиДляЛокальныхАдресов = Истина;
НастройкиProxy.НеИспользоватьПроксиДляАдресов.Добавить("127.0.0.0");
Попытка
СоединениеHTTP = Новый HTTPСоединение("127.0.0.0",,,,НастройкиProxy,Секунды);
СоединениеHTTP.Получить(Новый HTTPЗапрос());
Исключение
Возврат Неопределено;
КонецПопытки;
КонецЕсли;
КонецФункции
2
комментарии
Администратор
16 апр 2024
Спасибо, Сергей. Поправил
Сергей
13 апр 2024
Последний вариант не в миллисекундах, а в секундах.
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник