Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • Željezo
  • Obrada na čekanju 1s 8.3. “blinkanje” sučelja, ili lanci asinkronih poziva

Obrada na čekanju 1s 8.3. “blinkanje” sučelja, ili lanci asinkronih poziva

1C platforma nam pruža mogućnost asinkronog pozivanja procedura, što se ponekad može koristiti za jednostavne, ali zabavne stvari. Na primjer, možete "treptati" sve što ima boju ili bilo kakvu mogućnost promjene vizualnog izgleda. Štoviše, možete koristiti ili jednostavniji, ali nekontrolirani mehanizam, ili konstruirati zanimljiv lanac asinkronih poziva i dati mu željeno ponašanje.

Ovdje, naravno, govorimo o ConnectWaitingHandler() proceduri.

Da vas podsjetim na sintaksu postupka:

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

Štoviše, ako navedete interval manji od sekunde, postupak se mora pokrenuti jednom. Ovdje gubimo kontrolu nad tijekom izvršavanja i gubimo mogućnost da ga "prilagodimo" (fleksibilno, pojedinačno konfiguriramo).

No, to se ograničenje lako prevladava.

Da mi misli ne bi odlutale, odmah ću dati jednostavan primjer i objasniti ga.

Recimo da imamo dokument proračunske tablice na obrascu i želimo "trepnuti" neko njegovo područje 5 puta.

/////////////////// // // “Trepnite” područjem dokumenta proračunske tablice 5 puta, s intervalom od pola sekunde // //// /////// ///////// &Na klijentovom postupku BlinkArea (naredba) mf Koliko puta trepnuti = 3; // Brojač. Atribut obrasca, “vidljiv” u procedurama rukovatelja čekanjem ConnectWaitHandler("ShowAreaSelection", 0.1, True); // Također možete izravno pozvati EndProcedure &Na klijentskoj proceduri ShowArea Selection() Area = Object.TD.Area(mfFirstDataLine, mfFirstDataColumn, mfLastDataLine, mfLastDataColumn); Obrub = Novi redak (TableDocumentCellLineType.Double); Area.Circle(Border, Border, Border, Border); // Ocrtaj područje mfKoliko puta treba trepnuti = mfKoliko puta treba trepnuti - 1; // Smanjite brojač Connect WaitHandler("RemoveArea Allocation", 0.5, True); // Povežite lanac asinkronih poziva Kraj procedure & Na klijentskoj proceduri Ukloni područje odabira() Područje = Object.TD.Area(mfFirstDataLine, mfFirstDataColumn, mfLastDataLine, mfLastDataColumn); Obrub = Novi redak (TableDocumentCellLineType.NoLine); Area.Circle(Border, Border, Border, Border); // Ukloni obris područja If mf Koliko puta trepnuti > 0 Then Connect WaitHandler("Show Area Selection", 0.5, True); // Ponovi onoliko koliko je ostalo na brojaču EndIf; Kraj postupka

Jedini uvjet je da varijabla brojača mfHow Many Times Blink bude "vidljiva" iz procedura koje pokrećemo asinkrono. U ovom slučaju, varijabla je atribut forme.

Pažljivi čitatelj mogao je primijetiti da formiranjem ovakvih lanaca ubijamo dvije muhe jednim udarcem:

  • Zaobilazimo ograničenje ponavljanja poziva procedure s vrijednostima intervala manjim od sekunde;
  • Imamo mogućnost formiranja lanaca različitih duljina i složenosti:
    • povezati rukovatelja čekanjem izravno u samoj proceduri rukovatelja čekanjem;
    • pobrinite se da su ti postupci međusobno povezani;
    • organizirati složeniju strukturu lanaca poziva;
    • beskrajno komplicirati varijabilnost upravljanja pozivima (na primjer, promijeniti ne samo njihove brojače unutar poziva, već i vrijednosti intervala, stilove dizajna (tako da 🌈 svjetluca poput duge).

Unatoč jednostavnosti opisane metode, u njoj se krije znatan potencijal.

U 2017. godini fleksibilnije upravljanje programskim ponašanjem postalo je moderno.

Kod 1C v 8.2 UE ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Mogućnosti:
<ИмяПроцедуры>
<Интервал>(obavezno) Tip: Broj. Vremenski interval u sekundama, točan do 1/10 sekunde, nakon čega će se procedura pozvati (pozitivan broj). Ako je navedena vrijednost manja od 1, tada vrijednost trećeg parametra mora biti True.
<Однократно>(neobavezno) Tip: Booleov. Znak jednokratnog izvršenja voditelja čekanja.
Istina - navedeni rukovatelj čekanjem izvršit će se jednom. Zadano: False
Opis: povezuje navedeni postupak kao rukovatelj čekanjem. Procedura će se pozivati ​​tijekom perioda čekanja sustava svaki put kada istekne navedeni vremenski interval.

Dostupnost:
Tanki klijent, web klijent, debeli klijent.

Bilješka:
Poziv rukovatelju čekanja nastavlja se sve dok se obrazac ne zatvori ili dok se ne pozove metoda obrasca DisableWaitHandler. Kod 1C v 8.2 UE DisableWaitingHandler(<ИмяПроцедуры>)

Kod 1C v 8.2 UP
&NaKlijentu
Procedura ShellHandler()
Proces Čeka();
Kraj postupka

&Na poslužitelju
Procedura ProcesWaiting()
// učiniti sve što je potrebno
Kraj postupka

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

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Povezuje poziv na navedenu proceduru upravljanog aplikacijskog modula (običnog aplikacijskog modula) ili globalnog dijeljenog modula u određenom vremenskom intervalu. Poziv će biti upućen samo u "stanju mirovanja", odnosno u vrijeme kada program ne izvodi nikakve radnje. Pozivanje rukovatelja čekanjem nastavlja se sve dok se sustav ne isključi ili dok se ne pozove metoda DisableWaitHandler globalnog konteksta.
Kod 1C v 8.x Procedura Sales ReportDay()
// ...
Kraj postupka

//...
ConnectWaitingHandler("DaySalesReport", 60); // svake minute
Kod 1C v 8.x // U standardnoj provjeri dinamičnosti. konfiguracija se ažurira svakih 20 minuta.
ConnectWaitingHandler("IB DynamicChangeCheckWaitingHandler", 20 * 60);
// povezivanje obrađivača razmjene podataka
ConnectWaitingHandler("Provjera razmjene podataka", chValueVariable("chNumberofSecondsPollExchange"));
ConnectWaitingHandler("Provjeri odgovore na aplikacije za povezivanje", 86400); // = 24 (h) * 60 (min) * 60 (sek) = 1 dan

Za obrazac
Kod 1C v 8.x ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Mogućnosti:
<ИмяПроцедуры>(obavezno) Tip: niz. Naziv procedure koja se povezuje kao rukovatelj čekanjem.
<Интервал>(obavezno) Tip: Broj. Vremenski interval u sekundama, točan do 1/10 sekunde, nakon čega će se postupak pozvati (pozitivan broj). Ako je navedena vrijednost manja od 1, tada vrijednost trećeg parametra mora biti True.
<Однократно>(neobavezno) Tip: Booleov. Znak jednokratnog izvršenja voditelja čekanja. 0True - navedeni rukovatelj čekanjem izvršit će se jednom. Zadano: False

Opis:
Povezuje navedeni postupak kao rukovatelj čekanjem. Procedura će se pozivati ​​tijekom perioda čekanja sustava svaki put kada istekne navedeni vremenski interval.

Dostupnost:
Debeli klijent.
Bilješka:
Poziv rukovatelju čekanja nastavlja se sve dok se obrazac ne zatvori ili dok se ne pozove metoda obrasca DisableWaitHandler.
Primjer:
Kod 1C v 8.x ConnectWaitingHandler("WhenWaiting", 1);
Kod 1C v 8.x Form.mAutosave Interval = 300; // 5 minuta
Ako Form.mAutosave Interval<>0 Zatim
Form.ConnectWaitingHandler("TimerEventHandler", Int(Form.mAutoSaveInterval * 60));
završi ako;

Obrada na čekanju u sustavu 1C:Enterprise, kako slijedi iz dokumentacije, namijenjen je periodičnom izvršavanju procedure globalnog modula sa zadanim vremenskim intervalom. Kod za pokretanje izgledat će ovako:
Kod 1C v 7.x Čeka se obrada ("UpdateCounter_",1);
Gdje "Brojač ažuriranja_"- naziv procedure globalnog modula koja će se pokretati svake 1 sekunde. (drugi parametar jednak 1)

Ali! Problem je u tome što obradu čekanja možete pokrenuti samo jednom. Ponovno pokretanje će poništiti prethodno. Drugim riječima, ako želite napraviti, na primjer, obradu timera za brojanje proteklog vremena, tada možete pokrenuti samo jedan mjerač vremena, jer pokretanje drugog mjerača vremena zaustavit će prvi. Ali što ako trebate pokrenuti 2, 3 ili više ovakvih mjerača vremena u isto vrijeme? Ili ipak morate povremeno skenirati status dokumenata?

Postoji izlaz! Obrada čekanja mora se pokrenuti u kontekstu obrasca kako bi se ova nit odvojila od globalnog konteksta. Tada će biti moguće povremeno pokretati proceduru lokalnog modula, tj. postupak koji se nalazi u modulu vašeg obrasca za obradu.

Kod za pokretanje izgledat će ovako:
Kod 1C v 7.x Form.Waiting Processing("UpdateCounter_",1);
Gdje "Brojač ažuriranja_"- naziv procedure lokalnog modula obrasca koji će se pokretati u intervalima od 1 sekunde. (drugi parametar jednak 1)
Dakle, u svakoj obradi možete pokrenuti vlastitu obradu čekanja, koja će raditi sve dok je obrazac otvoren.

Možete ga koristiti u obrascima Code 1C v 8.x Form.Waiting Processing("ProcedureName",StartTime) ,
gdje je ProcedureName naziv procedure koja se pokreće nakon StartTime sekundi
U samu proceduru potrebno je ubaciti Code 1C v 8.x Form.Waiting Processing("ProcedureName",0) kako bi se zaustavila obrada na čekanju (naravno, nakon što su ispunjeni potrebni uvjeti).
Izvor

Kod 1C v 8.2 UE ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Mogućnosti:
<ИмяПроцедуры>
<Интервал>(obavezno) Tip: Broj. Vremenski interval u sekundama, točan do 1/10 sekunde, nakon čega će se procedura pozvati (pozitivan broj). Ako je navedena vrijednost manja od 1, tada vrijednost trećeg parametra mora biti True.
<Однократно>(neobavezno) Tip: Booleov. Znak jednokratnog izvršenja voditelja čekanja.
Istina - navedeni rukovatelj čekanjem izvršit će se jednom. Zadano: False
Opis: povezuje navedeni postupak kao rukovatelj čekanjem. Procedura će se pozivati ​​tijekom perioda čekanja sustava svaki put kada istekne navedeni vremenski interval.

Dostupnost:
Tanki klijent, web klijent, debeli klijent.

Bilješka:
Poziv rukovatelju čekanja nastavlja se sve dok se obrazac ne zatvori ili dok se ne pozove metoda obrasca DisableWaitHandler. Kod 1C v 8.2 UE DisableWaitingHandler(<ИмяПроцедуры>)

Kod 1C v 8.2 UP
&NaKlijentu
Procedura ShellHandler()
Proces Čeka();
Kraj postupka

&Na poslužitelju
Procedura ProcesWaiting()
// učiniti sve što je potrebno
Kraj postupka

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

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Povezuje poziv na navedenu proceduru upravljanog aplikacijskog modula (običnog aplikacijskog modula) ili globalnog dijeljenog modula u određenom vremenskom intervalu. Poziv će biti upućen samo u "stanju mirovanja", odnosno u vrijeme kada program ne izvodi nikakve radnje. Pozivanje rukovatelja čekanjem nastavlja se sve dok se sustav ne isključi ili dok se ne pozove metoda DisableWaitHandler globalnog konteksta.
Kod 1C v 8.x Procedura Sales ReportDay()
// ...
Kraj postupka

//...
ConnectWaitingHandler("DaySalesReport", 60); // svake minute
Kod 1C v 8.x // U standardnoj provjeri dinamičnosti. konfiguracija se ažurira svakih 20 minuta.
ConnectWaitingHandler("IB DynamicChangeCheckWaitingHandler", 20 * 60);
// povezivanje obrađivača razmjene podataka
ConnectWaitingHandler("Provjera razmjene podataka", chValueVariable("chNumberofSecondsPollExchange"));
ConnectWaitingHandler("Provjeri odgovore na aplikacije za povezivanje", 86400); // = 24 (h) * 60 (min) * 60 (sek) = 1 dan

Za obrazac
Kod 1C v 8.x ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Mogućnosti:
<ИмяПроцедуры>(obavezno) Tip: niz. Naziv procedure koja se povezuje kao rukovatelj čekanjem.
<Интервал>(obavezno) Tip: Broj. Vremenski interval u sekundama, točan do 1/10 sekunde, nakon čega će se postupak pozvati (pozitivan broj). Ako je navedena vrijednost manja od 1, tada vrijednost trećeg parametra mora biti True.
<Однократно>(neobavezno) Tip: Booleov. Znak jednokratnog izvršenja voditelja čekanja. 0True - navedeni rukovatelj čekanjem izvršit će se jednom. Zadano: False

Opis:
Povezuje navedeni postupak kao rukovatelj čekanjem. Procedura će se pozivati ​​tijekom perioda čekanja sustava svaki put kada istekne navedeni vremenski interval.

Dostupnost:
Debeli klijent.
Bilješka:
Poziv rukovatelju čekanja nastavlja se sve dok se obrazac ne zatvori ili dok se ne pozove metoda obrasca DisableWaitHandler.
Primjer:
Kod 1C v 8.x ConnectWaitingHandler("WhenWaiting", 1);
Kod 1C v 8.x Form.mAutosave Interval = 300; // 5 minuta
Ako Form.mAutosave Interval<>0 Zatim
Form.ConnectWaitingHandler("TimerEventHandler", Int(Form.mAutoSaveInterval * 60));
završi ako;

Obrada na čekanju u sustavu 1C:Enterprise, kako slijedi iz dokumentacije, namijenjen je periodičnom izvršavanju procedure globalnog modula sa zadanim vremenskim intervalom. Kod za pokretanje izgledat će ovako:
Kod 1C v 7.x Čeka se obrada ("UpdateCounter_",1);
Gdje "Brojač ažuriranja_"- naziv procedure globalnog modula koja će se pokretati svake 1 sekunde. (drugi parametar jednak 1)

Ali! Problem je u tome što obradu čekanja možete pokrenuti samo jednom. Ponovno pokretanje će poništiti prethodno. Drugim riječima, ako želite napraviti, na primjer, obradu timera za brojanje proteklog vremena, tada možete pokrenuti samo jedan mjerač vremena, jer pokretanje drugog mjerača vremena zaustavit će prvi. Ali što ako trebate pokrenuti 2, 3 ili više ovakvih mjerača vremena u isto vrijeme? Ili ipak morate povremeno skenirati status dokumenata?

Postoji izlaz! Obrada čekanja mora se pokrenuti u kontekstu obrasca kako bi se ova nit odvojila od globalnog konteksta. Tada će biti moguće povremeno pokretati proceduru lokalnog modula, tj. postupak koji se nalazi u modulu vašeg obrasca za obradu.

Kod za pokretanje izgledat će ovako:
Kod 1C v 7.x Form.Waiting Processing("UpdateCounter_",1);
Gdje "Brojač ažuriranja_"- naziv procedure lokalnog modula obrasca koji će se pokretati u intervalima od 1 sekunde. (drugi parametar jednak 1)
Dakle, u svakoj obradi možete pokrenuti vlastitu obradu čekanja, koja će raditi sve dok je obrazac otvoren.

Možete ga koristiti u obrascima Code 1C v 8.x Form.Waiting Processing("ProcedureName",StartTime) ,
gdje je ProcedureName naziv procedure koja se pokreće nakon StartTime sekundi
U samu proceduru potrebno je ubaciti Code 1C v 8.x Form.Waiting Processing("ProcedureName",0) kako bi se zaustavila obrada na čekanju (naravno, nakon što su ispunjeni potrebni uvjeti).
Izvor

Najbolji članci na temu