„мигане“ на интерфейса или вериги от асинхронни повиквания. Периодично изпълнение на код с определен интервал от време - Waiting Processing() Waiting Handler 1s 8.2

Платформата 1C ни предоставя възможност за асинхронно извикване на процедури, които понякога могат да се използват за прости, но забавни неща. Например, можете да „мигате“ всичко, което има цвят или каквато и да е способност да променя визуалния облик. Освен това можете да използвате или по-прост, но неконтролиран механизъм, или да конструирате интересна верига от асинхронни повиквания и да й дадете предпочитаното поведение.

Тук, разбира се, говорим за процедурата ConnectWaitingHandler().

Нека ви напомня за синтаксиса на процедурата:

ConnectWaitHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)

Освен това, ако зададете интервал по-малък от секунда, процедурата трябва да се стартира веднъж. Това е мястото, където губим контрол върху потока на изпълнение и губим способността да го „персонализираме“ (гъвкаво, индивидуално да го конфигурираме).

Но това ограничение лесно се преодолява.

За да не оставям мислите си да се лутат, веднага ще дам един прост пример и ще го обясня.

Да кажем, че имаме документ с електронна таблица във формуляра и искаме да „премигнем“ част от него 5 пъти.

////////////////// // // „Премигнете“ областта на документа на електронната таблица 5 пъти, с интервал от половин секунда // //// /////// ///////// &На клиентската процедура BlinkArea (Команда) mf Колко пъти да мигате = 3; // Брояч. Атрибут на формуляр, „видим“ в процедурите на манипулатора на изчакване ConnectWaitHandler("ShowAreaSelection", 0.1, True); // Можете също така директно да извикате EndProcedure &В процедурата на клиента ShowArea Selection() Area = Object.TD.Area(mfFirstDataLine, mfFirstDataColumn, mfLastDataLine, mfLastDataColumn); Граница = нов ред(TableDocumentCellLineType.Double); Area.Circle(Border, Border, Border, Border); // Очертайте областта mfКолко пъти да мигате = mfКолко пъти да мигате - 1; // Намаляване на брояча Connect WaitHandler("RemoveArea Allocation", 0.5, True); // Свързване на верига от асинхронни извиквания Край на процедура & В процедурата на клиента Премахване на област Selection() Area = Object.TD.Area(mfFirstDataLine, mfFirstDataColumn, mfLastDataLine, mfLastDataColumn); Граница = нов ред(TableDocumentCellLineType.NoLine); Area.Circle(Border, Border, Border, Border); // Премахване на очертанията на областта Ако mf Колко пъти да мигате > 0 Тогава свържете WaitHandler("Показване на избора на област", 0.5, True); // Повторете толкова, колкото е останало на брояча EndIf; Край на процедурата

Единственото изискване е променливата на брояча mfHow Many Times Blink да бъде „видима“ от процедурите, които стартираме асинхронно. В този случай променливата е атрибут на формуляр.

