Casa / Internet / 1s come attendere l'esecuzione del gestore di attesa. interfaccia "lampeggiante" o catene di chiamate asincrone

1s come attendere l'esecuzione del gestore di attesa. interfaccia "lampeggiante" o catene di chiamate asincrone

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

Stiamo parlando, ovviamente, della procedura ConnectWaitingHandler().

Permettetemi di ricordarvi la sintassi della procedura:

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

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

Ma questa limitazione è facilmente aggirabile.

Per non diffondere i miei pensieri lungo l'albero, darò subito un semplice esempio e lo spiegherò.

Supponiamo di avere un foglio di calcolo sul modulo e di voler "lampeggiare" 5 volte con una parte della sua area.

////////////////////// // // "Far lampeggiare" l'area documento foglio di calcolo 5 volte, con un intervallo di mezzo secondo // ///////////////////// &AtClient Blink Area Procedura (comando) mf Blink How Many = 3; // Contatore. Attributo del modulo "visibile" nelle procedure del gestore di attesa ConnectWaitHandler("ShowAreaSelect", 0.1, True); // Puoi anche chiamare direttamente EndProcedure &OnClient Procedure ShowAreaSelect() Area = Object.AP.Area(mfFirstDataRow, mfFirstDataColumn, mfLastDataRow, mfLastDataColumn); Border = New Line(LineTypeSpreadsheetDocumentCell.Double); Regione.Border(Border, Border, Border, Border); // Delinea l'area mfBlinkTimes = mfBlinkTimes - 1; // Decremento contatore ConnectWaitingHandler("RemoveArea Selection", 0.5, True); // Collega la catena di chiamate asincrone EndProcedure &AtClient Procedure RemoveAreaSelect() Area = Object.AP.Area(mfFirstDataRow, mfFirstDataColumn, mfLastDataRow, mfLastDataColumn); Bordo = Nuova riga(LineTypeSpreadsheetDocumentCell.NoLine); Regione.Border(Border, Border, Border, Border); // Rimuovi il contorno dell'area If mfBlinkTime > 0 Then ConnectWaitingHandler("ShowArea Selection", 0.5, True); // Ripeti quanti ne sono rimasti sul contatore EndIf; FineProcedura

Il requisito principale è solo che la variabile contatore mfHow many timesBlink sia "visibile" dalle procedure che eseguiamo in modo asincrono. In questo caso, la variabile è un attributo del modulo.

Un lettore attento potrebbe notare che con la formazione di tali catene, prendiamo due piccioni con una fava:

  • Bypassare la restrizione sulla ripetibilità delle chiamate di procedura con valori di intervallo inferiori al secondo;
  • Abbiamo la possibilità di formare catene di diverse lunghezze e complessità:
    • collegare il gestore di attesa direttamente nella stessa procedura del gestore di attesa;
    • collegare tra loro tali procedure;
    • organizzare una struttura più complessa di catene di chiamate;
    • complicare all'infinito la variabilità della gestione delle chiamate (ad esempio, modificare non solo i loro contatori all'interno delle chiamate, ma anche i valori degli intervalli, gli stili di progettazione (in modo che 🌈 luccichi come un arcobaleno).

Nonostante la semplicità del metodo descritto, in esso si nascondono notevoli potenzialità.

Nel 2017, gestire il comportamento del programma in modo più flessibile è moderno.

Codice 1C v 8.2 UE ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Opzioni:
<ИмяПроцедуры>
<Интервал>(obbligatorio) Tipo: Numero. L'intervallo di tempo in secondi, con una precisione di 1/10 di secondo, dopo il quale verrà effettuata la chiamata alla procedura (numero positivo).Se viene specificato un valore inferiore a 1, il valore del terzo parametro deve essere True.
<Однократно>(facoltativo) Tipo: booleano. Un segno di una singola esecuzione del gestore di attesa.
True: il gestore di attesa specificato verrà eseguito una volta. Valore predefinito: falso
Descrizione: collega la procedura specificata come gestore di attesa. La procedura verrà chiamata durante il periodo di timeout del sistema ogni volta che è trascorso l'intervallo di tempo specificato.

Disponibilità:
Thin client, web client, thick client.

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

Codice 1C v 8.2 SU
&AlCliente
Procedura WrapperHandler()
ProcessoIn attesa();
FineProcedura

&Sul server
Procedura ProcessoIn attesa()
// fa tutto ciò che è richiesto
FineProcedura

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

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Connette una chiamata alla procedura specificata di un modulo dell'applicazione gestita (module regolare applicazione) o globale modulo comune dopo un certo intervallo di tempo. La chiamata verrà effettuata solo nello "stato di quiescenza", ovvero nel momento in cui il programma non esegue alcuna azione. La chiamata al gestore di attesa continua finché il sistema non viene chiuso o finché non viene chiamato il metodo DisableWaitHandler del contesto globale.
Codice 1C v 8.x Procedura ReportSalesDaily()
// ...
FineProcedura

//...
ConnectWaitingHandler("Daily Sales Report", 60); // ogni minuto
Codice 1C v 8.x // In un tipico controllo din. aggiornamenti della configurazione ogni 20 minuti.
ConnectWaitingHandler("WaitingHandlerCheckingDynamicChangeIB", 20 * 60);
// collega il gestore di scambio dati
ConnectWaitingHandler("CheckDataExchange", hlVariableValue("hlNumber ofExchangePollSeconds"));
ConnectWaitingHandler("CheckConnectionRequestResponses", 86400); // = 24(h) * 60(min) * 60(sec) = 1 giorno

Per Forma
Codice 1C v 8.x ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Opzioni:
<ИмяПроцедуры>(obbligatorio) Tipo: stringa. Il nome della procedura da collegare come gestore di attesa.
<Интервал>(obbligatorio) Tipo: Numero. Intervallo di tempo in secondi, preciso al 1/10 di secondo, trascorso il quale verrà effettuata la chiamata alla procedura (numero positivo). Se viene specificato un valore inferiore a 1, il valore del terzo parametro deve essere True.
<Однократно>(facoltativo) Tipo: booleano. Un segno di una singola esecuzione del gestore di attesa. 0 True: il gestore di attesa specificato verrà eseguito una volta. Valore predefinito: falso

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

Disponibilità:
Cliente grasso.
Nota:
La chiamata al gestore di attesa continua finché il form non viene chiuso o finché non viene chiamato il metodo DisableWaitHandler del form.
Esempio:
Codice 1C v 8.x ConnectWaitingHandler("WhileWaiting", 1);
Codice 1C v 8.x Form.mAutosave Interval = 300; // 5 minuti
Se Shape.mAutosave Interval<>0 Allora
Form.ConnectWaitingHandler("EventHandlerBy Timer", Int(Form.mAutosave Interval * 60));
Finisci se;

Elaborazione in attesa nel sistema 1C:Enterprise, come risulta dalla documentazione, è progettato per eseguire periodicamente la procedura del modulo globale con un intervallo di tempo specificato. Il codice da eseguire sarà simile a questo:
Codice 1C v 7.x GestioneWaiting("UpdateCounter_",1);
Dove "Aggiorna contatore_"- nome della procedura del modulo globale, che verrà lanciato ad intervalli di 1 secondo. (secondo parametro uguale a 1)

Ma! Il problema è che l'elaborazione in attesa può essere avviata solo una volta. Un riavvio annullerà quello precedente. In altre parole, se si desidera eseguire, ad esempio, un'elaborazione del timer per il conteggio del tempo trascorso, è possibile avviare un solo timer, perché l'avvio del secondo timer interromperà il primo. Ma cosa succede se devi eseguire 2, 3 o più di questi timer contemporaneamente? O hai ancora bisogno di scansionare periodicamente lo stato dei documenti?

C'è un'uscita! L'elaborazione dell'attesa deve essere eseguita nel contesto del modulo per disaccoppiare questo thread dal contesto globale. E poi sarà possibile avviare periodicamente la procedura del modulo locale, ad es. procedura collocata nel modulo form del tuo trattamento.

Il codice da eseguire sarà simile a questo:
Codice 1C v 7.x Form.ProcessingWaiting("UpdateCounter_",1);
Dove "Aggiorna contatore_"- il nome della procedura del modulo locale del form di elaborazione, che verrà lanciato ad intervalli di 1 secondo. (secondo parametro uguale a 1)
Pertanto, in ogni elaborazione, puoi avviare la tua elaborazione di attesa, che funzionerà finché il modulo è aperto.

È possibile utilizzare i moduli Codice 1C v 8.x Form.ProcessingWaiting("ProcedureName",StartTime) ,
dove ProcedureName è il nome della procedura che viene eseguita dopo StartTime secondi
Nella procedura stessa è necessario inserire Code 1C v 8.x Form.ProcessingWaiting("ProcedureName",0) per interrompere l'elaborazione dell'attesa (ovviamente dopo che si sono verificate le condizioni necessarie).
Fonte

Codice 1C v 8.2 UE ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Opzioni:
<ИмяПроцедуры>
<Интервал>(obbligatorio) Tipo: Numero. L'intervallo di tempo in secondi, con una precisione di 1/10 di secondo, dopo il quale verrà effettuata la chiamata alla procedura (numero positivo).Se viene specificato un valore inferiore a 1, il valore del terzo parametro deve essere True.
<Однократно>(facoltativo) Tipo: booleano. Un segno di una singola esecuzione del gestore di attesa.
True: il gestore di attesa specificato verrà eseguito una volta. Valore predefinito: falso
Descrizione: collega la procedura specificata come gestore di attesa. La procedura verrà chiamata durante il periodo di timeout del sistema ogni volta che è trascorso l'intervallo di tempo specificato.

