Maison / l'Internet / 1s comment attendre l'exécution du gestionnaire d'attente. interface "clignotant", ou chaînes d'appels asynchrones

1s comment attendre l'exécution du gestionnaire d'attente. interface "clignotant", ou chaînes d'appels asynchrones

La plate-forme 1C nous donne la possibilité d'appels de procédure asynchrones, qui, parfois, peuvent être utilisés pour des choses simples mais amusantes. Par exemple, vous pouvez "clignoter" tout ce qui a une couleur ou toute possibilité de changer la conception visuelle. De plus, vous pouvez utiliser à la fois un mécanisme plus simple, mais non contrôlé, et construire une chaîne intéressante d'appels asynchrones et définir son comportement préféré.

Nous parlons ici, bien sûr, de la procédure ConnectWaitingHandler().

Je vous rappelle la syntaxe de la procédure :

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

De plus, si vous spécifiez un intervalle inférieur à une seconde, la procédure doit être lancée une fois. C'est là que nous perdons le contrôle sur le flux d'exécution et perdons la capacité de le "personnaliser" (de manière flexible, individuellement).

Mais cette limitation est facilement contournée.

Afin de ne pas répandre mes pensées le long de l'arbre, je vais immédiatement donner un exemple simple et l'expliquer.

Disons que nous avons un document de feuille de calcul sur le formulaire et que nous voulons "clignoter" 5 fois avec une partie de sa zone.

/////////////////// // // "Faire clignoter" la zone feuille de calcul 5 fois, avec un intervalle d'une demi-seconde // /////////////////// &AtClient Blink Area Procedure (Command) mf Blink How Many = 3; // Compteur. Attribut de formulaire "visible" dans les procédures de gestionnaire d'attente ConnectWaitHandler("ShowAreaSelect", 0.1, True); // Vous pouvez également appeler directement EndProcedure &OnClient Procedure ShowAreaSelect() Area = Object.AP.Area(mfFirstDataRow, mfFirstDataColumn, mfLastDataRow, mfLastDataColumn); Bordure = Nouvelle ligne (LineTypeSpreadsheetDocumentCell.Double); Region.Border(Border, Border, Border, Border); // Décrire la zone mfBlinkTimes = mfBlinkTimes - 1 ; // Décrémentation du compteur ConnectWaitingHandler("RemoveArea Selection", 0.5, True); // Connecte la chaîne d'appels asynchrones EndProcedure &AtClient Procedure RemoveAreaSelect() Area = Object.AP.Area(mfFirstDataRow, mfFirstDataColumn, mfLastDataRow, mfLastDataColumn); Bordure = Nouvelle ligne (LineTypeSpreadsheetDocumentCell.NoLine); Region.Border(Border, Border, Border, Border); // Supprime le contour de la zone If mfBlinkTime > 0 Then ConnectWaitingHandler("ShowArea Selection", 0.5, True); // Répéter autant qu'il reste sur le compteur EndIf ; FinProcédure

La principale exigence est seulement que la variable de compteur mfHow many timesBlink soit "visible" depuis les procédures que nous exécutons de manière asynchrone. Dans ce cas, la variable est un attribut de formulaire.

