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ásA 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