1С 8.3 Пауза в коде процедуры/функции - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

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,,Истина);

    КонецЕсли;

   
Сообщить("финиш паузы в: "+ТекущаяДата());

КонецПроцедуры
Вариант 2. Пример паузы, ожидания в процедуре/функции в 1С 8.3:
//Процедура используется в Общем модуле с включенными признаками: Сервер, Вызов сервера
Процедура ПаузаВКоде(КоличСек) Экспорт // Работает во всех ОС

   
Если ТипЗнч(КоличСек) <> Тип("Число") ИЛИ (КоличСек = 0) Тогда
        Возврат;
// Фикс.зависание бесконечной паузы
   
КонецЕсли;

   
// Контроль запущено ли фоновое задание:
   
ФоновоеЗаданиеСеанс = ПолучитьТекущийСеансИнформационнойБазы().ПолучитьФоновоеЗадание();

    Если
ФоновоеЗаданиеСеанс = Неопределено Тогда
       
// Алгоритм запуска фонового задания и ожидания завершения по времени :
       
МассивПараметров = Новый Массив(1);
       
МассивПараметров.Установить(0, КоличСек);
       
ИмяМетода = "ОбщийМодульФоновоеЗадание.ПаузаВКоде"; // Полное имя метода текущей процедуры
        // Старт фонового задания без использования расширений конфигурации (снижаем нагрузку на сервер)
       
ФоновоеЗаданиеСеанс = РасширенияКонфигурации.ВыполнитьФоновоеЗаданиеБезРасширений(ИмяМетода, МассивПараметров);
    КонецЕсли;

   
ФоновоеЗаданиеСеанс.ОжидатьЗавершенияВыполнения(КоличСек);

КонецПроцедуры
Вариант 3. Пример паузы, ожидания в процедуре/функции в 1С 8.3:
Процедура Пауза(МиллиСекунды)

   
ТаймерМС = ТекущаяУниверсальнаяДатаВМиллисекундах() + МиллиСекунды;
    Пока
ТаймерМС > ТекущаяУниверсальнаяДатаВМиллисекундах() Цикл
       
Состояние(ОКР((ТаймерМС-ТекущаяУниверсальнаяДатаВМиллисекундах())/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Запрос());
        Исключение
            Возврат Неопределено;
        КонецПопытки;

    КонецЕсли;

КонецФункции
2
комментарии
Администратор
16 апр 2024
Спасибо, Сергей. Поправил
Сергей
13 апр 2024
Последний вариант не в миллисекундах, а в секундах.
____________________
Copyright©, «Программист 1С в г.Минске», 19.03.2021
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому