„miganie” interfejsu, czyli łańcuchy wywołań asynchronicznych. Okresowe wykonywanie kodu w zadanym przedziale czasu - ProcessWaiting() 1s procedura obsługi oczekiwania w formularzu

Platforma 1C zapewnia nam możliwość asynchronicznego wywoływania procedur, które czasami można wykorzystać do prostych, ale zabawnych rzeczy. Na przykład możesz „mrugnąć” wszystkim, co ma kolor lub ma jakąkolwiek zdolność do zmiany wyglądu. Co więcej, możesz zastosować albo prostszy, ale niekontrolowany mechanizm, albo zbudować ciekawy łańcuch wywołań asynchronicznych i nadać mu preferowane zachowanie.

Mówimy tu oczywiście o procedurze ConnectWaitingHandler().

Przypomnę składnię procedury:

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

Ponadto, jeśli określisz odstęp krótszy niż sekunda, procedura musi zostać uruchomiona jeden raz. Tracimy tu kontrolę nad przebiegiem realizacji i możliwość jej „dostosowania” (elastycznie, indywidualnie konfigurując).

Ale to ograniczenie można łatwo pokonać.

Aby moje myśli nie błądziły, od razu podam prosty przykład i wyjaśnię go.

Załóżmy, że mamy na formularzu dokument arkusza kalkulacyjnego i chcemy „mrugnąć” jakimś jego obszarem 5 razy.

//////////////////// // „Mrugnij” obszar dokumentu arkusza kalkulacyjnego 5 razy w odstępie pół sekundy // //// /////// ///////// &Na kliencie Procedura BlinkArea (polecenie) mf Ile razy mrugnąć = 3; // Lada. Atrybut formularza, „widoczny” w procedurach obsługi oczekiwania ConnectWaitHandler("ShowAreaSelection", 0.1, True); // Możesz także bezpośrednio wywołać EndProcedure &Na procedurze klienta ShowArea Selection() Area = Object.TD.Area(mfFirstDataLine, mfFirstDataColumn, mfLastDataLine, mfLastDataColumn); Obramowanie = Nowa linia (TableDocumentCellLineType.Double); Area.Circle(Granica, Granica, Granica, Granica); // Zarysuj obszar mfIle razy mrugnąć = mfIle razy mrugnąć - 1; // Zmniejsz licznik Connect WaitHandler("RemoveArea Allocation", 0.5, True); // Połącz łańcuch wywołań asynchronicznych Koniec procedury i procedura na kliencie Usuń obszar Selection() Area = Object.TD.Area(mfFirstDataLine, mfFirstDataColumn, mfLastDataLine, mfLastDataColumn); Obramowanie = Nowa linia (TableDocumentCellLineType.NoLine); Area.Circle(Granica, Granica, Granica, Granica); // Usuń kontur obszaru If mf Ile razy mrugnąć > 0 Następnie Connect WaitHandler("Pokaż wybór obszaru", 0.5, True); // Powtórz tyle, ile zostało na liczniku EndIf; Zakończ procedurę

Jedynym wymaganiem jest to, aby zmienna licznika mfHow Many Times Blink była „widoczna” z procedur, które uruchamiamy asynchronicznie. W tym przypadku zmienna jest atrybutem formularza.

Uważny czytelnik mógł zauważyć, że tworząc takie łańcuchy, upijamy dwie pieczenie na jednym ogniu:

  • Omijamy ograniczenie powtarzalności wywołań procedur z wartościami interwałów krótszymi niż sekunda;
  • Mamy możliwość formowania łańcuchów o różnej długości i złożoności:
    • podłącz procedurę obsługi oczekiwania bezpośrednio w samej procedurze obsługi oczekiwania;
    • upewnij się, że takie procedury są ze sobą powiązane;
    • zorganizować bardziej złożoną strukturę łańcuchów połączeń;
    • w nieskończoność komplikują zmienność zarządzania połączeniami (na przykład zmieniają nie tylko ich liczniki wewnątrz połączeń, ale także wartości interwałów, style projektowania (tak, aby 🌈 mieniło się jak tęcza).

Pomimo prostoty opisywanej metody kryje się w niej spory potencjał.

W 2017 roku bardziej elastyczne zarządzanie zachowaniem programu jest nowoczesne.

Kod 1C v 8.2 UE ConnectWaitingHandler (<ИмяПроцедуры>, <Интервал>, <Однократно>)
Opcje:
<ИмяПроцедуры>
<Интервал>(wymagane) Typ: Liczba. Przedział czasu w sekundach, z dokładnością do 1/10 sekundy, po którym zostanie wywołana procedura (liczba dodatnia). Jeżeli zostanie podana wartość mniejsza niż 1, to wartość trzeciego parametru musi być True.
<Однократно>(opcjonalnie) Typ: Boolean. Znak jednorazowego wykonania procedury obsługi oczekiwania.
True — określona procedura obsługi oczekiwania zostanie wykonana raz. Wartość domyślna: Fałsz
Opis: Łączy określoną procedurę jako program obsługi oczekiwania. Procedura będzie wywoływana po upływie limitu czasu systemu za każdym razem, gdy upłynie określony przedział czasu.

Dostępność:
Cienki klient, klient sieciowy, gruby klient.

Notatka:
Wywołanie procedury obsługi oczekiwania jest kontynuowane do momentu zamknięcia formularza lub wywołania metody DisableWaitHandler formularza. Kod 1C v 8.2 UE DisableWaitingHandler(<ИмяПроцедуры>)

Kod 1C wersja 8.2 UP
&Na kliencie
Procedura ShellHandler()
ProcesOczekiwanie();
Zakończ procedurę

&Na serwerze
Procedura ProcessWaiting()
// zrób wszystko, co jest wymagane
Zakończ procedurę

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

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Powoduje wywołanie określonej procedury zarządzanego modułu aplikacji (zwykłego modułu aplikacji) lub globalnego modułu współdzielonego w określonym przedziale czasu. Wywołanie zostanie wykonane tylko w „stanie spoczynku”, czyli w czasie, gdy program nie wykonuje żadnych działań. Wywoływanie procedury obsługi oczekiwania jest kontynuowane do momentu zamknięcia systemu lub wywołania metody DisableWaitHandler kontekstu globalnego.
Kod 1C v 8.x Procedura Sales ReportDay()
// ...
Zakończ procedurę

//...
ConnectWaitingHandler("Raport dziennej sprzedaży", 60); // każda minuta
Kod 1C v 8.x // W standardowej kontroli dynamiki. aktualizacja konfiguracji co 20 minut.
ConnectWaitingHandler("IB DynamicChangeCheckWaitingHandler", 20 * 60);
// podłącz moduł obsługi wymiany danych
ConnectWaitingHandler("CheckingDataExchange", chValueVariable("chNumberofSecondsPollExchange"));
ConnectWaitingHandler("Sprawdź odpowiedzi na wnioski o połączenie", 86400); // = 24(h) * 60(min) * 60(s) = 1 dzień

Dla formularza
Kod 1C v 8.x ConnectWaitingHandler (<ИмяПроцедуры>, <Интервал>, <Однократно>)
Opcje:
<ИмяПроцедуры>(wymagane) Typ: String. Nazwa procedury, która ma zostać połączona jako procedura obsługi oczekiwania.
<Интервал>(wymagane) Typ: Liczba. Przedział czasowy w sekundach, z dokładnością do 1/10 sekundy, po upływie którego zostanie wywołana procedura (liczba dodatnia). Jeśli określono wartość mniejszą niż 1, wartość trzeciego parametru musi mieć wartość True.
<Однократно>(opcjonalnie) Typ: Boolean. Znak jednorazowego wykonania procedury obsługi oczekiwania. 0True — określona procedura obsługi oczekiwania zostanie wykonana raz. Wartość domyślna: Fałsz

Opis:
Łączy określoną procedurę jako procedurę obsługi oczekiwania. Procedura będzie wywoływana po upływie limitu czasu systemu za każdym razem, gdy upłynie określony przedział czasu.

Dostępność:
Gruby klient.
Notatka:
Wywołanie procedury obsługi oczekiwania jest kontynuowane do momentu zamknięcia formularza lub wywołania metody DisableWaitHandler formularza.
Przykład:
Kod 1C v 8.x ConnectWaitingHandler("WhenWaiting", 1);
Kod 1C v 8.x Form.m Interwał automatycznego zapisywania = 300; // 5 minut
Jeśli Form.mAutoSaveInterval<>0 Następnie
Form.ConnectWaitingHandler("TimerEventHandler", Int(Form.mAutoSaveInterval * 60));
koniecJeśli;

Oczekiwanie na przetwarzanie w systemie 1C:Enterprise jak wynika z dokumentacji, przeznaczony jest do okresowego wykonywania procedury modułu globalnego w zadanym przedziale czasu. Kod do uruchomienia będzie wyglądał następująco:
Kod 1C v 7.x Oczekiwanie na przetwarzanie („UpdateCounter_”, 1);
Gdzie „Licznik aktualizacji_”- nazwa globalnej procedury modułu, która będzie uruchamiana co 1 sekundę. (drugi parametr równy 1)

Ale! Problem polega na tym, że przetwarzanie oczekiwania można uruchomić tylko raz. Ponowne uruchomienie spowoduje anulowanie poprzedniego. Innymi słowy, jeśli chcesz na przykład wykonać przetwarzanie timera w celu zliczenia czasu, który upłynął, możesz uruchomić tylko jeden timer, ponieważ uruchomienie drugiego timera spowoduje zatrzymanie pierwszego. Ale co, jeśli chcesz uruchomić 2, 3 lub więcej takich timerów w tym samym czasie? A może nadal potrzebujesz okresowo skanować status dokumentów?

Jest wyjście! Przetwarzanie oczekiwania musi zostać uruchomione w kontekście formularza, aby oddzielić ten wątek od kontekstu globalnego. I wówczas możliwe stanie się okresowe uruchamianie procedury modułu lokalnego, tj. procedurę znajdującą się w module Twojego formularza przetwarzania.

Kod do uruchomienia będzie wyglądał następująco:
Kod 1C v 7.x Form.Waiting Processing("UpdateCounter_",1);
Gdzie „Licznik aktualizacji_”- nazwa procedury lokalnego modułu formularza przetwarzającego, która będzie uruchamiana w odstępach 1 sekundy. (drugi parametr równy 1)
Tym samym przy każdym przetwarzaniu możesz uruchomić własne przetwarzanie oczekiwania, które będzie działać tak długo, jak długo formularz będzie otwarty.

Można go używać w formularzach Kod 1C v 8.x Form.Waiting Processing("ProcedureName",StartTime) ,
gdzie NazwaProcedury jest nazwą procedury uruchamianej po sekundach StartTime
W samej procedurze należy wstawić Code 1C v 8.x Form.Waiting Processing("ProcedureName",0), aby zakończyć oczekiwanie na przetwarzanie (oczywiście po spełnieniu niezbędnych warunków).
Źródło

Kod 1C v 8.2 UE ConnectWaitingHandler (<ИмяПроцедуры>, <Интервал>, <Однократно>)
Opcje:
<ИмяПроцедуры>
<Интервал>(wymagane) Typ: Liczba. Przedział czasu w sekundach, z dokładnością do 1/10 sekundy, po którym zostanie wywołana procedura (liczba dodatnia). Jeżeli zostanie podana wartość mniejsza niż 1, to wartość trzeciego parametru musi być True.
<Однократно>(opcjonalnie) Typ: Boolean. Znak jednorazowego wykonania procedury obsługi oczekiwania.
True — określona procedura obsługi oczekiwania zostanie wykonana raz. Wartość domyślna: Fałsz
Opis: Łączy określoną procedurę jako program obsługi oczekiwania. Procedura będzie wywoływana po upływie limitu czasu systemu za każdym razem, gdy upłynie określony przedział czasu.

Dostępność:
Cienki klient, klient sieciowy, gruby klient.

Notatka:
Wywołanie procedury obsługi oczekiwania jest kontynuowane do momentu zamknięcia formularza lub wywołania metody DisableWaitHandler formularza. Kod 1C v 8.2 UE DisableWaitingHandler(<ИмяПроцедуры>)

Kod 1C wersja 8.2 UP
&Na kliencie
Procedura ShellHandler()
ProcesOczekiwanie();
Zakończ procedurę

&Na serwerze
Procedura ProcessWaiting()
// zrób wszystko, co jest wymagane
Zakończ procedurę

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

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Powoduje wywołanie określonej procedury zarządzanego modułu aplikacji (zwykłego modułu aplikacji) lub globalnego modułu współdzielonego w określonym przedziale czasu. Wywołanie zostanie wykonane tylko w „stanie spoczynku”, czyli w czasie, gdy program nie wykonuje żadnych działań. Wywoływanie procedury obsługi oczekiwania jest kontynuowane do momentu zamknięcia systemu lub wywołania metody DisableWaitHandler kontekstu globalnego.
Kod 1C v 8.x Procedura Sales ReportDay()
// ...
Zakończ procedurę

//...
ConnectWaitingHandler("Raport dziennej sprzedaży", 60); // każda minuta
Kod 1C v 8.x // W standardowej kontroli dynamiki. aktualizacja konfiguracji co 20 minut.
ConnectWaitingHandler("IB DynamicChangeCheckWaitingHandler", 20 * 60);
// podłącz moduł obsługi wymiany danych
ConnectWaitingHandler("CheckingDataExchange", chValueVariable("chNumberofSecondsPollExchange"));
ConnectWaitingHandler("Sprawdź odpowiedzi na wnioski o połączenie", 86400); // = 24(h) * 60(min) * 60(s) = 1 dzień

Dla formularza
Kod 1C v 8.x ConnectWaitingHandler (<ИмяПроцедуры>, <Интервал>, <Однократно>)
Opcje:
<ИмяПроцедуры>(wymagane) Typ: String. Nazwa procedury, która ma zostać połączona jako procedura obsługi oczekiwania.
<Интервал>(wymagane) Typ: Liczba. Przedział czasowy w sekundach, z dokładnością do 1/10 sekundy, po upływie którego zostanie wywołana procedura (liczba dodatnia). Jeśli określono wartość mniejszą niż 1, wartość trzeciego parametru musi mieć wartość True.
<Однократно>(opcjonalnie) Typ: Boolean. Znak jednorazowego wykonania procedury obsługi oczekiwania. 0True — określona procedura obsługi oczekiwania zostanie wykonana raz. Wartość domyślna: Fałsz

Opis:
Łączy określoną procedurę jako procedurę obsługi oczekiwania. Procedura będzie wywoływana po upływie limitu czasu systemu za każdym razem, gdy upłynie określony przedział czasu.

Dostępność:
Gruby klient.
Notatka:
Wywołanie procedury obsługi oczekiwania jest kontynuowane do momentu zamknięcia formularza lub wywołania metody DisableWaitHandler formularza.
Przykład:
Kod 1C v 8.x ConnectWaitingHandler("WhenWaiting", 1);
Kod 1C v 8.x Form.m Interwał automatycznego zapisywania = 300; // 5 minut
Jeśli Form.mAutoSaveInterval<>0 Następnie
Form.ConnectWaitingHandler("TimerEventHandler", Int(Form.mAutoSaveInterval * 60));
koniecJeśli;

Oczekiwanie na przetwarzanie w systemie 1C:Enterprise jak wynika z dokumentacji, przeznaczony jest do okresowego wykonywania procedury modułu globalnego w zadanym przedziale czasu. Kod do uruchomienia będzie wyglądał następująco:
Kod 1C v 7.x Oczekiwanie na przetwarzanie („UpdateCounter_”, 1);
Gdzie „Licznik aktualizacji_”- nazwa globalnej procedury modułu, która będzie uruchamiana co 1 sekundę. (drugi parametr równy 1)

Ale! Problem polega na tym, że przetwarzanie oczekiwania można uruchomić tylko raz. Ponowne uruchomienie spowoduje anulowanie poprzedniego. Innymi słowy, jeśli chcesz na przykład wykonać przetwarzanie timera w celu zliczenia czasu, który upłynął, możesz uruchomić tylko jeden timer, ponieważ uruchomienie drugiego timera spowoduje zatrzymanie pierwszego. Ale co, jeśli chcesz uruchomić 2, 3 lub więcej takich timerów w tym samym czasie? A może nadal potrzebujesz okresowo skanować status dokumentów?

Jest wyjście! Przetwarzanie oczekiwania musi zostać uruchomione w kontekście formularza, aby oddzielić ten wątek od kontekstu globalnego. I wówczas możliwe stanie się okresowe uruchamianie procedury modułu lokalnego, tj. procedurę znajdującą się w module Twojego formularza przetwarzania.

Kod do uruchomienia będzie wyglądał następująco:
Kod 1C v 7.x Form.Waiting Processing("UpdateCounter_",1);
Gdzie „Licznik aktualizacji_”- nazwa procedury lokalnego modułu formularza przetwarzającego, która będzie uruchamiana w odstępach 1 sekundy. (drugi parametr równy 1)
Tym samym przy każdym przetwarzaniu możesz uruchomić własne przetwarzanie oczekiwania, które będzie działać tak długo, jak długo formularz będzie otwarty.

Można go używać w formularzach Kod 1C v 8.x Form.Waiting Processing("ProcedureName",StartTime) ,
gdzie NazwaProcedury jest nazwą procedury uruchamianej po sekundach StartTime
W samej procedurze należy wstawić Code 1C v 8.x Form.Waiting Processing("ProcedureName",0), aby zakończyć oczekiwanie na przetwarzanie (oczywiście po spełnieniu niezbędnych warunków).
Źródło