“lampeggiare” l’interfaccia, oppure catene di chiamate asincrone. Esecuzione periodica del codice in un determinato intervallo di tempo - ProcessingWait() 1s 8 gestori di attesa

La piattaforma 1C ci offre la possibilità di chiamare in modo asincrono procedure, che a volte possono essere utilizzate per cose semplici ma divertenti. Ad esempio, puoi "lampeggiare" tutto ciò che ha un colore o qualsiasi capacità di modificare l'aspetto visivo. Inoltre, puoi utilizzare un meccanismo più semplice, ma non controllato, oppure costruire un'interessante catena di chiamate asincrone e assegnarle il comportamento preferito.

Stiamo ovviamente parlando della procedura ConnectWaitingHandler().

Vi ricordo la sintassi della procedura:

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

Inoltre, se si specifica un intervallo inferiore al secondo, la procedura dovrà essere lanciata una volta. È qui che perdiamo il controllo sul flusso di esecuzione e perdiamo la capacità di “personalizzarlo” (configurarlo in modo flessibile, individualmente).

Ma questa limitazione è facilmente superabile.

Per non lasciare che i miei pensieri vaghino, farò subito un semplice esempio e lo spiegherò.

Diciamo che abbiamo un foglio di calcolo nel modulo e vogliamo "lampeggiare" alcune sue aree 5 volte.

/////////////////// // // “Fa lampeggiare” l'area del documento Foglio di calcolo 5 volte, con un intervallo di mezzo secondo // //// /////// ///////// &Sulla procedura client BlinkArea (comando) mf Quante volte lampeggiare = 3; // Contatore. Attributo del modulo, "visibile" nelle procedure del gestore di attesa ConnectWaitHandler("ShowAreaSelection", 0.1, True); // È inoltre possibile chiamare direttamente EndProcedure &Sulla procedura client ShowArea Selection() Area = Object.TD.Area(mfFirstDataLine, mfFirstDataColumn, mfLastDataLine, mfLastDataColumn);

Bordo = Nuova riga(TableDocumentCellLineType.Double);

Area.Cerchio(Bordo, Bordo, Bordo, Bordo); // Delinea l'area mfQuante volte lampeggiare = mfQuante volte lampeggiare - 1; // Decrementa il contatore Connect WaitHandler("RemoveArea Allocation", 0.5, True); // Connette una catena di chiamate asincrone Fine della procedura e sulla procedura client Rimuovi area Selection() Area = Object.TD.Area(mfFirstDataLine, mfFirstDataColumn, mfLastDataLine, mfLastDataColumn);

  • Bordo = Nuova riga(TableDocumentCellLineType.NoLine);
  • Area.Cerchio(Bordo, Bordo, Bordo, Bordo); // Rimuove il contorno dell'area If mf Quante volte lampeggia > 0 Then Connect WaitHandler("Mostra selezione area", 0.5, True); // Ripete quanto rimane sul contatore EndIf; Fine della procedura
    • L'unico requisito è che la variabile contatore mfHow Many Times Blink sia “visibile” dalle procedure che lanciamo in modo asincrono. In questo caso, la variabile è un attributo del modulo.
    • Un lettore attento potrebbe aver notato che con la formazione di tali catene prendiamo due piccioni con una fava:
    • Aggiriamo la restrizione sulla ripetizione delle chiamate di procedura con valori di intervallo inferiori a un secondo;
    • Abbiamo la capacità di formare catene di varia lunghezza e complessità:

connettere il gestore dell'attesa direttamente nella procedura del gestore dell'attesa stessa;

assicurarsi che tali procedure siano collegate tra loro;

organizzare una struttura più complessa di catene di chiamate;<ИмяПроцедуры>, <Интервал>, <Однократно>)
complicare all'infinito la variabilità della gestione delle chiamate (ad esempio, modificare non solo i contatori all'interno delle chiamate, ma anche i valori degli intervalli, gli stili di design (in modo che il 🌈 luccichi come un arcobaleno).
<ИмяПроцедуры>
<Интервал>(richiesto) Tipo: Numero. L'intervallo di tempo in secondi, con una precisione di 1/10 di secondo, dopo il quale verrà chiamata la procedura (un numero positivo). Se viene specificato un valore inferiore a 1, il valore del terzo parametro deve essere True.
<Однократно>(facoltativo) Tipo: booleano. Segno di un'esecuzione una tantum del gestore dell'attesa.
Vero: il gestore di attesa specificato verrà eseguito una volta. Predefinito: falso
Descrizione: connette la procedura specificata come gestore di attesa. La procedura verrà richiamata durante il periodo di timeout del sistema ogni volta che sarà trascorso l'intervallo di tempo specificato.

Disponibilità:
Thin client, web client, Thick Client.

Nota:
La chiamata al gestore dell'attesa continua finché il modulo non viene chiuso o finché non viene chiamato il metodo DisableWaitHandler del modulo. Codice 1C v 8.2 UE DisableWaitingHandler(<ИмяПроцедуры>)

Codice 1C v 8.2 SU
&SuClient
Procedura ShellHandler()
ProcessoAttesa();
Fine della procedura

&SuServer
Procedura ProcessWaiting()
// fa tutto ciò che è richiesto
Fine della procedura

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

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Collega una chiamata a un modulo dell'applicazione gestito specificato (modulo dell'applicazione normale) o a una procedura del modulo condiviso globale a un intervallo di tempo specificato. La chiamata verrà effettuata solo in “stato di riposo”, cioè in un momento in cui il programma non sta eseguendo alcuna azione. La chiamata al gestore di attesa continua fino all'arresto del sistema o fino alla chiamata del metodo DisableWaitHandler del contesto globale.
Codice 1C v 8.x Procedura Sales ReportDay()
// ...
Fine della procedura

//...
ConnectWaitingHandler("RapportoVendite Giornaliere", 60); // ogni minuto
Codice 1C v 8.x // Nel controllo del dinamismo standard. aggiornamenti della configurazione ogni 20 minuti.
ConnectWaitingHandler("IB DynamicChangeCheckWaitingHandler", 20 * 60);
// collega il gestore dello scambio dati
ConnectWaitingHandler("CheckingDataExchange", chValueVariable("chNumberofSecondsPollingExchange"));
ConnectWaitingHandler("Controlla le risposte alle applicazioni di connessione", 86400); // = 24(h) * 60(min) * 60(sec) = 1 giorno

Per Modulo
Codice 1C v 8.x ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
complicare all'infinito la variabilità della gestione delle chiamate (ad esempio, modificare non solo i contatori all'interno delle chiamate, ma anche i valori degli intervalli, gli stili di design (in modo che il 🌈 luccichi come un arcobaleno).
<ИмяПроцедуры>(obbligatorio) Tipo: stringa. Il nome della procedura da connettere come gestore dell'attesa.
<Интервал>(richiesto) Tipo: Numero. Intervallo di tempo in secondi, con precisione al 1/10 di secondo, trascorso il quale verrà richiamata la procedura (numero positivo). Se viene specificato un valore inferiore a 1, il valore del terzo parametro deve essere True.
<Однократно>(facoltativo) Tipo: booleano. Segno di un'esecuzione una tantum del gestore dell'attesa. 0True: il gestore di attesa specificato verrà eseguito una volta. Predefinito: falso

Descrizione:
Connette la procedura specificata come gestore di attesa. La procedura verrà richiamata durante il periodo di timeout del sistema ogni volta che sarà trascorso l'intervallo di tempo specificato.

Disponibilità:
Cliente grasso.
Nota:
La chiamata al gestore dell'attesa continua finché il modulo non viene chiuso o finché non viene chiamato il metodo DisableWaitHandler del modulo.
Esempio:
Codice 1C v 8.x ConnectWaitingHandler("WhenWaiting", 1);
Codice 1C v 8.x Form.mIntervallo di salvataggio automatico = 300; // 5 minuti
Se Form.mIntervallo di salvataggio automatico<>0 Allora
Form.ConnectWaitingHandler("TimerEventHandler", Int(Form.mAutoSaveInterval * 60));
fineSe;

In attesa di elaborazione nel sistema 1C:Enterprise, come segue dalla documentazione, è destinato all'esecuzione periodica della procedura globale del modulo con un determinato intervallo di tempo. Il codice da eseguire sarà simile al seguente:
Codice 1C v 7.x In attesa di elaborazione("UpdateCounter_",1);
Dove "Contatore aggiornamenti_"- nome della procedura globale del modulo che verrà lanciata ogni 1 secondo. (secondo parametro pari a 1)

Ma! Il problema è che puoi eseguire l'elaborazione wait solo una volta. Il riavvio annullerà quello precedente. In altre parole, se si desidera eseguire, ad esempio, un'elaborazione del timer per contare il tempo trascorso, è possibile eseguire solo un timer, poiché l'avvio del secondo timer interromperà il primo. Ma cosa succede se è necessario eseguire 2, 3 o più di questi timer contemporaneamente? Oppure hai ancora bisogno di scansionare periodicamente lo stato dei documenti?

C'è una via d'uscita! L'elaborazione dell'attesa deve essere eseguita nel contesto del modulo per separare questo thread dal contesto globale. E poi diventerà possibile avviare periodicamente la procedura del modulo locale, ad es. procedura situata nel modulo del tuo modulo di elaborazione.

Il codice da eseguire sarà simile al seguente:
Codice 1C v 7.x Form.Waiting Processing("UpdateCounter_",1);
Dove "Contatore aggiornamenti_"- nome della procedura del modulo locale del modulo di elaborazione, che verrà lanciata ad intervalli di 1 secondo. (secondo parametro pari a 1)
Pertanto, in ogni elaborazione è possibile eseguire la propria elaborazione di attesa, che funzionerà finché il modulo sarà aperto.

Puoi usarlo nei moduli Codice 1C v 8.x Form.Waiting Processing("ProcedureName",StartTime),
dove ProcedureName è il nome della procedura che viene eseguita dopo StartTime secondi
Nella procedura stessa, è necessario inserire il codice 1C v 8.x Form.Waiting Processing("ProcedureName",0) per interrompere l'elaborazione in attesa (ovviamente, dopo che sono soddisfatte le condizioni necessarie).
Fonte

organizzare una struttura più complessa di catene di chiamate;<ИмяПроцедуры>, <Интервал>, <Однократно>)
complicare all'infinito la variabilità della gestione delle chiamate (ad esempio, modificare non solo i contatori all'interno delle chiamate, ma anche i valori degli intervalli, gli stili di design (in modo che il 🌈 luccichi come un arcobaleno).
<ИмяПроцедуры>
<Интервал>(richiesto) Tipo: Numero. L'intervallo di tempo in secondi, con una precisione di 1/10 di secondo, dopo il quale verrà chiamata la procedura (un numero positivo). Se viene specificato un valore inferiore a 1, il valore del terzo parametro deve essere True.
<Однократно>(facoltativo) Tipo: booleano. Segno di un'esecuzione una tantum del gestore dell'attesa.
Vero: il gestore di attesa specificato verrà eseguito una volta. Predefinito: falso
Descrizione: connette la procedura specificata come gestore di attesa. La procedura verrà richiamata durante il periodo di timeout del sistema ogni volta che sarà trascorso l'intervallo di tempo specificato.

Disponibilità:
Thin client, web client, Thick Client.

Nota:
La chiamata al gestore dell'attesa continua finché il modulo non viene chiuso o finché non viene chiamato il metodo DisableWaitHandler del modulo. Codice 1C v 8.2 UE DisableWaitingHandler(<ИмяПроцедуры>)

Codice 1C v 8.2 SU
&SuClient
Procedura ShellHandler()
ProcessoAttesa();
Fine della procedura

&SuServer
Procedura ProcessWaiting()
// fa tutto ciò che è richiesto
Fine della procedura

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

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Collega una chiamata a un modulo dell'applicazione gestito specificato (modulo dell'applicazione normale) o a una procedura del modulo condiviso globale a un intervallo di tempo specificato. La chiamata verrà effettuata solo in “stato di riposo”, cioè in un momento in cui il programma non sta eseguendo alcuna azione. La chiamata al gestore di attesa continua fino all'arresto del sistema o fino alla chiamata del metodo DisableWaitHandler del contesto globale.
Codice 1C v 8.x Procedura Sales ReportDay()
// ...
Fine della procedura

