TG Telegram Group & Channel
Прусаков Никита про 1С | United States America (US)
Create: Update:

Паузы в 1С

Иногда требуется воссоздавать искусственные паузы. Необходимость в этом может возникнуть в интеграциях, когда нам нужно вызвать сторонний сервис, и если он не отвечает повторять попытки с некоторым интервалом. Или же при записи больших объемов в транзакциях, между транзакциями рекомендуется делать небольшие паузы.

Рассмотрим основные варианты реализации таких пауз:

1️⃣Самый банальный написать код примерно такого вида. Тут ждем 10 секунд и продолжаем выполнение кода.

ЖдатьДо = ТекущаяДатаСеанса() + 10;
Пока ЖдатьДо >= ТекущаяДатаСеанса() Цикл
// Пустой цикл
КонецЦикла;


Проблема в том, что циклы грузят процессор. Причем нехило так. Поэтому такую паузу лучше не использовать.

2️⃣Использовать com-объект и вызывать паузу через скрипт PowerShell. Можно использовать разные подходы timeout, ping или другие команды. Очевидный минус - такой код не будет работать в linux.

WshShell = Новый COMОбъект("WScript.Shell");
СтрокаКоманды = "timeout /t "+Секунд+" /nobreak";
СтрокаКоманды = "cmd /c "+СтрокаКоманды;
WshShell.Run(СтрокаКоманды,0,ОжидатьЗавершения);


3️⃣Использовать фоновое задание, ожидая его завершения в течении определенного времени.

Именно этот способ в большинстве случаев используется в типовых конфигурациях.

Пример такого кода:

Процедура Пауза(Секунд) Экспорт

ТекущийСеансИнформационнойБазы = ПолучитьТекущийСеансИнформационнойБазы();

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

Если ФоновоеЗадание = Неопределено Тогда
Параметры = Новый Массив;
Параметры.Добавить(Секунд);
ФоновоеЗадание = ФоновыеЗадания.Выполнить("Интеграция1СШтампСлужебный.Пауза", Параметры);
КонецЕсли;
ФоновоеЗадание.ОжидатьЗавершенияВыполнения(Секунд);
КонецПроцедуры


4️⃣ Начиная с версии 8.3.25 в платформу завезли метод "ВызватьПаузу". Ждем рефакторинга в типовых конфигурациях!

Всем классно провести предстоящие праздники!

Паузы в 1С

Иногда требуется воссоздавать искусственные паузы. Необходимость в этом может возникнуть в интеграциях, когда нам нужно вызвать сторонний сервис, и если он не отвечает повторять попытки с некоторым интервалом. Или же при записи больших объемов в транзакциях, между транзакциями рекомендуется делать небольшие паузы.

Рассмотрим основные варианты реализации таких пауз:

1️⃣Самый банальный написать код примерно такого вида. Тут ждем 10 секунд и продолжаем выполнение кода.

ЖдатьДо = ТекущаяДатаСеанса() + 10;
Пока ЖдатьДо >= ТекущаяДатаСеанса() Цикл
// Пустой цикл
КонецЦикла;


Проблема в том, что циклы грузят процессор. Причем нехило так. Поэтому такую паузу лучше не использовать.

2️⃣Использовать com-объект и вызывать паузу через скрипт PowerShell. Можно использовать разные подходы timeout, ping или другие команды. Очевидный минус - такой код не будет работать в linux.

WshShell = Новый COMОбъект("WScript.Shell");
СтрокаКоманды = "timeout /t "+Секунд+" /nobreak";
СтрокаКоманды = "cmd /c "+СтрокаКоманды;
WshShell.Run(СтрокаКоманды,0,ОжидатьЗавершения);


3️⃣Использовать фоновое задание, ожидая его завершения в течении определенного времени.

Именно этот способ в большинстве случаев используется в типовых конфигурациях.

Пример такого кода:

Процедура Пауза(Секунд) Экспорт

ТекущийСеансИнформационнойБазы = ПолучитьТекущийСеансИнформационнойБазы();

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

Если ФоновоеЗадание = Неопределено Тогда
Параметры = Новый Массив;
Параметры.Добавить(Секунд);
ФоновоеЗадание = ФоновыеЗадания.Выполнить("Интеграция1СШтампСлужебный.Пауза", Параметры);
КонецЕсли;
ФоновоеЗадание.ОжидатьЗавершенияВыполнения(Секунд);
КонецПроцедуры


4️⃣ Начиная с версии 8.3.25 в платформу завезли метод "ВызватьПаузу". Ждем рефакторинга в типовых конфигурациях!

Всем классно провести предстоящие праздники!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍123


>>Click here to continue<<

Прусаков Никита про 1С






Share with your best friend
VIEW MORE

United States America Popular Telegram Group (US)