Un lecteur attentif remarquera peut-être qu'avec la formation de telles chaînes, on fait d'une pierre deux coups :

  • Contourner la restriction sur la répétabilité des appels de procédure avec des valeurs d'intervalle inférieures à une seconde ;
  • Nous avons la capacité de former des chaînes de différentes longueurs et complexités :
    • connecter le gestionnaire d'attente directement dans la procédure du gestionnaire d'attente elle-même ;
    • faire en sorte que ces procédures se connectent les unes aux autres ;
    • organiser une structure plus complexe de chaînes d'appels ;
    • compliquer sans cesse la variabilité de la gestion des appels (par exemple, modifier non seulement leurs compteurs à l'intérieur des appels, mais aussi les valeurs d'intervalle, les styles de conception (pour que 🌈 scintille comme un arc-en-ciel).

Malgré la simplicité de la méthode décrite, un potentiel considérable y est caché.

En 2017, gérer plus souplement le comportement du programme est moderne.

Code 1C v 8.2 UE ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Option :
<ИмяПроцедуры>
<Интервал>(obligatoire) Tapez : nombre. Intervalle de temps en secondes, au 1/10e de seconde près, après lequel l'appel de procédure sera effectué (nombre positif). Si une valeur inférieure à 1 est spécifiée, la valeur du troisième paramètre doit être True.
<Однократно>(facultatif) Type : booléen. Signe d'une seule exécution du gestionnaire d'attente.
True - le gestionnaire d'attente spécifié sera exécuté une fois. Valeur par défaut : Faux
Description : connecte la procédure spécifiée en tant que gestionnaire d'attente. La procédure sera appelée pendant la période de temporisation du système chaque fois que l'intervalle de temps spécifié s'est écoulé.

Disponibilité:
Client léger, client Web, client lourd.

Noter:
L'appel au gestionnaire d'attente se poursuit jusqu'à ce que le formulaire soit fermé ou jusqu'à ce que la méthode DisableWaitHandler du formulaire soit appelée. Code 1C v 8.2 UE DisableWaitingHandler(<ИмяПроцедуры>)

Code 1C v 8.2 UP
&ChezClient
Procédure WrapperHandler()
ProcessWaite();
FinProcédure

&Sur le serveur
Procédure ProcessWaiting()
// faire ce qui est demandé
FinProcédure

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

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Connecte un appel à la procédure spécifiée d'un module d'application managé (module application régulière) ou globale module commun après un certain intervalle de temps. L'appel ne sera effectué qu'à "l'état de repos", c'est-à-dire au moment où le programme n'effectue aucune action. L'appel au gestionnaire d'attente se poursuit jusqu'à ce que le système se ferme ou jusqu'à ce que la méthode DisableWaitHandler du contexte global soit appelée.
Code 1C v 8.x Procédure ReportSalesDaily()
// ...
FinProcédure

//...
ConnectWaitingHandler("Rapport quotidien des ventes", 60); // chaque minute
Code 1C v 8.x // Dans une vérification typique dyn. mises à jour de configuration toutes les 20 minutes.
ConnectWaitingHandler("WaitingHandlerCheckingDynamicChangeIB", 20 * 60);
// connecte le gestionnaire d'échange de données
ConnectWaitingHandler("CheckDataExchange", hlVariableValue("hlNumber ofExchangePollSeconds"));
ConnectWaitingHandler("CheckConnectionRequestResponses", 86400); // = 24(h) * 60(min) * 60(sec) = 1 jour

Pour le formulaire
Code 1C v 8.x ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Option :
<ИмяПроцедуры>(obligatoire) Type : chaîne. Nom de la procédure à connecter en tant que gestionnaire d'attente.
<Интервал>(obligatoire) Tapez : nombre. Intervalle de temps en secondes, précis au 1/10 de seconde, après lequel l'appel de procédure sera effectué (nombre positif). Si une valeur inférieure à 1 est spécifiée, la valeur du troisième paramètre doit être True.
<Однократно>(facultatif) Type : booléen. Signe d'une seule exécution du gestionnaire d'attente. 0 True - le gestionnaire d'attente spécifié sera exécuté une fois. Valeur par défaut : Faux

La description:
Connecte la procédure spécifiée en tant que gestionnaire d'attente. La procédure sera appelée pendant la période de temporisation du système chaque fois que l'intervalle de temps spécifié s'est écoulé.

Disponibilité:
Grosse cliente.
Noter:
L'appel au gestionnaire d'attente se poursuit jusqu'à ce que le formulaire soit fermé ou jusqu'à ce que la méthode DisableWaitHandler du formulaire soit appelée.
Exemple:
Code 1C v 8.x ConnectWaitingHandler("WhileWaiting", 1);
Code 1C v 8.x Form.mIntervalle d'enregistrement automatique = 300 ; // 5 minutes
Si Forme.mIntervalle d'enregistrement automatique<>0 Alors
Form.ConnectWaitingHandler("EventHandlerBy Timer", Int(Form.mAutosave Interval * 60));
Fin si;

Traitement en attente dans le système 1C:Enterprise, comme il ressort de la documentation, est conçu pour exécuter périodiquement la procédure globale du module avec un intervalle de temps spécifié. Le code à exécuter ressemblera à ceci :
Code 1C v 7.x HandlingWaiting("UpdateCounter_",1);
"Compteur de mise à jour_"- nom de la procédure du module global, qui sera lancée à intervalles de 1 seconde. (deuxième paramètre égal à 1)

Mais! Le problème est que le traitement en attente ne peut être lancé qu'une seule fois. Un redémarrage annulera le précédent. En d'autres termes, si vous souhaitez effectuer, par exemple, un traitement de minuterie pour compter le temps écoulé, vous ne pouvez démarrer qu'une seule minuterie, car démarrer la deuxième minuterie arrêtera la première. Mais que se passe-t-il si vous avez besoin d'exécuter 2, 3 ou plus de ces minuteries en même temps ? Ou avez-vous encore besoin de scanner périodiquement l'état des documents ?

Il y a une sortie ! Le traitement d'attente doit être exécuté dans le contexte du formulaire pour découpler ce thread du contexte global. Et puis il sera possible de lancer périodiquement la procédure du module local, c'est-à-dire procédure située dans le module formulaire de votre traitement.

Le code à exécuter ressemblera à ceci :
Code 1C v 7.x Form.ProcessingWaiting("UpdateCounter_",1);
"Compteur de mise à jour_"- le nom de la procédure du module local du formulaire de traitement, qui sera lancée à intervalles de 1 seconde. (deuxième paramètre égal à 1)
Ainsi, dans chaque traitement, vous pouvez lancer votre propre traitement d'attente, qui fonctionnera tant que le formulaire sera ouvert.

Les formulaires peuvent être utilisés Code 1C v 8.x Form.ProcessingWaiting("ProcedureName",StartTime) ,
où ProcedureName est le nom de la procédure qui s'exécute après StartTime secondes
Dans la procédure elle-même, vous devez insérer Code 1C v 8.x Form.ProcessingWaiting("ProcedureName",0) pour arrêter le traitement de l'attente (naturellement, une fois que les conditions nécessaires sont remplies).
La source

Code 1C v 8.2 UE ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Option :
<ИмяПроцедуры>
<Интервал>(obligatoire) Tapez : nombre. Intervalle de temps en secondes, au 1/10e de seconde près, après lequel l'appel de procédure sera effectué (nombre positif). Si une valeur inférieure à 1 est spécifiée, la valeur du troisième paramètre doit être True.
<Однократно>(facultatif) Type : booléen. Signe d'une seule exécution du gestionnaire d'attente.
True - le gestionnaire d'attente spécifié sera exécuté une fois. Valeur par défaut : Faux
Description : connecte la procédure spécifiée en tant que gestionnaire d'attente. La procédure sera appelée pendant la période de temporisation du système chaque fois que l'intervalle de temps spécifié s'est écoulé.

Disponibilité:
Client léger, client Web, client lourd.

Noter:
L'appel au gestionnaire d'attente se poursuit jusqu'à ce que le formulaire soit fermé ou jusqu'à ce que la méthode DisableWaitHandler du formulaire soit appelée. Code 1C v 8.2 UE DisableWaitingHandler(<ИмяПроцедуры>)

Code 1C v 8.2 UP
&ChezClient
Procédure WrapperHandler()
ProcessWaite();
FinProcédure

&Sur le serveur
Procédure ProcessWaiting()
// faire ce qui est demandé
FinProcédure

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

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Connecte un appel à la procédure spécifiée d'un module d'application géré (module d'application standard) ou d'un module partagé global à un intervalle de temps spécifié. L'appel ne sera effectué qu'à "l'état de repos", c'est-à-dire au moment où le programme n'effectue aucune action. L'appel au gestionnaire d'attente se poursuit jusqu'à ce que le système se ferme ou jusqu'à ce que la méthode DisableWaitHandler du contexte global soit appelée.
Code 1C v 8.x Procédure ReportSalesDaily()
// ...
FinProcédure

//...
ConnectWaitingHandler("Rapport quotidien des ventes", 60); // chaque minute
Code 1C v 8.x // Dans une vérification typique dyn. mises à jour de configuration toutes les 20 minutes.
ConnectWaitingHandler("WaitingHandlerCheckingDynamicChangeIB", 20 * 60);
// connecte le gestionnaire d'échange de données
ConnectWaitingHandler("CheckDataExchange", hlVariableValue("hlNumber ofExchangePollSeconds"));
ConnectWaitingHandler("CheckConnectionRequestResponses", 86400); // = 24(h) * 60(min) * 60(sec) = 1 jour

Pour le formulaire
Code 1C v 8.x ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Option :
<ИмяПроцедуры>(obligatoire) Type : chaîne. Nom de la procédure à connecter en tant que gestionnaire d'attente.
<Интервал>(obligatoire) Tapez : nombre. Intervalle de temps en secondes, précis au 1/10 de seconde, après lequel l'appel de procédure sera effectué (nombre positif). Si une valeur inférieure à 1 est spécifiée, la valeur du troisième paramètre doit être True.
<Однократно>(facultatif) Type : booléen. Signe d'une seule exécution du gestionnaire d'attente. 0 True - le gestionnaire d'attente spécifié sera exécuté une fois. Valeur par défaut : Faux

La description:
Connecte la procédure spécifiée en tant que gestionnaire d'attente. La procédure sera appelée pendant la période de temporisation du système chaque fois que l'intervalle de temps spécifié s'est écoulé.

Disponibilité:
Grosse cliente.
Noter:
L'appel au gestionnaire d'attente se poursuit jusqu'à ce que le formulaire soit fermé ou jusqu'à ce que la méthode DisableWaitHandler du formulaire soit appelée.
Exemple:
Code 1C v 8.x ConnectWaitingHandler("WhileWaiting", 1);
Code 1C v 8.x Form.mIntervalle d'enregistrement automatique = 300 ; // 5 minutes
Si Forme.mIntervalle d'enregistrement automatique<>0 Alors
Form.ConnectWaitingHandler("EventHandlerBy Timer", Int(Form.mAutosave Interval * 60));
Fin si;

Traitement en attente dans le système 1C:Enterprise, comme il ressort de la documentation, est conçu pour exécuter périodiquement la procédure globale du module avec un intervalle de temps spécifié. Le code à exécuter ressemblera à ceci :
Code 1C v 7.x HandlingWaiting("UpdateCounter_",1);
"Compteur de mise à jour_"- nom de la procédure du module global, qui sera lancée à intervalles de 1 seconde. (deuxième paramètre égal à 1)

Mais! Le problème est que le traitement en attente ne peut être lancé qu'une seule fois. Un redémarrage annulera le précédent. En d'autres termes, si vous souhaitez effectuer, par exemple, un traitement de minuterie pour compter le temps écoulé, vous ne pouvez démarrer qu'une seule minuterie, car démarrer la deuxième minuterie arrêtera la première. Mais que se passe-t-il si vous avez besoin d'exécuter 2, 3 ou plus de ces minuteries en même temps ? Ou avez-vous encore besoin de scanner périodiquement l'état des documents ?

Il y a une sortie ! Le traitement d'attente doit être exécuté dans le contexte du formulaire pour découpler ce thread du contexte global. Et puis il sera possible de lancer périodiquement la procédure du module local, c'est-à-dire procédure située dans le module formulaire de votre traitement.

Le code à exécuter ressemblera à ceci :
Code 1C v 7.x Form.ProcessingWaiting("UpdateCounter_",1);
"Compteur de mise à jour_"- le nom de la procédure du module local du formulaire de traitement, qui sera lancée à intervalles de 1 seconde. (deuxième paramètre égal à 1)
Ainsi, dans chaque traitement, vous pouvez lancer votre propre traitement d'attente, qui fonctionnera tant que le formulaire sera ouvert.

Les formulaires peuvent être utilisés Code 1C v 8.x Form.ProcessingWaiting("ProcedureName",StartTime) ,
où ProcedureName est le nom de la procédure qui s'exécute après StartTime secondes
Dans la procédure elle-même, vous devez insérer Code 1C v 8.x Form.ProcessingWaiting("ProcedureName",0) pour arrêter le traitement de l'attente (naturellement, une fois que les conditions nécessaires sont remplies).
La source