//...
ConnectWaitingHandler("RapportoVendite Giornaliere", 60); // ogni minuto
Codice 1C v 8.x // Nel controllo del dinamismo standard. aggiornamenti della configurazione ogni 20 minuti.
ConnectWaitingHandler("IB DynamicChangeCheckWaitingHandler", 20 * 60);
// collega il gestore dello scambio dati
ConnectWaitingHandler("CheckingDataExchange", chValueVariable("chNumberofSecondsPollingExchange"));
ConnectWaitingHandler("Controlla le risposte alle applicazioni di connessione", 86400); // = 24(h) * 60(min) * 60(sec) = 1 giorno

Per Modulo
Codice 1C v 8.x ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
complicare all'infinito la variabilità della gestione delle chiamate (ad esempio, modificare non solo i contatori all'interno delle chiamate, ma anche i valori degli intervalli, gli stili di design (in modo che il 🌈 luccichi come un arcobaleno).
<ИмяПроцедуры>(obbligatorio) Tipo: stringa. Il nome della procedura da connettere come gestore dell'attesa.
<Интервал>(richiesto) Tipo: Numero. Intervallo di tempo in secondi, con precisione al 1/10 di secondo, trascorso il quale verrà richiamata la procedura (numero positivo). Se viene specificato un valore inferiore a 1, il valore del terzo parametro deve essere True.
<Однократно>(facoltativo) Tipo: booleano. Segno di un'esecuzione una tantum del gestore dell'attesa. 0True: il gestore di attesa specificato verrà eseguito una volta. Predefinito: falso

Descrizione:
Connette la procedura specificata come gestore di attesa. La procedura verrà richiamata durante il periodo di timeout del sistema ogni volta che sarà trascorso l'intervallo di tempo specificato.

Disponibilità:
Cliente grasso.
Nota:
La chiamata al gestore dell'attesa continua finché il modulo non viene chiuso o finché non viene chiamato il metodo DisableWaitHandler del modulo.
Esempio:
Codice 1C v 8.x ConnectWaitingHandler("WhenWaiting", 1);
Codice 1C v 8.x Form.mIntervallo di salvataggio automatico = 300; // 5 minuti
Se Form.mIntervallo di salvataggio automatico<>0 Allora
Form.ConnectWaitingHandler("TimerEventHandler", Int(Form.mAutoSaveInterval * 60));
fineSe;

In attesa di elaborazione nel sistema 1C:Enterprise, come segue dalla documentazione, è destinato all'esecuzione periodica della procedura globale del modulo con un determinato intervallo di tempo. Il codice da eseguire sarà simile al seguente:
Codice 1C v 7.x In attesa di elaborazione("UpdateCounter_",1);
Dove "Contatore aggiornamenti_"- nome della procedura globale del modulo che verrà lanciata ogni 1 secondo. (secondo parametro pari a 1)

Ma! Il problema è che puoi eseguire l'elaborazione wait solo una volta. Il riavvio annullerà quello precedente. In altre parole, se si desidera eseguire, ad esempio, un'elaborazione del timer per contare il tempo trascorso, è possibile eseguire solo un timer, poiché l'avvio del secondo timer interromperà il primo. Ma cosa succede se è necessario eseguire 2, 3 o più di questi timer contemporaneamente? Oppure hai ancora bisogno di scansionare periodicamente lo stato dei documenti?

C'è una via d'uscita! L'elaborazione dell'attesa deve essere eseguita nel contesto del modulo per separare questo thread dal contesto globale. E poi diventerà possibile avviare periodicamente la procedura del modulo locale, ad es. procedura situata nel modulo del tuo modulo di elaborazione.

Il codice da eseguire sarà simile al seguente:
Codice 1C v 7.x Form.Waiting Processing("UpdateCounter_",1);
Dove "Contatore aggiornamenti_"- nome della procedura del modulo locale del modulo di elaborazione, che verrà lanciata ad intervalli di 1 secondo. (secondo parametro pari a 1)
Pertanto, in ogni elaborazione è possibile eseguire la propria elaborazione di attesa, che funzionerà finché il modulo sarà aperto.

Puoi usarlo nei moduli Codice 1C v 8.x Form.Waiting Processing("ProcedureName",StartTime),
dove ProcedureName è il nome della procedura che viene eseguita dopo StartTime secondi
Nella procedura stessa, è necessario inserire il codice 1C v 8.x Form.Waiting Processing("ProcedureName",0) per interrompere l'elaborazione in attesa (ovviamente, dopo che sono soddisfatte le condizioni necessarie).
Fonte