1c συνδέστε τον χειριστή αναμονής. Περιοδική εκτέλεση κώδικα σε καθορισμένο χρονικό διάστημα - WaitHandling()

31.10.2021

Κωδικός 1C v 8.2 UE ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Παράμετροι:
<ИмяПроцедуры>
<Интервал>(απαιτείται) Τύπος: Αριθμός. Χρονικό διάστημα σε δευτερόλεπτα, με ακρίβεια 1/10 του δευτερολέπτου, μετά το οποίο θα κληθεί η διαδικασία ( θετικός αριθμός).Εάν έχει καθοριστεί τιμή μικρότερη από 1, τότε η τιμή της τρίτης παραμέτρου πρέπει να είναι True.
<Однократно>(προαιρετικό) Τύπος: Boolean. Σημάδι μιας εφάπαξ εκτέλεσης του χειριστή αναμονής.
Σωστό - ο καθορισμένος χειριστής αναμονής θα εκτελεστεί μία φορά. Προεπιλογή: Λάθος
Περιγραφή: Συνδέει την καθορισμένη διαδικασία ως χειριστή αναμονής. Η διαδικασία θα καλείται κατά τη διάρκεια του χρονικού ορίου του συστήματος κάθε φορά που έχει παρέλθει το καθορισμένο χρονικό διάστημα.

Διαθεσιμότητα:
Thin client, web client, thick client.

Σημείωμα:
Η κλήση προς το πρόγραμμα χειρισμού αναμονής συνεχίζεται μέχρι να κλείσει η φόρμα ή μέχρι να κληθεί η μέθοδος DisableWaitHandler της φόρμας. Κωδικός 1C v 8.2 UE DisableWaitingHandler(<ИмяПроцедуры>)

Κωδικός 1C v 8.2 UP
&OnClient
Διαδικασία ShellHandler()
ProcessWaiting();
Τέλος Διαδικασίας

&Στον διακομιστή
Διαδικασία Διαδικασία Αναμονή ()
// κάνε ό,τι απαιτείται
Τέλος Διαδικασίας

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

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Συνδέει μια κλήση στην καθορισμένη διαδικασία μονάδας διαχειριζόμενη εφαρμογή(κανονική ενότητα εφαρμογής) ή γενική κοινή ενότητα σε ορισμένο χρονικό διάστημα. Η κλήση θα πραγματοποιηθεί μόνο σε «κατάσταση ηρεμίας», δηλαδή σε μια στιγμή που το πρόγραμμα δεν εκτελεί καμία ενέργεια. Η κλήση του προγράμματος χειρισμού αναμονής συνεχίζεται έως ότου το σύστημα τερματιστεί ή κληθεί η μέθοδος DisableWaitHandler του καθολικού περιβάλλοντος.
Κωδικός 1C v 8.x Διαδικασία Πωλήσεων ReportDay()
// ...
Τέλος Διαδικασίας

//...
ConnectWaitingHandler("DaySalesReport", 60); // κάθε λεπτό
Κωδικός 1C v 8.x // Στον τυπικό έλεγχο δυναμισμού. ενημερώσεις διαμόρφωσης κάθε 20 λεπτά.
ConnectWaitingHandler("IB DynamicChangeCheckWaitingHandler", 20 * 60);
// συνδέστε τον χειριστή ανταλλαγής δεδομένων
ConnectWaitingHandler("CheckingDataExchange", chValueVariable("chNumberofSecondsPollingExchange"));
ConnectWaitingHandler("Check Responses to Connection Applications", 86400); // = 24 (ω) * 60 (λεπτά) * 60 (δευτ.) = 1 ημέρα

Για Φόρμα
Κωδικός 1C v 8.x ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Παράμετροι:
<ИмяПроцедуры>(απαιτείται) Τύπος: String. Το όνομα της διαδικασίας που θα συνδεθεί ως χειριστής αναμονής.
<Интервал>(απαιτείται) Τύπος: Αριθμός. Χρονικό διάστημα σε δευτερόλεπτα, με ακρίβεια 1/10 του δευτερολέπτου, μετά το οποίο θα κληθεί η διαδικασία (θετικός αριθμός). Εάν έχει καθοριστεί τιμή μικρότερη από 1, τότε η τιμή της τρίτης παραμέτρου πρέπει να είναι True.
<Однократно>(προαιρετικό) Τύπος: Boolean. Σημάδι μιας εφάπαξ εκτέλεσης του χειριστή αναμονής. 0True - ο καθορισμένος χειριστής αναμονής θα εκτελεστεί μία φορά. Προεπιλογή: Λάθος

Περιγραφή:
Συνδέει την καθορισμένη διαδικασία ως χειριστή αναμονής. Η διαδικασία θα καλείται κατά τη διάρκεια του χρονικού ορίου του συστήματος κάθε φορά που έχει παρέλθει το καθορισμένο χρονικό διάστημα.

Διαθεσιμότητα:
Χοντρός πελάτης.
Σημείωμα:
Η κλήση προς το πρόγραμμα χειρισμού αναμονής συνεχίζεται μέχρι να κλείσει η φόρμα ή μέχρι να κληθεί η μέθοδος DisableWaitHandler της φόρμας.
Παράδειγμα:
Κωδικός 1C v 8.x ConnectWaitingHandler("WhenWaiting", 1);
Κωδικός 1C v 8.x Form.mAutosave Interval = 300; // 5 λεπτά
If Form.mAutosave Interval<>0 Τότε
Form.ConnectWaitingHandler("TimerEventHandler", Int(Form.mAutoSaveInterval * 60));
endIf;

Επεξεργασία αναμονής στο σύστημα 1C:Enterprise, όπως προκύπτει από την τεκμηρίωση, προορίζεται για περιοδική εκτέλεση της διαδικασίας καθολικής μονάδας με δεδομένο χρονικό διάστημα. Ο κώδικας που θα εκτελεστεί θα μοιάζει με αυτό:
Κωδικός 1C v 7.x Επεξεργασία αναμονής("UpdateCounter_",1);
Οπου "UpdateCounter_"- όνομα της διαδικασίας καθολικής ενότητας που θα εκκινείται κάθε 1 δευτερόλεπτο. (δεύτερη παράμετρος ίση με 1)

Αλλά! Το πρόβλημα είναι ότι μπορείτε να εκτελέσετε την επεξεργασία αναμονής μόνο μία φορά. Η επανεκκίνηση θα ακυρώσει την προηγούμενη. Με άλλα λόγια, εάν θέλετε να κάνετε, για παράδειγμα, μια επεξεργασία με χρονοδιακόπτη για να μετρήσετε τον χρόνο που έχει παρέλθει, τότε μπορείτε να εκτελέσετε μόνο ένα χρονόμετρο, επειδή ξεκινώντας το δεύτερο χρονόμετρο θα σταματήσει το πρώτο. Τι γίνεται όμως αν χρειαστεί να εκτελέσετε 2, 3 ή περισσότερα από αυτά τα χρονόμετρα ταυτόχρονα; Ή πρέπει ακόμα να σαρώνετε περιοδικά την κατάσταση των εγγράφων;

Υπάρχει διέξοδος! Η επεξεργασία αναμονής πρέπει να εκτελεστεί στο πλαίσιο της φόρμας για να διαχωριστεί αυτό το νήμα από το καθολικό περιβάλλον. Και τότε θα είναι δυνατή η περιοδική εκκίνηση της διαδικασίας τοπικής ενότητας, δηλ. διαδικασία που βρίσκεται στη μονάδα της φόρμας επεξεργασίας σας.

Ο κώδικας που θα εκτελεστεί θα μοιάζει με αυτό:
Code 1C v 7.x Form.Waiting Processing("UpdateCounter_",1);
Οπου "UpdateCounter_"- όνομα της διαδικασίας της τοπικής ενότητας της φόρμας επεξεργασίας, η οποία θα ξεκινήσει σε διαστήματα 1 δευτερολέπτου. (δεύτερη παράμετρος ίση με 1)
Έτσι, σε κάθε επεξεργασία μπορείτε να εκτελέσετε τη δική σας επεξεργασία αναμονής, η οποία θα λειτουργεί όσο η φόρμα είναι ανοιχτή.

Μπορείτε να το χρησιμοποιήσετε σε φόρμες Code 1C v 8.x Form.Waiting Processing("ProcedureName",StartTime) ,
όπου ProcedureName είναι το όνομα της διαδικασίας που εκτελείται μετά από δευτερόλεπτα έναρξης
Στην ίδια τη διαδικασία, πρέπει να εισαγάγετε Code 1C v 8.x Form.Waiting Processing("ProcedureName",0) για να σταματήσετε την επεξεργασία σε αναμονή (φυσικά, αφού πληρούνται οι απαραίτητες προϋποθέσεις).
Πηγή

