1С 8.3 Пауза в коде процедуры/функции
Данные > Примеры кода 1С > 1С 8.3 Процедуры и Функции
Перейти в раздел примеры кода 1С 8.3:

Программу Sleep для первого примера можно скачать по ссылке: https://1cnik.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Запрос());
Исключение
Возврат Неопределено;
КонецПопытки;
КонецЕсли;
КонецФункции
0
отзывы
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник