1c kā uzzināt par gaidīšanas apstrādātāja izpildi. "mirgojošs" interfeiss vai asinhrono zvanu ķēdes

Kods 1C v 8.2 UE ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Parametri:
<ИмяПроцедуры>
<Интервал>(obligāti) Veids: numurs. Laika intervāls sekundēs, ar precizitāti līdz 1/10 sekundes, pēc kura tiks veikts procedūras izsaukums (pozitīvs skaitlis). Ja ir norādīta vērtība, kas ir mazāka par 1, tad trešā parametra vērtībai jābūt True.
<Однократно>(pēc izvēles) Veids: Būla. Pazīme par vienu gaidīšanas izpildītāja izpildi.
Taisnība – norādītais gaidīšanas apstrādātājs tiks izpildīts vienu reizi. Noklusējuma vērtība: False
Apraksts: savieno norādīto procedūru kā gaidīšanas apstrādātāju. Procedūra tiks izsaukta sistēmas taimauta periodā katru reizi, kad būs pagājis norādītais laika intervāls.

Pieejamība:
Plāns klients, tīmekļa klients, biezs klients.

Piezīme:
Izsaukums gaidīšanas apstrādātājam turpinās, līdz veidlapa tiek aizvērta vai tiek izsaukta veidlapas metode DisableWaitHandler. Kods 1C v 8.2 UE DisableWaitingHandler(<ИмяПроцедуры>)

Kods 1C v 8.2 UP
&AtClient
Procedūras iesaiņojuma apstrādātājs()
ProcessWaiting();
Beigās Procedūra

&Serverī
Procedūra Process Waiting ()
// dari visu, kas vajadzīgs
Beigās Procedūra

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

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Savieno izsaukumu ar norādīto pārvaldītās lietojumprogrammas moduļa (parastā lietojumprogrammas moduļa) vai globālā koplietotā moduļa procedūru noteiktā laika intervālā. Zvans tiks veikts tikai "mierīgā stāvoklī", tas ir, tajā brīdī, kad programma neveic nekādas darbības. Izsaukums gaidīšanas apstrādātājam turpinās, līdz sistēma iziet vai tiek izsaukta globālā konteksta metode DisableWaitHandler.
Kods 1C v 8.x Procedure ReportSalesDaily()
// ...
Beigās Procedūra

//...
ConnectWaitingHandler ("Ikdienas pārdošanas pārskats", 60); // katru minūti
Kods 1C v 8.x // Tipiskā pārbaudes dyn. konfigurācijas atjauninājumi ik pēc 20 minūtēm.
ConnectWaitingHandler("WaitingHandlerCheckingDynamicChangeIB", 20 * 60);
// savienojiet datu apmaiņas apstrādātāju
ConnectWaitingHandler("CheckDataExchange", hlVariableValue("hlApmaiņas aptauju sekunžu skaits"));
ConnectWaitingHandler("CheckConnectionRequestResponses", 86400); // = 24(h) * 60(min) * 60(s) = 1 diena

Formai
Kods 1C v8.x ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Parametri:
<ИмяПроцедуры>(obligāti) Veids: Virkne. Procedūras nosaukums, kas jāpievieno kā gaidīšanas apstrādātājs.
<Интервал>(obligāti) Veids: numurs. Laika intervāls sekundēs, ar precizitāti līdz 1/10 sekundes, pēc kura tiks veikts procedūras izsaukums (pozitīvs cipars). Ja ir norādīta vērtība, kas ir mazāka par 1, tad trešā parametra vērtībai ir jābūt True.
<Однократно>(pēc izvēles) Veids: Būla. Pazīme par vienu gaidīšanas izpildītāja izpildi. 0 True — norādītais gaidīšanas apstrādātājs tiks izpildīts vienu reizi. Noklusējuma vērtība: False

Apraksts:
Savieno norādīto procedūru kā gaidīšanas apstrādātāju. Procedūra tiks izsaukta sistēmas taimauta periodā katru reizi, kad būs pagājis norādītais laika intervāls.

Pieejamība:
Resnais klients.
Piezīme:
Izsaukums gaidīšanas apstrādātājam turpinās, līdz veidlapa tiek aizvērta vai tiek izsaukta veidlapas metode DisableWaitHandler.
Piemērs:
Kods 1C v 8.x ConnectWaitingHandler ("Gaidīšanas laikā", 1);
Kods 1C v 8.x Form.mAutosave Interval = 300; // 5 minūtes
Ja Shape.mAutosave Interval<>0 Tad
Form.ConnectWaitingHandler("EventHandlerBy Timer", Int(Form.mAutosave Interval * 60));
EndIf;

