itthon / Internet / 1s hogyan kell megvárni a várakozáskezelő végrehajtását. "villogó" interfész, vagy aszinkron hívások láncai

1s hogyan kell megvárni a várakozáskezelő végrehajtását. "villogó" interfész, vagy aszinkron hívások láncai

Az 1C platform lehetőséget ad számunkra az aszinkron eljáráshívásokra, amelyek időnként egyszerű, de szórakoztató dolgokra is használhatók. Például "pisloghat" bármire, aminek színe van, vagy bármilyen lehetősége van a látványterv megváltoztatására. Ezenkívül használhat egy egyszerűbb, de ellenőrizetlen mechanizmust, és létrehozhat egy érdekes aszinkron hívásláncot, és beállíthatja annak preferált viselkedését.

Itt természetesen a ConnectWaitingHandler() eljárásról beszélünk.

Hadd emlékeztessem az eljárás szintaxisára:

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

Ezenkívül, ha egy másodpercnél rövidebb intervallumot ad meg, az eljárást egyszer el kell indítani. Itt veszítjük el az irányítást a végrehajtás folyamata felett, és elveszítjük a „testreszabási” képességet (rugalmasan, egyénileg).

De ez a korlátozás könnyen megkerülhető.

Hogy ne terjessze szét a gondolataimat a fán, azonnal mondok egy egyszerű példát és elmagyarázom.

Tegyük fel, hogy van egy táblázatos dokumentumunk az űrlapon, és 5-ször akarunk "pislogni" annak egy részével.

/////////////////// // // "pislogjon" a területre táblázatos dokumentum 5 alkalommal, fél másodperces időközzel // //////////////////// &AtClient Blink Area Procedure (parancs) mf Blink How Many = 3; // Számláló. A "látható" űrlapattribútum a várakozáskezelő eljárásokban ConnectWaitHandler("ShowAreaSelect", 0.1, True); // Közvetlenül is meghívhatja az EndProcedure &OnClient eljárást ShowAreaSelect() Area = Object.AP.Area(mfFirstDataRow, mfFirstDataColumn, mfLastDataRow, mfLastDataColumn); Szegély = Új sor(LineTypeSpreadsheetDocumentCell.Double); Régió.Border(Border, Border, Border, Border); // A terület körvonalazása mfBlinkTimes = mfBlinkTimes - 1; // Counter decrement ConnectWaitingHandler("RemoveArea Selection", 0.5, True); // Csatlakoztassa az aszinkron hívások láncát EndProcedure &AtClient Procedure RemoveAreaSelect() Area = Object.AP.Area(mfFirstDataRow, mfFirstDataColumn, mfLastDataRow, mfLastDataColumn); Szegély = Új sor(LineTypeSpreadsheetDocumentCell.NoLine); Régió.Border(Border, Border, Border, Border); // A terület körvonalának eltávolítása If mfBlinkTime > 0 Then ConnectWaitingHandler("ShowArea Selection", 0.5, True); // Ismételje meg annyit, amennyi a számlálón maradt EndIf; Vége eljárás

A fő követelmény csak az, hogy az mfHányszorBlink számlálóváltozó "látható" legyen az általunk aszinkron módon futtatott eljárásokból. Ebben az esetben a változó egy form attribútum.

