İnterfeys və ya asinxron zənglər zəncirinin "yanıb-sönməsi". Müəyyən edilmiş vaxt intervalı ilə kodun dövri icrası - Gözləmə Processing() Gözləmə işləyicisi 1s 8.2

1C platforması bizə bəzən sadə, lakin əyləncəli işlər üçün istifadə oluna bilən prosedurları asinxron çağırmaq imkanı verir. Məsələn, siz rəngi və ya vizual görünüşünü dəyişdirmək üçün hər hansı bir qabiliyyəti olan hər şeyi "yanıb-sönə" bilərsiniz. Üstəlik, ya daha sadə, lakin idarə olunmayan mexanizmdən istifadə edə, ya da maraqlı asinxron zənglər zəncirini yarada və ona üstünlük verilən davranışı verə bilərsiniz.

Burada söhbət əlbəttə ki, ConnectWaitingHandler() prosedurundan gedir.

Prosedurun sintaksisini xatırlatmağa icazə verin:

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

Üstəlik, bir saniyədən az bir interval təyin etsəniz, prosedur bir dəfə işə salınmalıdır. Bu, icra axını üzərində nəzarəti itirdiyimiz və onu "fərdiləşdirmək" qabiliyyətini itirdiyimiz yerdir (çevik, fərdi şəkildə konfiqurasiya etmək).

Ancaq bu məhdudiyyət asanlıqla aradan qaldırılır.

Fikirlərim başıma düşməmək üçün dərhal sadə bir misal çəkib izah edəcəm.

Deyək ki, formada elektron cədvəl sənədimiz var və biz onun hansısa sahəsini 5 dəfə “yanıb-sönmək” istəyirik.

/////////////////// // // Cədvəl sənədinin sahəsini yarım saniyə fasilə ilə 5 dəfə “yanıb-söndürün” // //// /////// ///////// &Müştəri Prosedurunda BlinkArea (Əmr) mf Neçə Dəfə Yanıb-sönür = 3; // Sayğac. Forma atributu, gözləmə işləyicisi prosedurlarında "görünür" ConnectWaitHandler("ShowAreaSelection", 0.1, Doğru); // Siz həmçinin birbaşa EndProcedure &Client Prosedurasında Zəng edə bilərsiniz ShowArea Selection() Area = Object.TD.Area(mfFirstDataLine, mfFirstDataColumn, mfLastDataLine, mfLastDataColumn); Sərhəd = Yeni Xətt(TableDocumentCellLineType.Double); Ərazi.Dairə(Sərhəd, Sərhəd, Sərhəd, Sərhəd); // Sahənin konturunu mf Neçə dəfə yanıb-sönmək = mf Neçə dəfə yanıb-sönmək - 1; // Sayğacı azaldın Connect WaitHandler("RemoveArea Allocation", 0.5, True); // Asinxron zənglər zəncirini birləşdirin Prosedurun Sonu və Müştəri Prosedurunda Sahə Seçimini Silin() Area = Object.TD.Area(mfFirstDataLine, mfFirstDataColumn, mfLastDataLine, mfLastDataColumn); Sərhəd = Yeni Xətt(SpreadsheetDocumentCellLineType.NoLine); Ərazi.Dairə(Sərhəd, Sərhəd, Sərhəd, Sərhəd); // Ərazinin konturunu silin Əgər mf Neçə Dəfə Yanıb-sönürsə > 0 Sonra WaitHandler-i birləşdirin("Sahə seçimini göstər", 0.5, Doğru); // Sayğacda qalan qədər təkrarlayın EndIf; Prosedurun Sonu

Yeganə tələb odur ki, mfHow Many Times Blink sayğac dəyişəni bizim asinxron şəkildə işə saldığımız prosedurlardan “görünən” olmalıdır. Bu halda dəyişən forma atributudur.