Gaida apstrādi sistēmā 1C:Enterprise, kā izriet no dokumentācijas, ir paredzēts, lai periodiski izpildītu globālā moduļa procedūru ar noteiktu laika intervālu. Palaižamais kods izskatīsies šādi:
Kods 1C v 7.x HandlingWaiting("UpdateCounter_",1);
Kur "UpdateCounter_"- globālā moduļa procedūras nosaukums, kas tiks palaists ik pēc 1 sekundes. (otrais parametrs vienāds ar 1)

Bet! Problēma ir tā, ka gaidīšanas apstrādi var sākt tikai vienu reizi. Restartēšana atcels iepriekšējo. Citiem vārdiem sakot, ja vēlaties veikt, piemēram, taimera apstrādi pagājušā laika skaitīšanai, tad varat palaist tikai vienu taimeri, jo ieslēdzot otro taimeri, tiks apturēts pirmais. Bet ko darīt, ja jums vienlaikus jāpalaiž 2, 3 vai vairāk no šiem taimeriem? Vai arī jums joprojām ir periodiski jāskenē dokumentu statuss?

Ir izeja! Gaidīšanas apstrāde ir jāpalaiž veidlapas kontekstā, lai atsaistītu šo pavedienu no globālā konteksta. Un tad būs iespējams periodiski palaist lokālā moduļa procedūru, t.i. procedūra, kas atrodas jūsu apstrādes veidlapas modulī.

Palaižamais kods izskatīsies šādi:
Kods 1C v 7.x Form.ProcessingWaiting("UpdateCounter_",1);
Kur "UpdateCounter_"- apstrādes veidlapas lokālā moduļa procedūras nosaukums, kas tiks palaists ik pēc 1 sekundes. (otrais parametrs vienāds ar 1)
Tādējādi katrā apstrādē varat sākt savu gaidīšanas apstrādi, kas darbosies tik ilgi, kamēr forma būs atvērta.

Var izmantot veidlapas Kods 1C v 8.x Form.ProcessingWaiting("ProcedureName",StartTime) ,
kur ProcedureName ir tās procedūras nosaukums, kas tiek palaista pēc StartTime sekundēm
Pašā procedūrā ir jāievieto kods 1C v 8.x Form.ProcessingWaiting("ProcedureName",0), lai apturētu gaidīšanas apstrādi (protams, pēc tam, kad ir izpildīti nepieciešamie nosacījumi).
Avots

Kods 1C v 8.2 UE ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Parametri:
<ИмяПроцедуры>
<Интервал>(obligāti) Veids: numurs. Laika intervāls sekundēs, ar precizitāti līdz 1/10 sekundes, pēc kura tiks veikts procedūras izsaukums (pozitīvs skaitlis). Ja ir norādīta vērtība, kas ir mazāka par 1, tad trešā parametra vērtībai jābūt True.
<Однократно>(pēc izvēles) Veids: Būla. Pazīme par vienu gaidīšanas izpildītāja izpildi.
Taisnība – norādītais gaidīšanas apstrādātājs tiks izpildīts vienu reizi. Noklusējuma vērtība: False
Apraksts: savieno norādīto procedūru kā gaidīšanas apstrādātāju. Procedūra tiks izsaukta sistēmas taimauta periodā katru reizi, kad būs pagājis norādītais laika intervāls.

Pieejamība:
Plāns klients, tīmekļa klients, biezs klients.

Piezīme:
Izsaukums gaidīšanas apstrādātājam turpinās, līdz veidlapa tiek aizvērta vai tiek izsaukta veidlapas metode DisableWaitHandler. Kods 1C v 8.2 UE DisableWaitingHandler(<ИмяПроцедуры>)

Kods 1C v 8.2 UP
&AtClient
Procedūras iesaiņojuma apstrādātājs()
ProcessWaiting();
Beigās Procedūra

&Serverī
Procedūra Process Waiting ()
// dari visu, kas vajadzīgs
Beigās Procedūra

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

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Savieno izsaukumu ar norādīto pārvaldītās lietojumprogrammas moduļa (parastā lietojumprogrammas moduļa) vai globālā koplietotā moduļa procedūru noteiktā laika intervālā. Zvans tiks veikts tikai "mierīgā stāvoklī", tas ir, tajā brīdī, kad programma neveic nekādas darbības. Izsaukums gaidīšanas apstrādātājam turpinās, līdz sistēma iziet vai tiek izsaukta globālā konteksta metode DisableWaitHandler.
Kods 1C v 8.x Procedure ReportSalesDaily()
// ...
Beigās Procedūra

