arayüzü veya asenkron çağrı zincirlerini "yanıp sönüyor". Arayüzün veya asenkron çağrı zincirlerinin "yanıp sönmesi" İşlem bekleniyor 1s 8.3

Code 1C v 8.2 UP Connect İşleyici Beklentileri (<ИмяПроцедуры>, <Интервал>, <Однократно>)
parametreler:
<ИмяПроцедуры>
<Интервал>(gerekli) Tür: Sayı. İşlemin çağrılacağı (pozitif sayı) saniyenin 1/10'u hassasiyetle saniye cinsinden zaman aralığı.1'den küçük bir değer belirtilirse, üçüncü parametrenin değeri True olmalıdır.
<Однократно>(isteğe bağlı) Tür: Boole. Bekleme işleyicisinin bir kerelik yürütme bayrağı.
True - Belirtilen bekleme işleyicisi bir kez yürütülecek. Varsayılan değer: Yanlış
Açıklama: Belirtilen prosedürü bir bekleme işleyicisi olarak ekler. Belirtilen zaman aralığından sonra her seferinde sistem beklerken prosedür çağrılacaktır.

kullanılabilirlik:
İnce istemci, web istemcisi, kalın istemci.

Not:
Bekleme işleyicisine yapılan çağrı, form kapatılıncaya veya formun DisableWaitHandler çağrılıncaya kadar devam eder. Code 1C v 8.2 UE DisableWaitingHandler (<ИмяПроцедуры>)

Kod 1C v 8.2 YUKARI
& OnClient
WrapperHandler () Prosedürü
İşlem Bekliyor ();
Prosedürün Sonu

&Sunucuda
Prosedür Süreç Bekleme ()
// ne gerekiyorsa yap
Prosedürün Sonu

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

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Bir çağrıyı, yönetilen bir uygulama modülünün (modül) belirtilen prosedürüne bağlar. düzenli uygulama) veya belirli bir zaman aralığında genel bir ortak modül. Çağrı yalnızca "dinlenme durumunda", yani programın herhangi bir işlem yapmadığı anda gerçekleştirilecektir. Bekleme işleyicisi çağırma, sistem kapanana veya DisableWaitHandler genel bağlam yöntemi çağrılana kadar devam eder.
Kod 1C v 8.x Prosedür Günlük Satış Raporu ()
// ...
Prosedürün Sonu

//...
ConnectWaitingHandler ("ReportOverDaySales", 60); // her dakika
Kod 1C v 8.x // Standart kontrollerde dyn. yapılandırma güncellemeleri her 20 dakikada bir.
ConnectWaitingHandler ("WaitingHandlerDynamicChangeIBCheckWaiting", 20 * 60);
// bir veri alışverişi işleyicisini bağla
ConnectWaitingHandler ("DataExchangeCheck", chapVariableValue ("chapNumber ofExchangePolishSeconds"));
ConnectWaitingHandler ("Bağlantı Uygulamasında Yanıtları Kontrol Et", 86400); // = 24 (s) * 60 (dk) * 60 (sn) = 1 gün

Form için
Code 1C v 8.x ConnectWaitingHandler (<ИмяПроцедуры>, <Интервал>, <Однократно>)
parametreler:
<ИмяПроцедуры>(gerekli) Tür: Dize. Bekleme işleyicisi olarak bağlanma prosedürünün adı.
<Интервал>(gerekli) Tür: Sayı. İşlem çağrısının yapılacağı (pozitif sayı) saniyenin 1/10'u hassasiyetle saniye cinsinden zaman aralığı. Belirtilen değer 1'den küçükse, üçüncü parametrenin değeri True olmalıdır.
<Однократно>(isteğe bağlı) Tür: Boole. Bekleme işleyicisinin bir kerelik yürütme bayrağı. 0 True - Belirtilen bekleme işleyicisi bir kez yürütülecek. Varsayılan değer: Yanlış

Açıklama:
Belirtilen yordamı bir bekleme işleyicisi olarak ekler. Belirtilen zaman aralığından sonra her seferinde sistem beklerken prosedür çağrılacaktır.

kullanılabilirlik:
Kalın müşteri.
Not:
Bekleme işleyicisine yapılan çağrı, form kapatılıncaya veya formun DisableWaitHandler çağrılıncaya kadar devam eder.
Örnek:
Code 1C v 8.х ConnectWaitingHandler ("Bekliyor", 1);
Kod 1C v 8.x Formu Otomatik Kaydetme Aralığı = 300; // 5 dakika
If Form.AutoSave Aralığı<>0 Sonra
Form.ConnectWaitingHandler ("EventHandlerByTimer", Tamsayı (Form.AutoSaveInterval * 60));
EndIf;

1C: Enterprise sisteminde bekleme işlemi, belgelerden aşağıdaki gibi, genel modül prosedürünün belirli bir zaman aralığında periyodik olarak yürütülmesi için tasarlanmıştır. Çalıştırılacak kod şöyle görünecektir:
Code 1C v 7.x Beklenti İşleme ("RefreshCounter _", 1);
Neresi "YenilemeSayacı_"- 1 saniye sıklıkta başlatılacak olan global modülün prosedürünün adı. (1'e eşit ikinci parametre)

Fakat! Sorun şu ki, bekleme işlemini yalnızca bir kez çalıştırabilirsiniz. Yeniden başlatma öncekini iptal eder. Başka bir deyişle, örneğin geçen süreyi saymak için bir zamanlayıcı işlemi yapmak istiyorsanız, yalnızca bir zamanlayıcı başlatabilirsiniz, çünkü ikinci zamanlayıcıyı başlatmak ilkini durduracaktır. Ancak bu zamanlayıcılardan 2, 3 veya daha fazlasını aynı anda başlatmanız gerekirse? Yoksa yine de belgelerin durumunu periyodik olarak taramanız mı gerekiyor?

Çıkış var! Bu iş parçacığını genel bağlamdan ayırmak için form bağlamında bekleme işlemi başlatılmalıdır. Ardından yerel modülün prosedürünü periyodik olarak başlatmak mümkün olacaktır, yani. işleme formunuzun modülünde bulunan prosedür.

Çalıştırılacak kod şöyle görünecektir:
Code 1C v 7.x Form.Bekleyen İşleme ("RefreshCounter _", 1);
Neresi "YenilemeSayacı_"- 1 saniye sıklıkta başlatılacak olan işleme formunun yerel modülünün prosedürünün adı. (1'e eşit ikinci parametre)
Böylece her işlemde, form açık olduğu sürece çalışacak olan kendi bekleme işleminizi başlatabilirsiniz.

Kullanabileceğiniz formlarda Kod 1C v 8.х Form.Bekleme İşlemi ("ProsedürAdı", Başlangıç ​​Zamanı),
Burada ProsedürAdı, Başlangıç ​​saniyesinden sonra başlayan prosedürün adıdır.
Prosedürün kendisinde, bekleyen işlemeyi durdurmak için (elbette, gerekli koşullar karşılandıktan sonra) 1C v 8.x Form.Waiting Processing ("ProcedureName", 0) kodunu girmeniz gerekir.
Bir kaynak

1C platformu bize fırsatlar sunuyor asenkron çağrılar zaman zaman basit ama eğlenceli şeyler için kullanılabilen prosedürler. Örneğin, rengi olan veya görsel tasarımı değiştirme yeteneği olan her şeyi "göz kırpabilirsiniz". Ayrıca, daha basit ama kontrolsüz bir mekanizma kullanabilir veya ilginç bir asenkron çağrılar zinciri tasarlayabilir ve tercih edilen davranışını ayarlayabilirsiniz.

Burada, elbette, AttachWaitHandler() prosedüründen bahsediyoruz.

Size prosedürün sözdizimini hatırlatayım:

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

Ayrıca, bir saniyeden daha az bir aralık belirtirseniz, prosedür bir kez başlatılmalıdır. Bu, yürütme akışı üzerindeki kontrolümüzü kaybettiğimiz ve onu "özelleştirme" (esnek, bireysel) yeteneğimizi kaybettiğimiz yerdir.

Ancak bu sınırlama kolayca aşılır.

Düşünceyi ağaç boyunca yaymamak için hemen basit bir örnek verip açıklayacağım.

Diyelim ki formda bir elektronik tablo belgemiz var ve alanının bir kısmı ile 5 kez "yanıp sönmek" istiyoruz.

/////////////////// // // // // // ///////// ///////// & OnClient Prosedür Yanıp Sönme Alanı (Komut) mf Yanıp Sönme Süresi = 3; // Tezgah. Bekleme işleyicileri ConnectWaitingHandler ("ShowAreaSelection", 0.1, True); // Ayrıca EndProcedure & On İstemci Prosedüründe ShowAreaSelection () Area = Object.TD.Area (mfFirstDataString, mfFirstDataColumn, mfLastDataRow, mfLastDataColumn); Kenarlık = Yeni Satır (TabularDocumentCellLineType.Double); Region.Circle (Border, Border, Border, Border); // Alanı mfFlashMost = mfFlashMount - 1; // ConnectWaitingHandler sayacını azalt ("RemoveAreaSelection", 0.5, True); // Asenkron çağrılar zincirini bağlayın EndProcedure & İstemci Prosedüründe RemoveSelectionArea () Area = Object.TD.Area (mfFirstDataString, mfFirstDataColumn, mfLastDataRow, mfLastDataColumn); Kenarlık = Yeni Satır (TabularDocumentCellLineType.NoLine); Region.Circle (Border, Border, Border, Border); // Alanın ana hatlarını kaldırın Eğer mfSkink> 0 Sonra ConnectWaitingHandler ("ShowAreaSelection", 0.5, True); // Sayaçta kalan kadar EndIf; Prosedürün Sonu

Ana gereksinim, yalnızca mfWindBlow sayaç değişkeninin, asenkron olarak çalıştırdığımız prosedürlerden "görünür" olmasıdır. Bu durumda, değişken bir form niteliğidir.

Dikkatli bir okuyucu, bu tür zincirlerin oluşumuyla bir taşla iki kuş vurduğumuzu fark etmiş olabilir:

  • Bir saniyeden daha az aralık değerlerine sahip prosedür çağrılarının tekrarlanabilirliği üzerindeki kısıtlamayı atlıyoruz;
  • Farklı uzunluklarda ve karmaşıklıkta zincirler oluşturma yeteneğine sahibiz:
    • bir bekleme işleyicisini doğrudan bekleme işleyici prosedürünün kendisine bağlayın;
    • bu tür prosedürleri birbirine bağlamak;
    • çağrı zincirlerinin daha karmaşık bir yapısını organize etmek;
    • çağrı yönetiminin değişkenliğini sonsuz derecede karmaşıklaştırın (örneğin, çağrıların içindeki değişiklik yalnızca sayaçlarını değil, aynı zamanda aralıkların değerlerini, tasarım stillerini de değiştirin (böylece bir gökkuşağı parlar 🌈).

Tarif edilen yöntemin basitliğine rağmen, içinde saklı önemli bir potansiyel vardır.

2017'de programın davranışını kontrol etmek daha esnektir - bu moderndir.

Code 1C v 8.2 UP Connect İşleyici Beklentileri (<ИмяПроцедуры>, <Интервал>, <Однократно>)
parametreler:
<ИмяПроцедуры>
<Интервал>(gerekli) Tür: Sayı. İşlemin çağrılacağı (pozitif sayı) saniyenin 1/10'u hassasiyetle saniye cinsinden zaman aralığı.1'den küçük bir değer belirtilirse, üçüncü parametrenin değeri True olmalıdır.
<Однократно>(isteğe bağlı) Tür: Boole. Bekleme işleyicisinin bir kerelik yürütme bayrağı.
True - Belirtilen bekleme işleyicisi bir kez yürütülecek. Varsayılan değer: Yanlış
Açıklama: Belirtilen prosedürü bir bekleme işleyicisi olarak ekler. Belirtilen zaman aralığından sonra her seferinde sistem beklerken prosedür çağrılacaktır.

kullanılabilirlik:
İnce istemci, web istemcisi, kalın istemci.

Not:
Bekleme işleyicisine yapılan çağrı, form kapatılıncaya veya formun DisableWaitHandler çağrılıncaya kadar devam eder. Code 1C v 8.2 UE DisableWaitingHandler (<ИмяПроцедуры>)

Kod 1C v 8.2 YUKARI
& OnClient
WrapperHandler () Prosedürü
İşlem Bekliyor ();
Prosedürün Sonu

&Sunucuda
Prosedür Süreç Bekleme ()
// ne gerekiyorsa yap
Prosedürün Sonu

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

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Bir çağrıyı, belirli bir zaman aralığında yönetilen bir uygulama modülünün (normal uygulama modülü) veya genel bir ortak modülün belirtilen prosedürüne bağlar. Çağrı yalnızca "dinlenme durumunda", yani programın herhangi bir işlem yapmadığı anda gerçekleştirilecektir. Bekleme işleyicisi çağırma, sistem kapanana veya DisableWaitHandler genel bağlam yöntemi çağrılana kadar devam eder.
Kod 1C v 8.x Prosedür Günlük Satış Raporu ()
// ...
Prosedürün Sonu

//...
ConnectWaitingHandler ("ReportOverDaySales", 60); // her dakika
Kod 1C v 8.x // Standart kontrollerde dyn. yapılandırma güncellemeleri her 20 dakikada bir.
ConnectWaitingHandler ("WaitingHandlerDynamicChangeIBCheckWaiting", 20 * 60);
// bir veri alışverişi işleyicisini bağla
ConnectWaitingHandler ("DataExchangeCheck", chapVariableValue ("chapNumber ofExchangePolishSeconds"));
ConnectWaitingHandler ("Bağlantı Uygulamasında Yanıtları Kontrol Et", 86400); // = 24 (s) * 60 (dk) * 60 (sn) = 1 gün

Form için
Code 1C v 8.x ConnectWaitingHandler (<ИмяПроцедуры>, <Интервал>, <Однократно>)
parametreler:
<ИмяПроцедуры>(gerekli) Tür: Dize. Bekleme işleyicisi olarak bağlanma prosedürünün adı.
<Интервал>(gerekli) Tür: Sayı. İşlem çağrısının yapılacağı (pozitif sayı) saniyenin 1/10'u hassasiyetle saniye cinsinden zaman aralığı. Belirtilen değer 1'den küçükse, üçüncü parametrenin değeri True olmalıdır.
<Однократно>(isteğe bağlı) Tür: Boole. Bekleme işleyicisinin bir kerelik yürütme bayrağı. 0 True - Belirtilen bekleme işleyicisi bir kez yürütülecek. Varsayılan değer: Yanlış

Açıklama:
Belirtilen yordamı bir bekleme işleyicisi olarak ekler. Belirtilen zaman aralığından sonra her seferinde sistem beklerken prosedür çağrılacaktır.

kullanılabilirlik:
Kalın müşteri.
Not:
Bekleme işleyicisine yapılan çağrı, form kapatılıncaya veya formun DisableWaitHandler çağrılıncaya kadar devam eder.
Örnek:
Code 1C v 8.х ConnectWaitingHandler ("Bekliyor", 1);
Kod 1C v 8.x Formu Otomatik Kaydetme Aralığı = 300; // 5 dakika
If Form.AutoSave Aralığı<>0 Sonra
Form.ConnectWaitingHandler ("EventHandlerByTimer", Tamsayı (Form.AutoSaveInterval * 60));
EndIf;

1C: Enterprise sisteminde bekleme işlemi, belgelerden aşağıdaki gibi, genel modül prosedürünün belirli bir zaman aralığında periyodik olarak yürütülmesi için tasarlanmıştır. Çalıştırılacak kod şöyle görünecektir:
Code 1C v 7.x Beklenti İşleme ("RefreshCounter _", 1);
Neresi "YenilemeSayacı_"- 1 saniye sıklıkta başlatılacak olan global modülün prosedürünün adı. (1'e eşit ikinci parametre)

Fakat! Sorun şu ki, bekleme işlemini yalnızca bir kez çalıştırabilirsiniz. Yeniden başlatma öncekini iptal eder. Başka bir deyişle, örneğin geçen süreyi saymak için bir zamanlayıcı işlemi yapmak istiyorsanız, yalnızca bir zamanlayıcı başlatabilirsiniz, çünkü ikinci zamanlayıcıyı başlatmak ilkini durduracaktır. Ancak bu zamanlayıcılardan 2, 3 veya daha fazlasını aynı anda başlatmanız gerekirse? Yoksa yine de belgelerin durumunu periyodik olarak taramanız mı gerekiyor?

Çıkış var! Bu iş parçacığını genel bağlamdan ayırmak için form bağlamında bekleme işlemi başlatılmalıdır. Ardından yerel modülün prosedürünü periyodik olarak başlatmak mümkün olacaktır, yani. işleme formunuzun modülünde bulunan prosedür.

Çalıştırılacak kod şöyle görünecektir:
Code 1C v 7.x Form.Bekleyen İşleme ("RefreshCounter _", 1);
Neresi "YenilemeSayacı_"- 1 saniye sıklıkta başlatılacak olan işleme formunun yerel modülünün prosedürünün adı. (1'e eşit ikinci parametre)
Böylece her işlemde, form açık olduğu sürece çalışacak olan kendi bekleme işleminizi başlatabilirsiniz.

Kullanabileceğiniz formlarda Kod 1C v 8.х Form.Bekleme İşlemi ("ProsedürAdı", Başlangıç ​​Zamanı),
Burada ProsedürAdı, Başlangıç ​​saniyesinden sonra başlayan prosedürün adıdır.
Prosedürün kendisinde, bekleyen işlemeyi durdurmak için (elbette, gerekli koşullar karşılandıktan sonra) 1C v 8.x Form.Waiting Processing ("ProcedureName", 0) kodunu girmeniz gerekir.
Bir kaynak