Diqqətli oxucu, belə zəncirlərin meydana gəlməsi ilə bir daşla iki quş öldürdüyünü fərq edə bilər:

  • Bir saniyədən az interval dəyərləri ilə prosedur çağırışlarının təkrarlanmasına qoyulan məhdudiyyəti aşırıq;
  • Müxtəlif uzunluqlarda və mürəkkəblikdə zəncirlər yaratmaq qabiliyyətimiz var:
    • gözləmə işləyicisini birbaşa gözləmə prosedurunun özündə birləşdirin;
    • bu cür prosedurların bir-birinə bağlandığından əmin olun;
    • zəng zəncirlərinin daha mürəkkəb strukturunu təşkil etmək;
    • zəng idarəçiliyinin dəyişkənliyini sonsuz dərəcədə çətinləşdirir (məsələn, zənglər daxilində təkcə sayğaclarını deyil, həm də interval dəyərlərini, dizayn üslublarını dəyişdirin (🌈 göy qurşağı kimi parıldasın).

Təsvir edilən metodun sadəliyinə baxmayaraq, onda böyük potensial gizlənir.

2017-ci ildə proqram davranışını daha çevik şəkildə idarə etmək müasirdir.

Kod 1C v 8.2 UE ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Seçimlər:
<ИмяПроцедуры>
<Интервал>(tələb olunur) Növ: Nömrə. Saniyənin 1/10-u qədər dəqiq olan vaxt intervalı, bundan sonra prosedur çağırılacaq (müsbət rəqəm 1-dən kiçik dəyər göstərilibsə, üçüncü parametrin dəyəri True olmalıdır).
<Однократно>(isteğe bağlı) Növ: Boolean. Gözləmə idarəçisinin birdəfəlik icrasının əlaməti.
Doğrudur - müəyyən edilmiş gözləmə operatoru bir dəfə icra ediləcək. Defolt dəyər: Yanlış
Təsvir: Göstərilən proseduru gözləmə işləyicisi kimi birləşdirir. Prosedur, müəyyən edilmiş vaxt intervalı hər dəfə keçdikdə sistemin fasilə müddəti ərzində çağırılacaq.

Mövcudluq:
İncə müştəri, veb müştəri, qalın müştəri.

Qeyd:
Gözləmə idarəçisinə zəng forma bağlanana və ya formanın DisableWaitHandler metodu çağırılana qədər davam edir. Kod 1C v 8.2 UE DisableWaitingHandler(<ИмяПроцедуры>)

Kod 1C v 8.2 UP
&OnClient
ShellHandler() proseduru
ProcessWaiting();
Prosedurun Sonu

&Serverdə
Prosedur Prosesi Gözləmə()
// tələb olunan hər şeyi edin
Prosedurun Sonu

//....
ConnectWaitHandler("HandlerWrapper", 3, Doğrudur);

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Müəyyən edilmiş vaxt intervalında müəyyən idarə olunan proqram moduluna (müntəzəm proqram modulu) və ya qlobal paylaşılan modul proseduruna zəngi bağlayır. Zəng yalnız "istirahət vəziyyətində", yəni proqramın heç bir hərəkət etmədiyi bir vaxtda ediləcək. Gözləmə idarəçisinin çağırılması sistem bağlanana və ya qlobal kontekstin DisableWaitHandler metodu çağırılana qədər davam edir.
Code 1C v 8.x Proseduru Satış Hesabatı Günü()
// ...
Prosedurun Sonu

//...
ConnectWaitingHandler("DaySalesReport", 60); // hər dəqiqə
Kod 1C v 8.x // Standart dinamizm yoxlamasında. konfiqurasiya hər 20 dəqiqədən bir yenilənir.
ConnectWaitingHandler("IB DynamicChangeCheckWaitingHandler", 20 * 60);
// məlumat mübadiləsi işləyicisini birləşdirin
ConnectWaitingHandler("CheckingDataExchange", chValueVariable("chNumberofSecondsPollExchange"));
ConnectWaitingHandler("Bağlantı proqramlarına cavabları yoxlayın", 86400); // = 24(saat) * 60(dəq) * 60(san) = 1 gün

Forma üçün
Kod 1C v 8.x ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Seçimlər:
<ИмяПроцедуры>(tələb olunur) Növ: Simli. Gözləmə işləyicisi kimi qoşulacaq prosedurun adı.
<Интервал>(tələb olunur) Növ: Nömrə. Saniyədə vaxt intervalı, saniyənin 1/10-u qədər dəqiqdir, bundan sonra prosedur çağırılacaq (müsbət nömrə). Əgər 1-dən kiçik dəyər göstərilibsə, üçüncü parametrin qiyməti True olmalıdır.
<Однократно>(isteğe bağlı) Növ: Boolean. Gözləmə idarəçisinin birdəfəlik icrasının əlaməti. 0Doğru - müəyyən edilmiş gözləmə işləyicisi bir dəfə yerinə yetiriləcək. Defolt dəyər: Yanlış

Təsvir:
Göstərilən proseduru gözləmə işləyicisi kimi birləşdirir. Prosedur, müəyyən edilmiş vaxt intervalı hər dəfə keçdikdə sistemin fasilə müddəti ərzində çağırılacaq.

Mövcudluq:
Yağlı müştəri.
Qeyd:
Gözləmə idarəçisinə zəng forma bağlanana və ya formanın DisableWaitHandler metodu çağırılana qədər davam edir.
Misal:
Code 1C v 8.x ConnectWaitingHandler("WhenWaiting", 1);
Kod 1C v 8.x Form.mAutosave Interval = 300; // 5 dəqiqə
Əgər Form.mAutoSaveInterval<>0 Sonra
Form.ConnectWaitingHandler("EventHandlerByTimer", Int(Form.mAutoSaveInterval * 60));
endIf;

1C: Müəssisə sistemində emal gözləyir, sənədlərdən aşağıdakı kimi, qlobal modul prosedurunun müəyyən bir vaxt intervalı ilə dövri icrası üçün nəzərdə tutulmuşdur. Çalıştırılacaq kod belə görünəcək:
Kod 1C v 7.x Gözləmə Emalı("UpdateCounter_",1);
Harada "UpdateCounter_"- hər 1 saniyədən bir işə salınacaq qlobal modul prosedurunun adı. (ikinci parametr 1-ə bərabərdir)

Amma! Problem ondadır ki, gözləmə emalını yalnız bir dəfə işə sala bilərsiniz. Yenidən başlatma əvvəlkini ləğv edəcək. Başqa sözlə, məsələn, keçən vaxtı hesablamaq üçün taymer emal etmək istəyirsinizsə, onda siz yalnız bir taymer işlədə bilərsiniz, çünki ikinci taymerin işə salınması birincini dayandıracaq. Bəs eyni vaxtda bu taymerlərdən 2, 3 və ya daha çoxunu işə salmaq lazımdırsa nə etməli? Yoxsa hələ də sənədlərin statusunu vaxtaşırı skan etmək lazımdır?

Çıxış var! Bu mövzunu qlobal kontekstdən ayırmaq üçün gözləmə emalını forma kontekstində yerinə yetirmək lazımdır. Və sonra vaxtaşırı yerli modul prosedurunu işə salmaq mümkün olacaq, yəni. prosedur sizin emal formanızın modulunda yerləşir.

Çalıştırılacaq kod belə görünəcək:
Kod 1C v 7.x Forması. Gözləmə Emalı("UpdateCounter_",1);
Harada "UpdateCounter_"- 1 saniyəlik fasilələrlə işə salınacaq emal formasının yerli modulunun prosedurunun adı. (ikinci parametr 1-ə bərabərdir)
Beləliklə, hər bir emalda siz öz gözləmə emalınızı işlədə bilərsiniz, bu da forma açıq olduğu müddətdə işləyəcək.

Formalarda istifadə edə bilərsiniz Kod 1C v 8.x Forması. Gözləmə Emalı("ProsedurAdı",Başlama Saatı) ,
burada ProcedureName StartTime saniyədən sonra işləyən prosedurun adıdır
Prosedurun özündə, gözləmə prosesini dayandırmaq üçün (əlbəttə, lazımi şərtlər yerinə yetirildikdən sonra) Kod 1C v 8.x Form.Gözləmə Emalı("ProsedurAdı",0) daxil etməlisiniz.
Mənbə

Kod 1C v 8.2 UE ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Seçimlər:
<ИмяПроцедуры>
<Интервал>(tələb olunur) Növ: Nömrə. Saniyənin 1/10-u qədər dəqiq olan vaxt intervalı, bundan sonra prosedur çağırılacaq (müsbət rəqəm 1-dən kiçik dəyər göstərilibsə, üçüncü parametrin dəyəri True olmalıdır).
<Однократно>(isteğe bağlı) Növ: Boolean. Gözləmə idarəçisinin birdəfəlik icrasının əlaməti.
Doğrudur - müəyyən edilmiş gözləmə operatoru bir dəfə icra ediləcək. Defolt dəyər: Yanlış
Təsvir: Göstərilən proseduru gözləmə işləyicisi kimi birləşdirir. Prosedur, müəyyən edilmiş vaxt intervalı hər dəfə keçdikdə sistemin fasilə müddəti ərzində çağırılacaq.

Mövcudluq:
İncə müştəri, veb müştəri, qalın müştəri.

Qeyd:
Gözləmə idarəçisinə zəng forma bağlanana və ya formanın DisableWaitHandler metodu çağırılana qədər davam edir. Kod 1C v 8.2 UE DisableWaitingHandler(<ИмяПроцедуры>)

Kod 1C v 8.2 UP
&OnClient
ShellHandler() proseduru
ProcessWaiting();
Prosedurun Sonu

&Serverdə
Prosedur Prosesi Gözləmə()
// tələb olunan hər şeyi edin
Prosedurun Sonu

//....
ConnectWaitHandler("HandlerWrapper", 3, Doğrudur);

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Müəyyən edilmiş vaxt intervalında müəyyən idarə olunan proqram moduluna (müntəzəm proqram modulu) və ya qlobal paylaşılan modul proseduruna zəngi bağlayır. Zəng yalnız "istirahət vəziyyətində", yəni proqramın heç bir hərəkət etmədiyi bir vaxtda ediləcək. Gözləmə idarəçisinin çağırılması sistem bağlanana və ya qlobal kontekstin DisableWaitHandler metodu çağırılana qədər davam edir.
Code 1C v 8.x Proseduru Satış Hesabatı Günü()
// ...
Prosedurun Sonu

//...
ConnectWaitingHandler("DaySalesReport", 60); // hər dəqiqə
Kod 1C v 8.x // Standart dinamizm yoxlamasında. konfiqurasiya hər 20 dəqiqədən bir yenilənir.
ConnectWaitingHandler("IB DynamicChangeCheckWaitingHandler", 20 * 60);
// məlumat mübadiləsi işləyicisini birləşdirin
ConnectWaitingHandler("CheckingDataExchange", chValueVariable("chNumberofSecondsPollExchange"));
ConnectWaitingHandler("Bağlantı proqramlarına cavabları yoxlayın", 86400); // = 24(saat) * 60(dəq) * 60(san) = 1 gün

Forma üçün
Kod 1C v 8.x ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Seçimlər:
<ИмяПроцедуры>(tələb olunur) Növ: Simli. Gözləmə işləyicisi kimi qoşulacaq prosedurun adı.
<Интервал>(tələb olunur) Növ: Nömrə. Saniyədə vaxt intervalı, saniyənin 1/10-u qədər dəqiqdir, bundan sonra prosedur çağırılacaq (müsbət nömrə). Əgər 1-dən kiçik dəyər göstərilibsə, üçüncü parametrin qiyməti True olmalıdır.
<Однократно>(isteğe bağlı) Növ: Boolean. Gözləmə idarəçisinin birdəfəlik icrasının əlaməti. 0Doğru - müəyyən edilmiş gözləmə işləyicisi bir dəfə yerinə yetiriləcək. Defolt dəyər: Yanlış

Təsvir:
Göstərilən proseduru gözləmə işləyicisi kimi birləşdirir. Prosedur, müəyyən edilmiş vaxt intervalı hər dəfə keçdikdə sistemin fasilə müddəti ərzində çağırılacaq.

Mövcudluq:
Yağlı müştəri.
Qeyd:
Gözləmə idarəçisinə zəng forma bağlanana və ya formanın DisableWaitHandler metodu çağırılana qədər davam edir.
Misal:
Code 1C v 8.x ConnectWaitingHandler("WhenWaiting", 1);
Kod 1C v 8.x Form.mAutosave Interval = 300; // 5 dəqiqə
Əgər Form.mAutoSaveInterval<>0 Sonra
Form.ConnectWaitingHandler("EventHandlerByTimer", Int(Form.mAutoSaveInterval * 60));
endIf;

1C: Müəssisə sistemində emal gözləyir, sənədlərdən aşağıdakı kimi, qlobal modul prosedurunun müəyyən bir vaxt intervalı ilə dövri icrası üçün nəzərdə tutulmuşdur. Çalıştırılacaq kod belə görünəcək:
Kod 1C v 7.x Gözləmə Emalı("UpdateCounter_",1);
Harada "UpdateCounter_"- hər 1 saniyədən bir işə salınacaq qlobal modul prosedurunun adı. (ikinci parametr 1-ə bərabərdir)

Amma! Problem ondadır ki, gözləmə emalını yalnız bir dəfə işə sala bilərsiniz. Yenidən başlatma əvvəlkini ləğv edəcək. Başqa sözlə, məsələn, keçən vaxtı hesablamaq üçün taymer emal etmək istəyirsinizsə, onda siz yalnız bir taymer işlədə bilərsiniz, çünki ikinci taymerin işə salınması birincini dayandıracaq. Bəs eyni vaxtda bu taymerlərdən 2, 3 və ya daha çoxunu işə salmaq lazımdırsa nə etməli? Yoxsa hələ də sənədlərin statusunu vaxtaşırı skan etmək lazımdır?

Çıxış var! Bu mövzunu qlobal kontekstdən ayırmaq üçün gözləmə emalını forma kontekstində yerinə yetirmək lazımdır. Və sonra vaxtaşırı yerli modul prosedurunu işə salmaq mümkün olacaq, yəni. prosedur sizin emal formanızın modulunda yerləşir.

Çalıştırılacaq kod belə görünəcək:
Kod 1C v 7.x Forması. Gözləmə Emalı("UpdateCounter_",1);
Harada "UpdateCounter_"- 1 saniyəlik fasilələrlə işə salınacaq emal formasının yerli modulunun prosedurunun adı. (ikinci parametr 1-ə bərabərdir)
Beləliklə, hər bir emalda siz öz gözləmə emalınızı işlədə bilərsiniz, bu da forma açıq olduğu müddətdə işləyəcək.

Formalarda istifadə edə bilərsiniz Kod 1C v 8.x Forması. Gözləmə Emalı("ProsedurAdı",Başlama Saatı) ,
burada ProcedureName StartTime saniyədən sonra işləyən prosedurun adıdır
Prosedurun özündə, gözləmə prosesini dayandırmaq üçün (əlbəttə, lazımi şərtlər yerinə yetirildikdən sonra) Kod 1C v 8.x Form.Gözləmə Emalı("ProsedurAdı",0) daxil etməlisiniz.
Mənbə



Əlaqədar nəşrlər