//...
ConnectWaitingHandler ("Ikdienas pārdošanas pārskats", 60); // katru minūti
Kods 1C v 8.x // Tipiskā pārbaudes dyn. konfigurācijas atjauninājumi ik pēc 20 minūtēm.
ConnectWaitingHandler("WaitingHandlerCheckingDynamicChangeIB", 20 * 60);
// savienojiet datu apmaiņas apstrādātāju
ConnectWaitingHandler("CheckDataExchange", hlVariableValue("hlApmaiņas aptauju sekunžu skaits"));
ConnectWaitingHandler("CheckConnectionRequestResponses", 86400); // = 24(h) * 60(min) * 60(s) = 1 diena

Formai
Kods 1C v8.x ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Parametri:
<ИмяПроцедуры>(obligāti) Veids: Virkne. Procedūras nosaukums, kas jāpievieno kā gaidīšanas apstrādātājs.
<Интервал>(obligāti) Veids: numurs. Laika intervāls sekundēs, ar precizitāti līdz 1/10 sekundes, pēc kura tiks veikts procedūras izsaukums (pozitīvs cipars). Ja ir norādīta vērtība, kas ir mazāka par 1, tad trešā parametra vērtībai ir jābūt True.
<Однократно>(pēc izvēles) Veids: Būla. Pazīme par vienu gaidīšanas izpildītāja izpildi. 0 True — norādītais gaidīšanas apstrādātājs tiks izpildīts vienu reizi. Noklusējuma vērtība: False

Apraksts:
Savieno norādīto procedūru kā gaidīšanas apstrādātāju. Procedūra tiks izsaukta sistēmas taimauta periodā katru reizi, kad būs pagājis norādītais laika intervāls.

Pieejamība:
Resnais klients.
Piezīme:
Izsaukums gaidīšanas apstrādātājam turpinās, līdz veidlapa tiek aizvērta vai tiek izsaukta veidlapas metode DisableWaitHandler.
Piemērs:
Kods 1C v 8.x ConnectWaitingHandler ("Gaidīšanas laikā", 1);
Kods 1C v 8.x Form.mAutosave Interval = 300; // 5 minūtes
Ja Shape.mAutosave Interval<>0 Tad
Form.ConnectWaitingHandler("EventHandlerBy Timer", Int(Form.mAutosave Interval * 60));
EndIf;

Gaida apstrādi sistēmā 1C:Enterprise, kā izriet no dokumentācijas, ir paredzēts, lai periodiski izpildītu globālā moduļa procedūru ar noteiktu laika intervālu. Palaižamais kods izskatīsies šādi:
Kods 1C v 7.x HandlingWaiting("UpdateCounter_",1);
Kur "UpdateCounter_"- globālā moduļa procedūras nosaukums, kas tiks palaists ik pēc 1 sekundes. (otrais parametrs vienāds ar 1)

Bet! Problēma ir tā, ka gaidīšanas apstrādi var sākt tikai vienu reizi. Restartēšana atcels iepriekšējo. Citiem vārdiem sakot, ja vēlaties veikt, piemēram, taimera apstrādi pagājušā laika skaitīšanai, tad varat palaist tikai vienu taimeri, jo ieslēdzot otro taimeri, tiks apturēts pirmais. Bet ko darīt, ja jums vienlaikus jāpalaiž 2, 3 vai vairāk no šiem taimeriem? Vai arī jums joprojām ir periodiski jāskenē dokumentu statuss?

Ir izeja! Gaidīšanas apstrāde ir jāpalaiž veidlapas kontekstā, lai atsaistītu šo pavedienu no globālā konteksta. Un tad būs iespējams periodiski palaist lokālā moduļa procedūru, t.i. procedūra, kas atrodas jūsu apstrādes veidlapas modulī.

Palaižamais kods izskatīsies šādi:
Kods 1C v 7.x Form.ProcessingWaiting("UpdateCounter_",1);
Kur "UpdateCounter_"- apstrādes veidlapas lokālā moduļa procedūras nosaukums, kas tiks palaists ik pēc 1 sekundes. (otrais parametrs vienāds ar 1)
Tādējādi katrā apstrādē varat sākt savu gaidīšanas apstrādi, kas darbosies tik ilgi, kamēr forma būs atvērta.