Egy figyelmes olvasó észreveheti, hogy az ilyen láncok kialakulásával két legyet ölünk meg egy csapásra:

  • Kerülje ki az eljáráshívások ismételhetőségére vonatkozó korlátozást az egy másodpercnél rövidebb intervallumértékekkel;
  • Lehetőségünk van különböző hosszúságú és összetettségű láncok kialakítására:
    • csatlakoztassa a várakozáskezelőt közvetlenül magában a várakozáskezelő eljárásban;
    • hogy az ilyen eljárások összekapcsolják egymást;
    • a hívási láncok összetettebb struktúrájának megszervezése;
    • végtelenül bonyolítja a híváskezelés változékonyságát (például ne csak a hívásokon belüli számlálójukat változtassuk meg, hanem az intervallumértékeket, tervezési stílusokat is (hogy 🌈 szivárványként csillogjon).

A leírt módszer egyszerűsége ellenére jelentős potenciál rejlik benne.

2017-ben a program viselkedésének rugalmasabb kezelése korszerű.

Code 1C v 8.2 UE ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Lehetőségek:
<ИмяПроцедуры>
<Интервал>(kötelező) Típus: Szám. Az az időintervallum másodpercben, 1/10 másodperc pontossággal, amely után az eljáráshívás megtörténik (pozitív szám) Ha 1-nél kisebb értéket adunk meg, akkor a harmadik paraméter értékének True-nak kell lennie.
<Однократно>(nem kötelező) Típus: Logikai. A várakozó egyszeri kivégzésének jele.
Igaz – a megadott várakozási kezelő egyszer végrehajtásra kerül. Alapértelmezett érték: False
Leírás: A megadott eljárást várakozáskezelőként csatlakoztatja. Az eljárást a rendszer a rendszer időtúllépési időszakában hívja meg minden alkalommal, amikor a megadott időintervallum lejár.

Elérhetőség:
Vékony kliens, webkliens, vastag kliens.

Jegyzet:
A várakozási kezelő hívása az űrlap bezárásáig vagy az űrlap DisableWaitHandler metódusának meghívásáig folytatódik. Code 1C v 8.2 UE DisableWaitingHandler(<ИмяПроцедуры>)

Kód 1C v 8.2 UP
&AtClient
Procedure WrapperHandler()
ProcessWaiting();
Vége eljárás

&A szerveren
Procedure Process Waiting()
// tegye meg, amit szükséges
Vége eljárás

//....
ConnectWaitingHandler("HandlerShell", 3, igaz);

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Hívást kapcsol egy felügyelt alkalmazásmodul meghatározott eljárásához (modul rendszeres alkalmazása) vagy globális közös modul egy bizonyos időintervallum után. A hívás csak "nyugalmi állapotban" történik, vagyis abban a pillanatban, amikor a program nem hajt végre semmilyen műveletet. A várakozási kezelő hívása a rendszer kilépéséig vagy a globális környezet DisableWaitHandler metódusának meghívásáig folytatódik.
Code 1C v 8.x Procedure ReportSalesDay()
// ...
Vége eljárás

//...
ConnectWaitingHandler("Napi értékesítési jelentés", 60); // minden perc
Code 1C v 8.x // Egy tipikus ellenőrzési dyn. konfiguráció frissítések 20 percenként.
ConnectWaitingHandler("WaitingHandlerCheckingDynamicChangeIB", 20 * 60);
// csatlakoztassa az adatcsere-kezelőt
ConnectWaitingHandler("CheckDataExchange", hlVariableValue("hlNumber of Exchange PollSeconds"));
ConnectWaitingHandler("CheckConnectionRequestResponses", 86400); // = 24 (óra) * 60 (perc) * 60 (mp) = 1 nap

Formához
Code 1C v 8.x ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Lehetőségek:
<ИмяПроцедуры>(kötelező) Típus: String. A várakozási kezelőként való csatlakozáshoz szükséges eljárás neve.
<Интервал>(kötelező) Típus: Szám. Időintervallum másodpercben, 1/10 másodperc pontossággal, amely után az eljáráshívás megtörténik (pozitív szám). Ha 1-nél kisebb értéket adunk meg, akkor a harmadik paraméter értékének True-nak kell lennie.
<Однократно>(nem kötelező) Típus: Logikai. A várakozó egyszeri kivégzésének jele. 0 Igaz – a megadott várakozási kezelő egyszer végrehajtásra kerül. Alapértelmezett érték: False

Leírás:
A megadott eljárást várakozáskezelőként kapcsolja össze. Az eljárást a rendszer a rendszer időtúllépési időszakában hívja meg minden alkalommal, amikor a megadott időintervallum lejár.

Elérhetőség:
Kövér kliens.
Jegyzet:
A várakozási kezelő hívása az űrlap bezárásáig vagy az űrlap DisableWaitHandler metódusának meghívásáig folytatódik.
Példa:
Code 1C v 8.x ConnectWaitingHandler("WileWaiting", 1);
Code 1C v 8.x Form.mAutosave Interval = 300; // 5 perc
Ha Shape.mAutosave Interval<>0 Akkor
Form.ConnectWaitingHandler("EventHandlerBy Timer", Int(Form.mAutosave Interval * 60));
EndIf;

Feldolgozásra vár az 1C:Enterprise rendszerben, amint az a dokumentációból következik, úgy van kialakítva, hogy meghatározott időközönként periodikusan végrehajtsa a globális moduleljárást. A futtatandó kód így fog kinézni:
Code 1C v 7.x HandlingWaiting("UpdateCounter_",1);
Ahol "UpdateCounter_"- a globális modul eljárásának neve, amely 1 másodperces időközönként indul el. (a második paraméter egyenlő 1-gyel)

De! A probléma az, hogy a várakozási feldolgozást csak egyszer lehet elindítani. Az újraindítás törli az előzőt. Más szóval, ha például időzítő feldolgozást szeretne végezni az eltelt idő számlálására, akkor csak egy időzítőt indíthat el, mert a második időzítő elindítása leállítja az elsőt. De mi van akkor, ha 2, 3 vagy több ilyen időzítőt kell egyszerre futtatnia? Vagy továbbra is rendszeresen ellenőriznie kell a dokumentumok állapotát?

Van kijárat! A várakozási feldolgozást az űrlapkontextusban kell futtatni, hogy leválaszthassa ezt a szálat a globális környezetről. És akkor lehetővé válik a helyi modul eljárás időszakos elindítása, pl. feldolgozása űrlapmoduljában található eljárás.

A futtatandó kód így fog kinézni:
Code 1C v 7.x Form.ProcessingWaiting("UpdateCounter_",1);
Ahol "UpdateCounter_"- a feldolgozási űrlap helyi moduljának eljárásának megnevezése, amely 1 másodperces időközönként indul el. (a második paraméter egyenlő 1-gyel)
Így minden feldolgozásnál elindíthatja a saját várakozási feldolgozást, amely addig működik, amíg az űrlap nyitva van.

Használhatók az űrlapok Code 1C v 8.x Form.ProcessingWaiting("ProcedureName",StartTime) ,
ahol ProcedureName a StartTime másodpercek után lefutó eljárás neve
Magában az eljárásban be kell illesztenie a Code 1C v 8.x Form.ProcessingWaiting("ProcedureName",0) kódot a várakozás leállításához (természetesen a szükséges feltételek teljesülése után).
Forrás

Code 1C v 8.2 UE ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Lehetőségek:
<ИмяПроцедуры>
<Интервал>(kötelező) Típus: Szám. Az az időintervallum másodpercben, 1/10 másodperc pontossággal, amely után az eljáráshívás megtörténik (pozitív szám) Ha 1-nél kisebb értéket adunk meg, akkor a harmadik paraméter értékének True-nak kell lennie.
<Однократно>(nem kötelező) Típus: Logikai. A várakozó egyszeri kivégzésének jele.
Igaz – a megadott várakozási kezelő egyszer végrehajtásra kerül. Alapértelmezett érték: False
Leírás: A megadott eljárást várakozáskezelőként csatlakoztatja. Az eljárást a rendszer a rendszer időtúllépési időszakában hívja meg minden alkalommal, amikor a megadott időintervallum lejár.

Elérhetőség:
Vékony kliens, webkliens, vastag kliens.

Jegyzet:
A várakozási kezelő hívása az űrlap bezárásáig vagy az űrlap DisableWaitHandler metódusának meghívásáig folytatódik. Code 1C v 8.2 UE DisableWaitingHandler(<ИмяПроцедуры>)

Kód 1C v 8.2 UP
&AtClient
Procedure WrapperHandler()
ProcessWaiting();
Vége eljárás

&A szerveren
Procedure Process Waiting()
// tegye meg, amit szükséges
Vége eljárás

//....
ConnectWaitingHandler("HandlerShell", 3, igaz);

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Hívást kapcsol egy felügyelt alkalmazásmodul (normál alkalmazásmodul) vagy globális megosztott modul megadott eljárásához meghatározott időintervallumban. A hívás csak "nyugalmi állapotban" történik, vagyis abban a pillanatban, amikor a program nem hajt végre semmilyen műveletet. A várakozási kezelő hívása a rendszer kilépéséig vagy a globális környezet DisableWaitHandler metódusának meghívásáig folytatódik.
Code 1C v 8.x Procedure ReportSalesDay()
// ...
Vége eljárás

//...
ConnectWaitingHandler("Napi értékesítési jelentés", 60); // minden perc
Code 1C v 8.x // Egy tipikus ellenőrzési dyn. konfiguráció frissítések 20 percenként.
ConnectWaitingHandler("WaitingHandlerCheckingDynamicChangeIB", 20 * 60);
// csatlakoztassa az adatcsere-kezelőt
ConnectWaitingHandler("CheckDataExchange", hlVariableValue("hlNumber of Exchange PollSeconds"));
ConnectWaitingHandler("CheckConnectionRequestResponses", 86400); // = 24 (óra) * 60 (perc) * 60 (mp) = 1 nap

Formához
Code 1C v 8.x ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Lehetőségek:
<ИмяПроцедуры>(kötelező) Típus: String. A várakozási kezelőként való csatlakozáshoz szükséges eljárás neve.
<Интервал>(kötelező) Típus: Szám. Időintervallum másodpercben, 1/10 másodperc pontossággal, amely után az eljáráshívás megtörténik (pozitív szám). Ha 1-nél kisebb értéket adunk meg, akkor a harmadik paraméter értékének True-nak kell lennie.
<Однократно>(nem kötelező) Típus: Logikai. A várakozó egyszeri kivégzésének jele. 0 Igaz – a megadott várakozási kezelő egyszer végrehajtásra kerül. Alapértelmezett érték: False

Leírás:
A megadott eljárást várakozáskezelőként kapcsolja össze. Az eljárást a rendszer a rendszer időtúllépési időszakában hívja meg minden alkalommal, amikor a megadott időintervallum lejár.

Elérhetőség:
Kövér kliens.
Jegyzet:
A várakozási kezelő hívása az űrlap bezárásáig vagy az űrlap DisableWaitHandler metódusának meghívásáig folytatódik.
Példa:
Code 1C v 8.x ConnectWaitingHandler("WileWaiting", 1);
Code 1C v 8.x Form.mAutosave Interval = 300; // 5 perc
Ha Shape.mAutosave Interval<>0 Akkor
Form.ConnectWaitingHandler("EventHandlerBy Timer", Int(Form.mAutosave Interval * 60));
EndIf;

Feldolgozásra vár az 1C:Enterprise rendszerben, amint az a dokumentációból következik, úgy van kialakítva, hogy meghatározott időközönként periodikusan végrehajtsa a globális moduleljárást. A futtatandó kód így fog kinézni:
Code 1C v 7.x HandlingWaiting("UpdateCounter_",1);
Ahol "UpdateCounter_"- a globális modul eljárásának neve, amely 1 másodperces időközönként indul el. (a második paraméter egyenlő 1-gyel)

De! A probléma az, hogy a várakozási feldolgozást csak egyszer lehet elindítani. Az újraindítás törli az előzőt. Más szóval, ha például időzítő feldolgozást szeretne végezni az eltelt idő számlálására, akkor csak egy időzítőt indíthat el, mert a második időzítő elindítása leállítja az elsőt. De mi van akkor, ha 2, 3 vagy több ilyen időzítőt kell egyszerre futtatnia? Vagy továbbra is rendszeresen ellenőriznie kell a dokumentumok állapotát?

Van kijárat! A várakozási feldolgozást az űrlapkontextusban kell futtatni, hogy leválaszthassa ezt a szálat a globális környezetről. És akkor lehetővé válik a helyi modul eljárás időszakos elindítása, pl. feldolgozása űrlapmoduljában található eljárás.

A futtatandó kód így fog kinézni:
Code 1C v 7.x Form.ProcessingWaiting("UpdateCounter_",1);
Ahol "UpdateCounter_"- a feldolgozási űrlap helyi moduljának eljárásának megnevezése, amely 1 másodperces időközönként indul el. (a második paraméter egyenlő 1-gyel)
Így minden feldolgozásnál elindíthatja a saját várakozási feldolgozást, amely addig működik, amíg az űrlap nyitva van.

Használhatók az űrlapok Code 1C v 8.x Form.ProcessingWaiting("ProcedureName",StartTime) ,
ahol ProcedureName a StartTime másodpercek után lefutó eljárás neve
Magában az eljárásban be kell illesztenie a Code 1C v 8.x Form.ProcessingWaiting("ProcedureName",0) kódot a várakozás leállításához (természetesen a szükséges feltételek teljesülése után).
Forrás