Η πλατφόρμα 1C μας παρέχει τη δυνατότητα ασύγχρονης κλήσης διαδικασιών, οι οποίες μερικές φορές μπορούν να χρησιμοποιηθούν για απλά αλλά διασκεδαστικά πράγματα. Για παράδειγμα, μπορείτε να "αναβοσβήσετε" οτιδήποτε έχει χρώμα ή οποιαδήποτε ικανότητα να αλλάξει την οπτική εμφάνιση. Επιπλέον, μπορείτε να χρησιμοποιήσετε είτε έναν απλούστερο, αλλά μη ελεγχόμενο μηχανισμό, είτε να δημιουργήσετε μια ενδιαφέρουσα αλυσίδα ασύγχρονων κλήσεων και να του δώσετε την προτιμώμενη συμπεριφορά.

Μιλάμε εδώ, φυσικά, για τη διαδικασία ConnectWaitingHandler().

Επιτρέψτε μου να σας υπενθυμίσω τη σύνταξη της διαδικασίας:

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

Επιπλέον, εάν καθορίσετε ένα διάστημα μικρότερο από ένα δευτερόλεπτο, η διαδικασία πρέπει να ξεκινήσει μία φορά. Εδώ χάνουμε τον έλεγχο της ροής εκτέλεσης και χάνουμε την ικανότητα να την "προσαρμόσουμε" (ευέλικτα, να την διαμορφώσουμε μεμονωμένα).

Αλλά αυτός ο περιορισμός ξεπερνιέται εύκολα.

Για να μην αφήσω τις σκέψεις μου να περιπλανηθούν, θα δώσω αμέσως ένα απλό παράδειγμα και θα το εξηγήσω.

Ας υποθέσουμε ότι έχουμε ένα έγγραφο υπολογιστικού φύλλου στη φόρμα και θέλουμε να "αναβοσβήνουμε" κάποια περιοχή του 5 φορές.

/////////////////// // // «Αναβοσβήνει» η περιοχή Έγγραφο υπολογιστικού φύλλου 5 φορές, με διάστημα μισού δευτερολέπτου // /////////////////// &Στη διαδικασία πελάτη BlinkArea (Command) mf Πόσες φορές αναβοσβήνει = 3; // Μετρητής. Χαρακτηριστικό φόρμας, "ορατό" στις διαδικασίες χειρισμού αναμονής ConnectWaitHandler("ShowAreaSelection", 0.1, True); // Μπορείτε επίσης να καλέσετε απευθείας το EndProcedure &On the Client Procedure ShowArea Selection() Area = Object.TD.Area(mfFirstDataLine, mfFirstDataColumn, mfLastDataLine, mfLastDataColumn);

Περίγραμμα = Νέα γραμμή (TableDocumentCellLineType.Double);

Area.Circle(Border, Border, Border, Border); // Περιγράψτε την περιοχή mfΠόσες φορές να αναβοσβήσετε = mfΠόσες φορές να αναβοσβήσετε - 1; // Μείωση του μετρητή Connect WaitHandler("RemoveArea Allocation", 0.5, True); // Συνδέστε μια αλυσίδα ασύγχρονων κλήσεων Τέλος Διαδικασίας & Στη Διαδικασία πελάτη Κατάργηση Περιοχής Επιλογής() Περιοχή = Object.TD.Area(mfFirstDataLine, mfFirstDataColumn, mfLastDataLine, mfLastDataColumn);

  • Περίγραμμα = Νέα γραμμή (TableDocumentCellLineType.NoLine);
  • Area.Circle(Border, Border, Border, Border); // Αφαιρέστε το περίγραμμα της περιοχής Αν mf Πόσες φορές αναβοσβήνει > 0 Στη συνέχεια συνδέστε το WaitHandler("Εμφάνιση επιλογής περιοχής", 0.5, True); // Επαναλάβετε όσο απομένει στον μετρητή EndIf. Τέλος Διαδικασίας
    • Η μόνη απαίτηση είναι η μεταβλητή μετρητή mfHow Many Times Blink να είναι «ορατή» από τις διαδικασίες που εκκινούμε ασύγχρονα. Σε αυτήν την περίπτωση, η μεταβλητή είναι ένα χαρακτηριστικό φόρμας.
    • Ένας προσεκτικός αναγνώστης μπορεί να είχε παρατηρήσει ότι με το σχηματισμό τέτοιων αλυσίδων σκοτώνουμε δύο πουλιά με μια πέτρα:
    • Παρακάμπτουμε τον περιορισμό στην επανάληψη κλήσεων διαδικασίας με τιμές διαστήματος μικρότερες από ένα δευτερόλεπτο.
    • Έχουμε τη δυνατότητα να σχηματίζουμε αλυσίδες διαφορετικού μήκους και πολυπλοκότητας:

συνδέστε το πρόγραμμα χειρισμού αναμονής απευθείας στην ίδια τη διαδικασία χειρισμού αναμονής.

βεβαιωθείτε ότι τέτοιες διαδικασίες συνδέονται μεταξύ τους.

Κωδικός 1C v 8.2 UE ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Παράμετροι:
<ИмяПроцедуры>
<Интервал>(απαιτείται) Τύπος: Αριθμός. Το χρονικό διάστημα σε δευτερόλεπτα, με ακρίβεια 1/10 του δευτερολέπτου, μετά από το οποίο θα κληθεί η διαδικασία (θετικός αριθμός Αν έχει καθοριστεί τιμή μικρότερη από 1, τότε η τιμή της τρίτης παραμέτρου πρέπει να είναι True).
<Однократно>(προαιρετικό) Τύπος: Boolean. Σημάδι μιας εφάπαξ εκτέλεσης του χειριστή αναμονής.
Σωστό - ο καθορισμένος χειριστής αναμονής θα εκτελεστεί μία φορά. Προεπιλογή: Λάθος
Περιγραφή: Συνδέει την καθορισμένη διαδικασία ως χειριστή αναμονής. Η διαδικασία θα καλείται κατά τη διάρκεια του χρονικού ορίου του συστήματος κάθε φορά που έχει παρέλθει το καθορισμένο χρονικό διάστημα.

Διαθεσιμότητα:
Thin client, web client, thick client.

Σημείωμα:
Η κλήση προς το πρόγραμμα χειρισμού αναμονής συνεχίζεται μέχρι να κλείσει η φόρμα ή μέχρι να κληθεί η μέθοδος DisableWaitHandler της φόρμας. Κωδικός 1C v 8.2 UE DisableWaitingHandler(<ИмяПроцедуры>)

Κωδικός 1C v 8.2 UP
&OnClient
Διαδικασία ShellHandler()
ProcessWaiting();
Τέλος Διαδικασίας

&Στον διακομιστή
Διαδικασία Διαδικασία Αναμονή ()
// κάνε ό,τι απαιτείται
Τέλος Διαδικασίας

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

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Συνδέει μια κλήση σε μια καθορισμένη λειτουργική μονάδα διαχειριζόμενης εφαρμογής (κανονική λειτουργική μονάδα εφαρμογής) ή καθολική διαδικασία κοινής μονάδας σε ένα καθορισμένο χρονικό διάστημα. Η κλήση θα πραγματοποιηθεί μόνο σε «κατάσταση ηρεμίας», δηλαδή σε μια στιγμή που το πρόγραμμα δεν εκτελεί καμία ενέργεια. Η κλήση του προγράμματος χειρισμού αναμονής συνεχίζεται έως ότου το σύστημα τερματιστεί ή κληθεί η μέθοδος DisableWaitHandler του καθολικού περιβάλλοντος.
Κωδικός 1C v 8.x Διαδικασία Πωλήσεων ReportDay()
// ...
Τέλος Διαδικασίας

//...
ConnectWaitingHandler("DaySalesReport", 60); // κάθε λεπτό
Κωδικός 1C v 8.x // Στον τυπικό έλεγχο δυναμισμού. ενημερώσεις διαμόρφωσης κάθε 20 λεπτά.
ConnectWaitingHandler("IB DynamicChangeCheckWaitingHandler", 20 * 60);
// συνδέστε τον χειριστή ανταλλαγής δεδομένων
ConnectWaitingHandler("CheckingDataExchange", chValueVariable("chNumberofSecondsPollingExchange"));
ConnectWaitingHandler("Check Responses to Connection Applications", 86400); // = 24 (ω) * 60 (λεπτά) * 60 (δευτ.) = 1 ημέρα

Για Φόρμα
Κωδικός 1C v 8.x ConnectWaitingHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Παράμετροι:
<ИмяПроцедуры>(απαιτείται) Τύπος: String. Το όνομα της διαδικασίας που θα συνδεθεί ως χειριστής αναμονής.
<Интервал>(απαιτείται) Τύπος: Αριθμός. Χρονικό διάστημα σε δευτερόλεπτα, με ακρίβεια 1/10 του δευτερολέπτου, μετά το οποίο θα κληθεί η διαδικασία (θετικός αριθμός). Εάν έχει καθοριστεί τιμή μικρότερη από 1, τότε η τιμή της τρίτης παραμέτρου πρέπει να είναι True.
<Однократно>(προαιρετικό) Τύπος: Boolean. Σημάδι μιας εφάπαξ εκτέλεσης του χειριστή αναμονής. 0True - ο καθορισμένος χειριστής αναμονής θα εκτελεστεί μία φορά. Προεπιλογή: Λάθος