Var izmantot veidlapas Kods 1C v 8.x Form.ProcessingWaiting("ProcedureName",StartTime) ,
kur ProcedureName ir tās procedūras nosaukums, kas tiek palaista pēc StartTime sekundēm
Pašā procedūrā ir jāievieto kods 1C v 8.x Form.ProcessingWaiting("ProcedureName",0), lai apturētu gaidīšanas apstrādi (protams, pēc tam, kad ir izpildīti nepieciešamie nosacījumi).
Avots

1C platforma sniedz mums iespēju veikt asinhronus procedūru izsaukumus, ko dažkārt var izmantot vienkāršām, bet jautrām lietām. Piemēram, jūs varat "mirkšķināt" jebko, kam ir krāsa vai jebkāda iespēja mainīt vizuālo noformējumu. Turklāt jūs varat izmantot gan vienkāršāku, bet nekontrolētu mehānismu, gan izveidot interesantu asinhrono zvanu ķēdi un iestatīt tās vēlamo darbību.

Mēs šeit, protams, runājam par procedūru ConnectWaitingHandler().

Ļaujiet man atgādināt procedūras sintaksi:

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

Turklāt, ja norādāt intervālu, kas ir mazāks par sekundi, procedūra ir jāsāk vienu reizi. Šeit mēs zaudējam kontroli pār izpildes plūsmu un zaudējam iespēju to "pielāgot" (elastīgi, individuāli).

Bet šo ierobežojumu var viegli apiet.

Lai manas domas neplīstu pa koku, uzreiz minēšu vienkāršu piemēru un paskaidrošu.

Pieņemsim, ka veidlapā ir izklājlapas dokuments un mēs vēlamies 5 reizes "mirkšķināt" ar kādu no tās apgabaliem.

/////////////////// // // "Mirkšķiniet" izklājlapas dokumenta apgabalu 5 reizes ar pussekundes intervālu // /// //////// ///////// &Klienta procedūrā Mirkšķināšanas apgabals (komanda) mfBlink Cik = 3; // Skaitītājs. Veidlapas atribūts "redzams" gaidīšanas apstrādātāja procedūrās ConnectWaitHandler("ShowAreaSelect", 0.1, True); // Varat arī tieši izsaukt EndProcedure &OnClient procedūru ShowAreaSelect() Area = Object.AP.Area(mfFirstDataRow, mfFirstDataColumn, mfLastDataRow, mfLastDataColumn); Robeža = New Line(LineTypeSpreadsheetDocumentCell.Double); Reģions.Robeža(Robeža, Robeža, Robeža, Robeža); // Iezīmējiet apgabalu mfBlinkTimes = mfBlinkTimes - 1; // Skaitītāja samazināšana ConnectWaitingHandler("Noņemt apgabala atlasi", 0.5, True); // Savienojiet asinhrono izsaukumu ķēdi EndProcedure &AtClient Procedūra RemoveAreaSelect() Area = Object.AP.Area(mfFirstDataRow, mfFirstDataColumn, mfLastDataRow, mfLastDataColumn); Robeža = New Line(LineTypeSpreadsheetDocumentCell.NoLine); Reģions.Robeža(Robeža, Robeža, Robeža, Robeža); // Noņemt apgabala kontūru If mfBlinkTime > 0 Then ConnectWaitingHandler("ShowArea Selection", 0.5, True); // Atkārtojiet tik daudz, cik palicis uz skaitītāja EndIf; Beigās Procedūra

Galvenā prasība ir tikai tāda, lai skaitītāja mainīgais mfCik reižuBlink būtu "redzams" no procedūrām, kuras izpildām asinhroni. V Šis gadījums mainīgais ir formas atribūts.

Uzmanīgs lasītājs var pamanīt, ka, veidojot šādas ķēdes, mēs ar vienu akmeni nogalinām divus putnus:

  • apiet procedūru atkārtojamības ierobežojumu, ja intervāla vērtības ir mazākas par sekundi;
  • Mums ir iespēja veidot dažāda garuma un sarežģītības ķēdes:
    • savienot gaidīšanas apstrādātāju tieši pašā gaidīšanas apstrādātāja procedūrā;
    • lai šādas procedūras savienotu viena ar otru;
    • organizēt sarežģītāku zvanu ķēžu struktūru;
    • bezgalīgi sarežģī zvanu pārvaldības mainīgumu (piemēram, mainiet ne tikai to skaitītājus zvanu iekšienē, bet arī intervālu vērtības, dizaina stilus (lai 🌈 mirgo kā varavīksne).

Neskatoties uz aprakstītās metodes vienkāršību, tajā slēpjas ievērojams potenciāls.

2017. gadā programmas uzvedības pārvaldība elastīgāk ir mūsdienīga.