Внимателен читател може би е забелязал, че с образуването на такива вериги убиваме две птици с един камък:

  • Ние заобикаляме ограничението за повторение на извиквания на процедури с интервални стойности по-малки от секунда;
  • Имаме способността да формираме вериги с различна дължина и сложност:
    • свържете манипулатора на чакане директно в самата процедура на манипулатора на чакане;
    • уверете се, че тези процедури са свързани една с друга;
    • организирайте по-сложна структура от вериги за обаждания;
    • безкрайно усложняват променливостта на управлението на обажданията (например, променяйте не само техните броячи в повикванията, но и стойностите на интервалите, стиловете на дизайн (така че 🌈 да блести като дъга).

Въпреки простотата на описания метод, в него се крие значителен потенциал.

През 2017 г. по-гъвкавото управление на програмното поведение е модерно.

Код 1C v 8.2 UE ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Настроики:
<ИмяПроцедуры>
<Интервал>(задължително) Тип: Число. Интервалът от време в секунди с точност до 1/10 от секундата, след който процедурата ще бъде извикана (положително число).Ако е зададена стойност по-малка от 1, тогава стойността на третия параметър трябва да е True.
<Однократно>(по избор) Тип: Boolean. Знак за еднократно изпълнение на манипулатора на чакане.
Вярно - посоченият манипулатор на изчакване ще бъде изпълнен веднъж. По подразбиране: False
Описание: Свързва указаната процедура като манипулатор на изчакване. Процедурата ще се извиква по време на периода на изчакване на системата всеки път, когато посоченият интервал от време изтече.

Наличност:
Тънък клиент, уеб клиент, дебел клиент.

Забележка:
Извикването към манипулатора на изчакване продължава, докато формулярът не бъде затворен или докато не бъде извикан методът DisableWaitHandler на формуляра. Код 1C v 8.2 UE DisableWaitingHandler(<ИмяПроцедуры>)

Код 1C v 8.2 UP
&На клиент
Процедура ShellHandler()
ProcessWaiting();
Край на процедурата

&На сървъра
Процедура ProcessWaiting()
// направи каквото се изисква
Край на процедурата

//....
ConnectWaitHandler("HandlerWrapper", 3, True);

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Свързва извикване към определена процедура на управляван приложен модул (обикновен приложен модул) или глобален споделен модул на определен интервал от време. Повикването ще бъде направено само в „състояние на покой“, тоест във време, когато програмата не извършва никакви действия. Извикването на манипулатора на изчакване продължава, докато системата се изключи или се извика методът DisableWaitHandler на глобалния контекст.
Код 1C v 8.x Процедура Sales ReportDay()
// ...
Край на процедурата

//...
ConnectWaitingHandler("DaySalesReport", 60); // всяка минута
Код 1C v 8.x // При стандартна проверка на динамиката. конфигурацията се актуализира на всеки 20 минути.
ConnectWaitingHandler("IB DynamicChangeCheckWaitingHandler", 20 * 60);
// свържете манипулатора за обмен на данни
ConnectWaitingHandler("CheckingDataExchange", chValueVariable("chNumberofSecondsPollExchange"));
ConnectWaitingHandler("Проверка на отговорите на приложенията за свързване", 86400); // = 24(ч) * 60(мин) * 60(сек) = 1 ден

За форма
Код 1C v 8.x ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Настроики:
<ИмяПроцедуры>(задължително) Тип: низ. Името на процедурата, която ще бъде свързана като манипулатор на изчакване.
<Интервал>(задължително) Тип: Число. Времеви интервал в секунди, с точност до 1/10 от секундата, след който процедурата ще бъде извикана (положително число). Ако е зададена стойност, по-малка от 1, тогава стойността на третия параметър трябва да е True.
<Однократно>(по избор) Тип: Boolean. Знак за еднократно изпълнение на манипулатора на чакане. 0True - посоченият манипулатор на изчакване ще бъде изпълнен веднъж. По подразбиране: False

Описание:
Свързва указаната процедура като манипулатор на изчакване. Процедурата ще се извиква по време на периода на изчакване на системата всеки път, когато посоченият интервал от време изтече.

Наличност:
Дебел клиент.
Забележка:
Извикването към манипулатора на изчакване продължава, докато формулярът не бъде затворен или докато не бъде извикан методът DisableWaitHandler на формуляра.
Пример:
Код 1C v 8.x ConnectWaitingHandler("WhenWaiting", 1);
Код 1C v 8.x Form.mAutosave Интервал = 300; // 5 минути
Ако Form.mAutosave Interval<>0 Тогава
Form.ConnectWaitingHandler("TimerEventHandler", Int(Form.mAutoSaveInterval * 60));
endIf;

Чакаща обработка в системата 1C:Enterprise, както следва от документацията, е предназначен за периодично изпълнение на процедурата на глобалния модул с определен интервал от време. Кодът за изпълнение ще изглежда така:
Код 1C v 7.x Очаква обработка ("UpdateCounter_",1);
Където "UpdateCounter_"- име на процедурата на глобалния модул, която ще се стартира на всяка 1 секунда. (вторият параметър е равен на 1)

Но! Проблемът е, че можете да стартирате обработка на изчакване само веднъж. Рестартирането ще отмени предишното. С други думи, ако искате да направите, например, обработка на таймер за отчитане на изминалото време, тогава можете да стартирате само един таймер, т.к. стартирането на втория таймер ще спре първия. Но какво ще стане, ако трябва да стартирате 2, 3 или повече от тези таймери едновременно? Или все пак трябва периодично да сканирате състоянието на документите?

Има изход! Обработката на изчакване трябва да се изпълнява в контекста на формуляра, за да се отдели тази нишка от глобалния контекст. И тогава ще стане възможно периодично да стартирате процедурата на локалния модул, т.е. процедура, намираща се в модула на вашия формуляр за обработка.

Кодът за изпълнение ще изглежда така:
Код 1C v 7.x Form.Waiting Processing("UpdateCounter_",1);
Където "UpdateCounter_"- име на процедурата на локалния модул на формата за обработка, която ще се стартира на интервали от 1 секунда. (вторият параметър е равен на 1)
Така при всяка обработка можете да стартирате собствена обработка на изчакване, която ще работи, докато формата е отворена.

Можете да го използвате във формуляриКод 1C v 8.x Form.Waiting Processing("ProcedureName",StartTime) ,
където ProcedureName е името на процедурата, която се изпълнява след StartTime секунди
В самата процедура трябва да вмъкнете Code 1C v 8.x Form.Waiting Processing("ProcedureName",0), за да спрете чакащата обработка (разбира се, след като са изпълнени необходимите условия).
Източник

Код 1C v 8.2 UE ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Настроики:
<ИмяПроцедуры>
<Интервал>(задължително) Тип: Число. Интервалът от време в секунди с точност до 1/10 от секундата, след който процедурата ще бъде извикана (положително число).Ако е зададена стойност по-малка от 1, тогава стойността на третия параметър трябва да е True.
<Однократно>(по избор) Тип: Boolean. Знак за еднократно изпълнение на манипулатора на чакане.
Вярно - посоченият манипулатор на изчакване ще бъде изпълнен веднъж. По подразбиране: False
Описание: Свързва указаната процедура като манипулатор на изчакване. Процедурата ще се извиква по време на периода на изчакване на системата всеки път, когато посоченият интервал от време изтече.

Наличност:
Тънък клиент, уеб клиент, дебел клиент.

Забележка:
Извикването към манипулатора на изчакване продължава, докато формулярът не бъде затворен или докато не бъде извикан методът DisableWaitHandler на формуляра. Код 1C v 8.2 UE DisableWaitingHandler(<ИмяПроцедуры>)

Код 1C v 8.2 UP
&На клиент
Процедура ShellHandler()
ProcessWaiting();
Край на процедурата

&На сървъра
Процедура ProcessWaiting()
// направи каквото се изисква
Край на процедурата

//....
ConnectWaitHandler("HandlerWrapper", 3, True);

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Свързва извикване към определена процедура на управляван приложен модул (обикновен приложен модул) или глобален споделен модул на определен интервал от време. Повикването ще бъде направено само в „състояние на покой“, тоест във време, когато програмата не извършва никакви действия. Извикването на манипулатора на изчакване продължава, докато системата се изключи или се извика методът DisableWaitHandler на глобалния контекст.
Код 1C v 8.x Процедура Sales ReportDay()
// ...
Край на процедурата

//...
ConnectWaitingHandler("DaySalesReport", 60); // всяка минута
Код 1C v 8.x // При стандартна проверка на динамиката. конфигурацията се актуализира на всеки 20 минути.
ConnectWaitingHandler("IB DynamicChangeCheckWaitingHandler", 20 * 60);
// свържете манипулатора за обмен на данни
ConnectWaitingHandler("CheckingDataExchange", chValueVariable("chNumberofSecondsPollExchange"));
ConnectWaitingHandler("Проверка на отговорите на приложенията за свързване", 86400); // = 24(ч) * 60(мин) * 60(сек) = 1 ден

За форма
Код 1C v 8.x ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Настроики:
<ИмяПроцедуры>(задължително) Тип: низ. Името на процедурата, която ще бъде свързана като манипулатор на изчакване.
<Интервал>(задължително) Тип: Число. Времеви интервал в секунди, с точност до 1/10 от секундата, след който процедурата ще бъде извикана (положително число). Ако е зададена стойност, по-малка от 1, тогава стойността на третия параметър трябва да е True.
<Однократно>(по избор) Тип: Boolean. Знак за еднократно изпълнение на манипулатора на чакане. 0True - посоченият манипулатор на изчакване ще бъде изпълнен веднъж. По подразбиране: False

Описание:
Свързва указаната процедура като манипулатор на изчакване. Процедурата ще се извиква по време на периода на изчакване на системата всеки път, когато посоченият интервал от време изтече.

Наличност:
Дебел клиент.
Забележка:
Извикването към манипулатора на изчакване продължава, докато формулярът не бъде затворен или докато не бъде извикан методът DisableWaitHandler на формуляра.
Пример:
Код 1C v 8.x ConnectWaitingHandler("WhenWaiting", 1);
Код 1C v 8.x Form.mAutosave Интервал = 300; // 5 минути
Ако Form.mAutosave Interval<>0 Тогава
Form.ConnectWaitingHandler("TimerEventHandler", Int(Form.mAutoSaveInterval * 60));
endIf;

Чакаща обработка в системата 1C:Enterprise, както следва от документацията, е предназначен за периодично изпълнение на процедурата на глобалния модул с определен интервал от време. Кодът за изпълнение ще изглежда така:
Код 1C v 7.x Очаква обработка ("UpdateCounter_",1);
Където "UpdateCounter_"- име на процедурата на глобалния модул, която ще се стартира на всяка 1 секунда. (вторият параметър е равен на 1)

Но! Проблемът е, че можете да стартирате обработка на изчакване само веднъж. Рестартирането ще отмени предишното. С други думи, ако искате да направите, например, обработка на таймер за отчитане на изминалото време, тогава можете да стартирате само един таймер, т.к. стартирането на втория таймер ще спре първия. Но какво ще стане, ако трябва да стартирате 2, 3 или повече от тези таймери едновременно? Или все пак трябва периодично да сканирате състоянието на документите?

Има изход! Обработката на изчакване трябва да се изпълнява в контекста на формуляра, за да се отдели тази нишка от глобалния контекст. И тогава ще стане възможно периодично да стартирате процедурата на локалния модул, т.е. процедура, намираща се в модула на вашия формуляр за обработка.

Кодът за изпълнение ще изглежда така:
Код 1C v 7.x Form.Waiting Processing("UpdateCounter_",1);
Където "UpdateCounter_"- име на процедурата на локалния модул на формата за обработка, която ще се стартира на интервали от 1 секунда. (вторият параметър е равен на 1)
Така при всяка обработка можете да стартирате собствена обработка на изчакване, която ще работи, докато формата е отворена.

Можете да го използвате във формуляриКод 1C v 8.x Form.Waiting Processing("ProcedureName",StartTime) ,
където ProcedureName е името на процедурата, която се изпълнява след StartTime секунди
В самата процедура трябва да вмъкнете Code 1C v 8.x Form.Waiting Processing("ProcedureName",0), за да спрете чакащата обработка (разбира се, след като са изпълнени необходимите условия).
Източник



Свързани публикации