Περιγραφή:
Συνδέει την καθορισμένη διαδικασία ως χειριστή αναμονής. Η διαδικασία θα καλείται κατά τη διάρκεια του χρονικού ορίου του συστήματος κάθε φορά που έχει παρέλθει το καθορισμένο χρονικό διάστημα.

Διαθεσιμότητα:
Χοντρός πελάτης.
Σημείωμα:
Η κλήση προς το πρόγραμμα χειρισμού αναμονής συνεχίζεται μέχρι να κλείσει η φόρμα ή μέχρι να κληθεί η μέθοδος DisableWaitHandler της φόρμας.
Παράδειγμα:
Κωδικός 1C v 8.x ConnectWaitingHandler("WhenWaiting", 1);
Κωδικός 1C v 8.x Form.mAutosave Interval = 300; // 5 λεπτά
If Form.mAutosave Interval<>0 Τότε
Form.ConnectWaitingHandler("TimerEventHandler", Int(Form.mAutoSaveInterval * 60));
endIf;

Επεξεργασία αναμονής στο σύστημα 1C:Enterprise, όπως προκύπτει από την τεκμηρίωση, προορίζεται για περιοδική εκτέλεση της διαδικασίας καθολικής μονάδας με δεδομένο χρονικό διάστημα. Ο κώδικας που θα εκτελεστεί θα μοιάζει με αυτό:
Κωδικός 1C v 7.x Επεξεργασία αναμονής("UpdateCounter_",1);
Οπου "UpdateCounter_"- όνομα της διαδικασίας καθολικής ενότητας που θα εκκινείται κάθε 1 δευτερόλεπτο. (δεύτερη παράμετρος ίση με 1)

Αλλά! Το πρόβλημα είναι ότι μπορείτε να εκτελέσετε την επεξεργασία αναμονής μόνο μία φορά. Η επανεκκίνηση θα ακυρώσει την προηγούμενη. Με άλλα λόγια, εάν θέλετε να κάνετε, για παράδειγμα, μια επεξεργασία με χρονοδιακόπτη για να μετρήσετε τον χρόνο που έχει παρέλθει, τότε μπορείτε να εκτελέσετε μόνο ένα χρονόμετρο, επειδή ξεκινώντας το δεύτερο χρονόμετρο θα σταματήσει το πρώτο. Τι γίνεται όμως αν χρειαστεί να εκτελέσετε 2, 3 ή περισσότερα από αυτά τα χρονόμετρα ταυτόχρονα; Ή πρέπει ακόμα να σαρώνετε περιοδικά την κατάσταση των εγγράφων;

Υπάρχει διέξοδος! Η επεξεργασία αναμονής πρέπει να εκτελεστεί στο πλαίσιο της φόρμας για να διαχωριστεί αυτό το νήμα από το καθολικό περιβάλλον. Και τότε θα είναι δυνατή η περιοδική εκκίνηση της διαδικασίας τοπικής ενότητας, δηλ. διαδικασία που βρίσκεται στη μονάδα της φόρμας επεξεργασίας σας.

Ο κώδικας που θα εκτελεστεί θα μοιάζει με αυτό:
Code 1C v 7.x Form.Waiting Processing("UpdateCounter_",1);
Οπου "UpdateCounter_"- όνομα της διαδικασίας της τοπικής ενότητας της φόρμας επεξεργασίας, η οποία θα ξεκινήσει σε διαστήματα 1 δευτερολέπτου. (δεύτερη παράμετρος ίση με 1)
Έτσι, σε κάθε επεξεργασία μπορείτε να εκτελέσετε τη δική σας επεξεργασία αναμονής, η οποία θα λειτουργεί όσο η φόρμα είναι ανοιχτή.

Μπορείτε να το χρησιμοποιήσετε σε φόρμες Code 1C v 8.x Form.Waiting Processing("ProcedureName",StartTime) ,
όπου ProcedureName είναι το όνομα της διαδικασίας που εκτελείται μετά από δευτερόλεπτα έναρξης
Στην ίδια τη διαδικασία, πρέπει να εισαγάγετε Code 1C v 8.x Form.Waiting Processing("ProcedureName",0) για να σταματήσετε την επεξεργασία σε αναμονή (φυσικά, αφού πληρούνται οι απαραίτητες προϋποθέσεις).
Πηγή