Disponibilità:
Thin client, web client, thick client.

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

Codice 1C v 8.2 SU
&AlCliente
Procedura WrapperHandler()
ProcessoIn attesa();
FineProcedura

&Sul server
Procedura ProcessoIn attesa()
// fa tutto ciò che è richiesto
FineProcedura

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

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Connette una chiamata alla procedura specificata di un modulo dell'applicazione gestito (modulo dell'applicazione normale) o di un modulo condiviso globale a un intervallo di tempo specificato. La chiamata verrà effettuata solo nello "stato di quiescenza", ovvero nel momento in cui il programma non esegue alcuna azione. La chiamata al gestore di attesa continua finché il sistema non viene chiuso o finché non viene chiamato il metodo DisableWaitHandler del contesto globale.
Codice 1C v 8.x Procedura ReportSalesDaily()
// ...
FineProcedura

//...
ConnectWaitingHandler("Daily Sales Report", 60); // ogni minuto
Codice 1C v 8.x // In un tipico controllo din. aggiornamenti della configurazione ogni 20 minuti.
ConnectWaitingHandler("WaitingHandlerCheckingDynamicChangeIB", 20 * 60);
// collega il gestore di scambio dati
ConnectWaitingHandler("CheckDataExchange", hlVariableValue("hlNumber ofExchangePollSeconds"));
ConnectWaitingHandler("CheckConnectionRequestResponses", 86400); // = 24(h) * 60(min) * 60(sec) = 1 giorno

Per Forma
Codice 1C v 8.x ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Opzioni:
<ИмяПроцедуры>(obbligatorio) Tipo: stringa. Il nome della procedura da collegare come gestore di attesa.
<Интервал>(obbligatorio) Tipo: Numero. Intervallo di tempo in secondi, preciso al 1/10 di secondo, trascorso il quale verrà effettuata la chiamata alla procedura (numero positivo). Se viene specificato un valore inferiore a 1, il valore del terzo parametro deve essere True.
<Однократно>(facoltativo) Tipo: booleano. Un segno di una singola esecuzione del gestore di attesa. 0 True: il gestore di attesa specificato verrà eseguito una volta. Valore predefinito: falso

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

Disponibilità:
Cliente grasso.
Nota:
La chiamata al gestore di attesa continua finché il form non viene chiuso o finché non viene chiamato il metodo DisableWaitHandler del form.
Esempio:
Codice 1C v 8.x ConnectWaitingHandler("WhileWaiting", 1);
Codice 1C v 8.x Form.mAutosave Interval = 300; // 5 minuti
Se Shape.mAutosave Interval<>0 Allora
Form.ConnectWaitingHandler("EventHandlerBy Timer", Int(Form.mAutosave Interval * 60));
Finisci se;

Elaborazione in attesa nel sistema 1C:Enterprise, come risulta dalla documentazione, è progettato per eseguire periodicamente la procedura del modulo globale con un intervallo di tempo specificato. Il codice da eseguire sarà simile a questo:
Codice 1C v 7.x GestioneWaiting("UpdateCounter_",1);
Dove "Aggiorna contatore_"- nome della procedura del modulo globale, che verrà lanciato ad intervalli di 1 secondo. (secondo parametro uguale a 1)

Ma! Il problema è che l'elaborazione in attesa può essere avviata solo una volta. Un riavvio annullerà quello precedente. In altre parole, se si desidera eseguire, ad esempio, un'elaborazione del timer per il conteggio del tempo trascorso, è possibile avviare un solo timer, perché l'avvio del secondo timer interromperà il primo. Ma cosa succede se devi eseguire 2, 3 o più di questi timer contemporaneamente? O hai ancora bisogno di scansionare periodicamente lo stato dei documenti?

C'è un'uscita! L'elaborazione dell'attesa deve essere eseguita nel contesto del modulo per disaccoppiare questo thread dal contesto globale. E poi sarà possibile avviare periodicamente la procedura del modulo locale, ad es. procedura collocata nel modulo form del tuo trattamento.

Il codice da eseguire sarà simile a questo:
Codice 1C v 7.x Form.ProcessingWaiting("UpdateCounter_",1);
Dove "Aggiorna contatore_"- il nome della procedura del modulo locale del form di elaborazione, che verrà lanciato ad intervalli di 1 secondo. (secondo parametro uguale a 1)
Pertanto, in ogni elaborazione, puoi avviare la tua elaborazione di attesa, che funzionerà finché il modulo è aperto.

È possibile utilizzare i moduli Codice 1C v 8.x Form.ProcessingWaiting("ProcedureName",StartTime) ,
dove ProcedureName è il nome della procedura che viene eseguita dopo StartTime secondi
Nella procedura stessa è necessario inserire Code 1C v 8.x Form.ProcessingWaiting("ProcedureName",0) per interrompere l'elaborazione dell'attesa (ovviamente dopo che si sono verificate le condizioni necessarie).
Fonte