Ασύγχρονες κλήσεις σε επεκτάσεις και εξωτερικά στοιχεία. Γιατί εμφανίζεται το σφάλμα "Η χρήση σύγχρονων μεθόδων στον πελάτη απαγορεύεται";

Υλοποιήθηκε στην έκδοση 8.3.5.1383, 8.3.6.1977.

Σύγχρονες τάσεις

Οι τάσεις ανάπτυξης προγραμμάτων περιήγησης οδηγούν σε ένα ολοένα αυξανόμενο ποσοστό «ασυγχρονισμού» στην πλατφόρμα. Το πρώτο βήμα ήταν. Υπάρχουν πλέον ασύγχρονες κλήσεις για εργασία με επεκτάσεις κρυπτογραφίας, εργασία με αρχεία και εξωτερικά στοιχεία.

Ο λόγος για την επόμενη κίνηση προς τον ασυγχρονισμό ήταν ότι οι προγραμματιστές του προγράμματος περιήγησης Google Chrome εγκατέλειψαν την υποστήριξη της προηγούμενης τεχνολογίας NPAPI (Netscape Plugin Application Programming Interface). Αυτή η τεχνολογία χρησιμοποιήθηκε για τη σύνδεση εξωτερικών μονάδων - επεκτάσεων - στο πρόγραμμα περιήγησης.

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

Και τώρα, αντί της προηγούμενης σύγχρονης τεχνολογίας NPAPI, οι προγραμματιστές του Google Chrome δημιούργησαν μια νέα τεχνολογία Native Messaging. Ταυτόχρονα, συνέστησαν ανεπιφύλακτα σε όλους τους προγραμματιστές επεκτάσεων να μην χρησιμοποιούν την παλιά τεχνολογία, γιατί δεν θα υποστηρίζεται.

Χωρίς να υπεισέλθω σε λεπτομέρειες, η νέα τεχνολογία είναι καλύτερη και ασφαλέστερη. Αυτό είναι καλό. Αλλά μια από τις σημαντικές διαφορές του είναι ότι παρέχει αποκλειστικά ασύγχρονη αλληλεπίδραση με επεκτάσεις προγράμματος περιήγησης. Και αυτό απαιτεί μια ριζική αλλαγή σε όλες τις υπάρχουσες μεθόδους εργασίας με επεκτάσεις και εξωτερικά στοιχεία στο 1C:Enterprise. Γιατί όλα βασίζονται στη σύγχρονη αλληλεπίδραση.

Ασύγχρονες Μέθοδοι

Επιλύσαμε αυτό το πρόβλημα με τον ίδιο τρόπο που λύσαμε το πρόβλημα τροπικής κλήσης. Για όλες τις σύγχρονες μεθόδους που χρησιμοποιούν την τεχνολογία NPAPI, έχουμε δημιουργήσει τις ασύγχρονες αντίστοιχές τους. Διαφέρουν κυρίως ως προς την παρουσία του προθέματος Αρχίζουνκαι το γεγονός ότι τους μεταβιβάζεται η πρώτη παράμετρος ΠεριγραφήΕιδοποιήσεις, από το οποίο η εκτέλεση του κώδικα προγράμματος θα συνεχιστεί μετά την ολοκλήρωση της καλούμενης ενέργειας.

Για παράδειγμα, αντί για τη μέθοδο Κρυπτογράφηση ()Τώρα συνιστούμε να χρησιμοποιήσετε τη μέθοδο StartEncrypt():

Cryptography Manager.Encrypt(<ИсходныеДанные>, <Получатели>) Cryptography Manager.Start Encryption(<ОписаниеОповещения>, <ИсходныеДанные>, <Получатели>)

Αντί για μέθοδο GetFiles () - StartGettingFiles():

GetFiles(<ПолучаемыеФайлы>, <ПолученныеФайлы>, <РасположениеФайлов>, <Интерактивно>) Έναρξη λήψης αρχείων ((<ОписаниеОповещения>, <ПолучаемыеФайлы>, <РасположениеФайлов>, <Интерактивно>)

Αντί SetExternalComponent()- StartInstallingExternalComponents():

SetExternalComponent(<Местоположение>) Ξεκινήστε την εγκατάσταση εξωτερικών στοιχείων (<ОписаниеОповещенияОЗавершении>, <Местоположение>)

Στην πραγματικότητα, σε γενικές γραμμές, όλα μοιάζουν πολύ με αυτό που κάναμε πριν, όταν ξεφορτωθήκαμε το modality. Αλλά η λειτουργία νέων ασύγχρονων μεθόδων έχει ένα βασικό χαρακτηριστικό που δεν έχουν οι μέθοδοι που προκαλούν μη τροπικούς διαλόγους.

Κατά την ασύγχρονη κλήση ενός διαλόγου χωρίς μοντέλα, περιμένουμε μόνο κάποια αντίδραση του χρήστη και τίποτα περισσότερο. Με την έννοια ότι δεν μπορεί να συμβεί τίποτα αναπάντεχο.

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

Συνήθως παρέχετε χειρισμό τέτοιων εξαιρέσεων στον κώδικα της εφαρμογής σας. Χρήση χειριστή Προσπαθώντας... Εξαίρεση. Τώρα όμως αυτό γίνεται αδύνατο, γιατί τη στιγμή της ασύγχρονης κλήσης, ο κωδικός της εφαρμογής δεν εκτελείται. Κατά συνέπεια, ο χειριστής δεν λειτουργεί Προσπαθώντας... Εξαίρεση.

  • NameProcedureProcessingErrors;
  • ErrorProcessingModule.

Εάν κάτι πάει στραβά κατά τη διάρκεια μιας ασύγχρονης κλήσης και παρουσιαστεί μια εξαίρεση, θα εκτελεστεί η διαδικασία που υποδεικνύεται από αυτές τις ιδιότητες. Είναι λογικό να χρησιμοποιείτε αυτές τις δύο ιδιότητες μόνο σε ασύγχρονες μεθόδους εργασίας με επεκτάσεις. Όταν καλείτε διαλόγους χωρίς mode, δεν χρειάζεστε αυτές τις ιδιότητες.

Ιδιότητα διαμόρφωσης

Όπως και στην περίπτωση απόρριψης τρόπου λειτουργίας, ολόκληρη η λύση εφαρμογής στο σύνολό της πρέπει να γνωρίζει "τι είναι". Είτε είναι τροπικός είτε μη τροπικός. Είτε είναι σύγχρονο είτε ασύγχρονο.

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

Η ουσία της χρήσης του είναι η εξής:

  • Μη χρησιμοποιεις- Αυτός είναι ένας νέος, ασύγχρονος τρόπος λειτουργίας. Για νέες διαμορφώσεις αυτή είναι η τυπική λειτουργία. Η χρήση παλιών, σύγχρονων μεθόδων απαγορεύεται. Δεν περνούν τον συντακτικό έλεγχο, δεν βρίσκονται στο πλαίσιο. Η προσπάθεια εκτέλεσης μιας σύγχρονης μεθόδου δημιουργεί μια εξαίρεση.
  • Χρήση με προειδοποίηση- αυτή η λειτουργία προορίζεται για τον προγραμματιστή. Δεν εμποδίζει τη χρήση παλαιότερων, σύγχρονων μεθόδων. Αλλά κάθε φορά που καλείται μια σύγχρονη μέθοδος στον πελάτη, παράγει ένα προειδοποιητικό μήνυμα. Συνιστούμε τη χρήση αυτής της λειτουργίας σε διαμορφώσεις "ανακύκλωσης". Είναι βολικό για οπτική αναζήτηση για σύγχρονες κλήσεις και παρακολούθηση τους κατά τη διαδικασία αναθεώρησης.
  • Χρήση- μια λειτουργία που διασφαλίζει τη συμβατότητα της νέας έκδοσης της πλατφόρμας με παλιές διαμορφώσεις που χρησιμοποιούν σύγχρονες μεθόδους για εργασία με επεκτάσεις και εξωτερικά στοιχεία.

Όλες οι μέθοδοι και οι ιδιότητες για τις οποίες έχουμε μιλήσει μέχρι τώρα υλοποιούνται στην έκδοση 8.3.5.1383 . Μπορείτε να τα χρησιμοποιήσετε στις λύσεις εφαρμογών σας. Και οι προγραμματιστές, για παράδειγμα, θα στραφούν σε υποσυστήματα ασύγχρονης λειτουργίας που χρησιμοποιούν εργαλεία κρυπτογράφησης, δουλεύουν με αρχεία και εξωτερικά στοιχεία.

Φυσικά, όπως συμβαίνει και με τις κλήσεις, πιθανότατα έχετε μια ερώτηση. Χρειάζεται να επαναλάβω τη λύση της εφαρμογής μου; Και γενικά, χρειάζεται να χρησιμοποιήσω αυτές τις ασύγχρονες μεθόδους στη νέα λύση εφαρμογής μου;

Πότε χρειάζεται;

Η απάντηση σε αυτό το ερώτημα είναι ουσιαστικά η ίδια που δώσαμε πριν. Όταν μιλούσαν για την εγκατάλειψη της τροπικότητας.

Πρώτον, δεν υποστηρίζει κάθε έκδοση της τεχνολογικής πλατφόρμας τη λειτουργία ασύγχρονων κλήσεων σε επεκτάσεις και εξωτερικά στοιχεία. Αυτός ο τρόπος λειτουργίας υπάρχει ξεκινώντας από την έκδοση 8.3.5.1383. Επομένως, εάν εργάζεστε σε χαμηλότερες εκδόσεις της πλατφόρμας, δεν χρειάζεται να ανησυχείτε για την εγκατάλειψη των σύγχρονων μεθόδων προς το παρόν.

Δεύτερον, δεν πρέπει απαραίτητα να χρησιμοποιούν αυτήν τη λειτουργία όλες οι λύσεις εφαρμογών. Οι κρίσιμες εφαρμογές είναι εκείνες με τις οποίες θα γίνει εργασία χρησιμοποιώντας το πρόγραμμα-πελάτη ιστού στο πρόγραμμα περιήγησης Google Chrome. Τέτοιες εφαρμογές, σε μεγάλο βαθμό, είναι εφαρμογές που εκτελούνται . Εάν η λύση της εφαρμογής σας σίγουρα δεν θα χρησιμοποιηθεί σε αυτήν τη λειτουργία, δεν μπορείτε να εγκαταλείψετε τις σύγχρονες μεθόδους προς το παρόν.

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

Αυτό σημαίνει ότι είναι καλύτερο για εσάς να αρχίσετε να ελέγχετε αυτόν τον τρόπο λειτουργίας τώρα. Παρόλο που η εφαρμογή σας μπορεί να μην τη χρησιμοποιεί ακόμα, συνιστούμε να ξεκινήσετε τη μετάφραση τώρα, εάν είναι δυνατόν. Ωστόσο, σας ενθαρρύνουμε να προσεγγίσετε αυτή τη διαδικασία δημιουργικά. Στο ίδιο πνεύμα όπως όταν εγκαταλείπουμε την τροπικότητα. Δηλαδή, δεν χρειάζεται να αντικατασταθούν μηχανικά οι σύγχρονες μέθοδοι με ασύγχρονες. Αρχικά, είναι χρήσιμο να σκεφτούμε αν είναι δυνατόν να αλλάξουμε τον αλγόριθμο ή το σενάριο έτσι ώστε σε αυτό το σημείο να εγκαταλείψουμε εντελώς τη χρήση σύγχρονων μεθόδων;

Αναπαράσταση

Από τη μία πλευρά, εάν η διαμόρφωση είναι μεγάλη και υπάρχουν πολλές σύγχρονες κλήσεις σε αυτήν, τότε η "χειροκίνητη" επανεπεξεργασία μιας τέτοιας διαμόρφωσης μπορεί να είναι μια πολύ χρονοβόρα εργασία.

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

Ως εκ τούτου, πήραμε αυτά τα ήδη υπάρχοντα εργαλεία, τα επεκτείναμε και τα επαναπροσανατολίσαμε από την «μετάβαση από την τροπικότητα» στη «μετάβαση στην ασύγχρονη». Στον πυρήνα της, η μετάβαση σε ασύγχρονες μεθόδους είναι παρόμοια με τις ενέργειες που εκτελούνται κατά την εγκατάλειψη της τροπικότητας. Οι παλιές, «μη μοντέρνες», σύγχρονες (τροπικές) κλήσεις πρέπει να αντικατασταθούν με νέες, «μοντέρνες», ασύγχρονες κλήσεις χρησιμοποιώντας Επεξεργασία ειδοποιήσεων.

Σε αυτήν την ενημερωμένη φόρμα, τα εργαλεία ανακατασκευής έχουν γίνει διαθέσιμα σε εσάς στην έκδοση 8.3.6.1977 .

Δεδομένου ότι η "έμφαση" αυτών των εργαλείων έχει μετατοπιστεί προς τον ασύγχρονο, έχουμε μετονομάσει ορισμένες εντολές. Αντί για τη λέξη "non-modal", χρησιμοποιείται πλέον η φράση "deprecated synchronous":

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

05.12.2014

Υλοποιήθηκε στην έκδοση 8.3.5.1383, 8.3.6.1977.

Σύγχρονες τάσεις

Οι τάσεις ανάπτυξης προγραμμάτων περιήγησης οδηγούν σε ένα ολοένα αυξανόμενο ποσοστό «ασυγχρονισμού» στην πλατφόρμα. Το πρώτο βήμα ήταν η εγκατάλειψη της τροπικότητας. Υπάρχουν πλέον ασύγχρονες κλήσεις για εργασία με επεκτάσεις κρυπτογραφίας, εργασία με αρχεία και εξωτερικά στοιχεία.

Ο λόγος για την επόμενη κίνηση προς τον ασυγχρονισμό ήταν ότι οι προγραμματιστές του προγράμματος περιήγησης Google Chrome εγκατέλειψαν την υποστήριξη της προηγούμενης τεχνολογίας NPAPI (Netscape Plugin Application Programming Interface). Αυτή η τεχνολογία χρησιμοποιήθηκε για τη σύνδεση εξωτερικών μονάδων - επεκτάσεων - στο πρόγραμμα περιήγησης.

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

Και τώρα, αντί της προηγούμενης σύγχρονης τεχνολογίας NPAPI, οι προγραμματιστές του Google Chrome δημιούργησαν μια νέα τεχνολογία Native Messaging. Ταυτόχρονα, συνέστησαν ανεπιφύλακτα σε όλους τους προγραμματιστές επεκτάσεων να μην χρησιμοποιούν την παλιά τεχνολογία, γιατί δεν θα υποστηρίζεται.

Χωρίς να υπεισέλθω σε λεπτομέρειες, η νέα τεχνολογία είναι καλύτερη και ασφαλέστερη. Αυτό είναι καλό. Αλλά μια από τις σημαντικές διαφορές του είναι ότι παρέχει αποκλειστικά ασύγχρονη αλληλεπίδραση με επεκτάσεις προγράμματος περιήγησης. Και αυτό απαιτεί μια ριζική αλλαγή σε όλες τις υπάρχουσες μεθόδους εργασίας με επεκτάσεις και εξωτερικά στοιχεία στο 1C:Enterprise. Γιατί όλα βασίζονται στη σύγχρονη αλληλεπίδραση.

Ασύγχρονες Μέθοδοι

Επιλύσαμε αυτό το πρόβλημα με τον ίδιο τρόπο όπως το πρόβλημα τροπικής κλήσης. Για όλες τις σύγχρονες μεθόδους που χρησιμοποιούν την τεχνολογία NPAPI, έχουμε δημιουργήσει τις ασύγχρονες αντίστοιχές τους. Διαφέρουν κυρίως στην παρουσία του προθέματος Start και στο ότι η πρώτη παράμετρος είναι η Alert Description, από την οποία θα συνεχιστεί η εκτέλεση του κωδικού προγράμματος μετά την ολοκλήρωση της καλούμενης ενέργειας.

Για παράδειγμα, αντί για τη μέθοδο Encrypt(), προτείνουμε τώρα να χρησιμοποιήσετε τη μέθοδο StartEncrypt():

Cryptography Manager.Encrypt(<ИсходныеДанные>, <Получатели>) Cryptography Manager.Start Encryption(<ОписаниеОповещения>, <ИсходныеДанные>, <Получатели>)

Αντί για τη μέθοδο GetFiles() - StartGettingFiles():

GetFiles(<ПолучаемыеФайлы>, <ПолученныеФайлы>, <РасположениеФайлов>, <Интерактивно>) Έναρξη λήψης αρχείων ((<ОписаниеОповещения>, <ПолучаемыеФайлы>, <РасположениеФайлов>, <Интерактивно>)

Αντί για InstallExternalComponent() - StartInstallingExternalComponent():

SetExternalComponent(<Местоположение>) Ξεκινήστε την εγκατάσταση εξωτερικών στοιχείων (<ОписаниеОповещенияОЗавершении>, <Местоположение>)

Στην πραγματικότητα, σε γενικές γραμμές, όλα μοιάζουν πολύ με αυτό που κάναμε πριν, όταν ξεφορτωθήκαμε το modality. Αλλά η λειτουργία νέων ασύγχρονων μεθόδων έχει ένα βασικό χαρακτηριστικό που δεν έχουν οι μέθοδοι που προκαλούν μη τροπικούς διαλόγους.

Κατά την ασύγχρονη κλήση ενός διαλόγου χωρίς μοντέλα, περιμένουμε μόνο κάποια αντίδραση του χρήστη και τίποτα περισσότερο. Με την έννοια ότι δεν μπορεί να συμβεί τίποτα αναπάντεχο.

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

Συνήθως παρέχετε χειρισμό τέτοιων εξαιρέσεων στον κώδικα της εφαρμογής σας. Χρήση του τελεστή Try... Εξαίρεση. Τώρα όμως αυτό γίνεται αδύνατο, γιατί τη στιγμή της ασύγχρονης κλήσης, ο κωδικός της εφαρμογής δεν εκτελείται. Αντίστοιχα, ο τελεστής Προσπάθεια... Εξαίρεση δεν λειτουργεί.

  • ErrorProcedureName;
  • Ενότητα χειρισμού σφαλμάτων.

Εάν κάτι πάει στραβά κατά τη διάρκεια μιας ασύγχρονης κλήσης και παρουσιαστεί μια εξαίρεση, θα εκτελεστεί η διαδικασία που υποδεικνύεται από αυτές τις ιδιότητες. Είναι λογικό να χρησιμοποιείτε αυτές τις δύο ιδιότητες μόνο σε ασύγχρονες μεθόδους εργασίας με επεκτάσεις. Όταν καλείτε διαλόγους χωρίς mode, δεν χρειάζεστε αυτές τις ιδιότητες.

Ιδιότητα διαμόρφωσης

Όπως και στην περίπτωση απόρριψης τρόπου λειτουργίας, ολόκληρη η λύση εφαρμογής στο σύνολό της πρέπει να γνωρίζει "τι είναι". Είτε είναι τροπικός είτε μη τροπικός. Είτε είναι σύγχρονο είτε ασύγχρονο.

Προηγουμένως, για να επιλύσουμε το πρόβλημα με τον τρόπο λειτουργίας, προσθέσαμε μια ειδική ιδιότητα στη διαμόρφωση: Mode of use modality. Τώρα, για να λύσουμε το πρόβλημα με το συγχρονισμό, προσθέσαμε μια ιδιότητα παρόμοια σε νόημα: Λειτουργία για χρήση σύγχρονων κλήσεων επεκτάσεων και εξωτερικών στοιχείων.

Η ουσία της χρήσης του είναι η εξής:

  • Το Do not use είναι ένας νέος, ασύγχρονος τρόπος λειτουργίας. Για νέες διαμορφώσεις αυτή είναι η τυπική λειτουργία. Η χρήση παλιών, σύγχρονων μεθόδων απαγορεύεται. Δεν περνούν τον συντακτικό έλεγχο, δεν βρίσκονται στο πλαίσιο. Η προσπάθεια εκτέλεσης μιας σύγχρονης μεθόδου δημιουργεί μια εξαίρεση.
  • Χρήση με προειδοποίηση - αυτή η λειτουργία προορίζεται για τον προγραμματιστή. Δεν εμποδίζει τη χρήση παλαιότερων, σύγχρονων μεθόδων. Αλλά κάθε φορά που καλείται μια σύγχρονη μέθοδος στον πελάτη, παράγει ένα προειδοποιητικό μήνυμα. Συνιστούμε τη χρήση αυτής της λειτουργίας σε διαμορφώσεις "ανακύκλωσης". Είναι βολικό για οπτική αναζήτηση για σύγχρονες κλήσεις και παρακολούθηση τους κατά τη διαδικασία αναθεώρησης.
  • Χρήση - μια λειτουργία που διασφαλίζει τη συμβατότητα της νέας έκδοσης της πλατφόρμας με παλιές διαμορφώσεις που χρησιμοποιούν σύγχρονες μεθόδους για εργασία με επεκτάσεις και εξωτερικά στοιχεία.

Όλες οι μέθοδοι και οι ιδιότητες για τις οποίες μιλήσαμε μέχρι στιγμής εφαρμόζονται στην έκδοση 8.3.5.1383. Μπορείτε να τα χρησιμοποιήσετε στις λύσεις εφαρμογών σας. Και οι προγραμματιστές BSP, για παράδειγμα, θα μεταφέρουν υποσυστήματα που χρησιμοποιούν εργαλεία κρυπτογράφησης, δουλεύουν με αρχεία και εξωτερικά στοιχεία σε ασύγχρονη λειτουργία.

Φυσικά, όπως συμβαίνει και με τις κλήσεις, πιθανότατα έχετε μια ερώτηση. Χρειάζεται να επαναλάβω τη λύση της εφαρμογής μου; Και γενικά, χρειάζεται να χρησιμοποιήσω αυτές τις ασύγχρονες μεθόδους στη νέα λύση εφαρμογής μου;

Πότε χρειάζεται;

Η απάντηση σε αυτό το ερώτημα είναι ουσιαστικά η ίδια που δώσαμε πριν. Όταν μιλούσαν για την εγκατάλειψη της τροπικότητας.

Πρώτον, δεν υποστηρίζει κάθε έκδοση της τεχνολογικής πλατφόρμας τη λειτουργία ασύγχρονων κλήσεων σε επεκτάσεις και εξωτερικά στοιχεία. Αυτός ο τρόπος λειτουργίας υπάρχει ξεκινώντας από την έκδοση 8.3.5.1383. Επομένως, εάν εργάζεστε σε χαμηλότερες εκδόσεις της πλατφόρμας, δεν χρειάζεται να ανησυχείτε για την εγκατάλειψη των σύγχρονων μεθόδων προς το παρόν.

Δεύτερον, δεν πρέπει απαραίτητα να χρησιμοποιούν αυτήν τη λειτουργία όλες οι λύσεις εφαρμογών. Οι κρίσιμες εφαρμογές είναι εκείνες με τις οποίες θα γίνει εργασία χρησιμοποιώντας το πρόγραμμα-πελάτη ιστού στο πρόγραμμα περιήγησης Google Chrome. Τέτοιες εφαρμογές, σε μεγάλο βαθμό, είναι εφαρμογές που λειτουργούν στο μοντέλο υπηρεσιών. Εάν η λύση της εφαρμογής σας σίγουρα δεν θα χρησιμοποιηθεί σε αυτήν τη λειτουργία, δεν μπορείτε να εγκαταλείψετε τις σύγχρονες μεθόδους προς το παρόν.

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

Αυτό σημαίνει ότι είναι καλύτερο για εσάς να αρχίσετε να ελέγχετε αυτόν τον τρόπο λειτουργίας τώρα. Παρόλο που η εφαρμογή σας μπορεί να μην τη χρησιμοποιεί ακόμα, συνιστούμε να ξεκινήσετε τη μετάφραση τώρα, εάν είναι δυνατόν. Ωστόσο, σας ενθαρρύνουμε να προσεγγίσετε αυτή τη διαδικασία δημιουργικά. Στο ίδιο πνεύμα όπως όταν εγκαταλείπουμε την τροπικότητα. Δηλαδή, δεν χρειάζεται να αντικατασταθούν μηχανικά οι σύγχρονες μέθοδοι με ασύγχρονες. Αρχικά, είναι χρήσιμο να σκεφτούμε αν είναι δυνατόν να αλλάξουμε τον αλγόριθμο ή το σενάριο έτσι ώστε σε αυτό το σημείο να εγκαταλείψουμε εντελώς τη χρήση σύγχρονων μεθόδων;

Αναπαράσταση

Από τη μία πλευρά, εάν η διαμόρφωση είναι μεγάλη και υπάρχουν πολλές σύγχρονες κλήσεις σε αυτήν, τότε η "χειροκίνητη" επανεπεξεργασία μιας τέτοιας διαμόρφωσης μπορεί να είναι μια πολύ χρονοβόρα εργασία.

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

Ως εκ τούτου, πήραμε αυτά τα ήδη υπάρχοντα εργαλεία, τα επεκτείναμε και τα επαναπροσανατολίσαμε από την «μετάβαση από την τροπικότητα» στη «μετάβαση στην ασύγχρονη». Στον πυρήνα της, η μετάβαση σε ασύγχρονες μεθόδους είναι παρόμοια με τις ενέργειες που εκτελούνται κατά την εγκατάλειψη της τροπικότητας. Οι παλιές, «μη μοντέρνες», σύγχρονες (τροπικές) κλήσεις πρέπει να αντικατασταθούν με νέες, «μοντέρνες», ασύγχρονες κλήσεις που χρησιμοποιούν την επεξεργασία ειδοποιήσεων.

Σε αυτήν την ενημερωμένη φόρμα, τα εργαλεία ανακατασκευής έγιναν διαθέσιμα σε εσάς στην έκδοση 8.3.6.1977.

Δεδομένου ότι η "έμφαση" αυτών των εργαλείων έχει μετατοπιστεί προς τον ασύγχρονο, έχουμε μετονομάσει ορισμένες εντολές. Αντί για τη λέξη "non-modal", χρησιμοποιείται πλέον η φράση "deprecated synchronous":

Επιπλέον, προσθέσαμε μια νέα καρτέλα Refactoring στις ρυθμίσεις του διαμορφωτή. Από προεπιλογή, και οι δύο μετασχηματισμοί είναι ενεργοποιημένοι. Αλλά, εάν το χρειάζεστε, με τη βοήθειά του μπορείτε να εκτελέσετε μόνο έναν από τους τύπους μετασχηματισμών κατά την αυτόματη ανακατασκευή:

Το άρθρο θα συζητήσει τους κύριους λόγους για την εγκατάλειψη της τροπικότητας στην πλατφόρμα 1C:Enterprise και τις κύριες μεθόδους για τη μετατροπή τμημάτων κώδικα σε ένα νέο ασύγχρονο μοντέλο.

Εφαρμογή

Το άρθρο εξετάζει το ασύγχρονο μοντέλο για τη δημιουργία επιχειρηματικής λογικής, την προστιθέμενη πλατφόρμα "1C:Enterprise" έκδοση 8.3. Οι πληροφορίες που παρουσιάζονται είναι σχετικές με τις τρέχουσες εκδόσεις πλατφόρμας.

Άρνηση χρήσης modal windows στην πλατφόρμα 1C:Enterprise 8.3

Κατά την ανάπτυξη μιας διαμόρφωσης στην πλατφόρμα 1C:Enterprise 8, προκύπτει περιοδικά η ανάγκη παύσης του προγράμματος μέχρι ο χρήστης να λάβει μια απόφαση ή να εκτελέσει κάποια ενέργεια.

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

Αυτή η συμπεριφορά μπορεί να επιτευχθεί, για παράδειγμα, με τον ακόλουθο κώδικα:

&OnClient
Διαδικασία Συμπληρώστε Προϊόντα(Ομάδα)
Απάντηση = Ερώτηση ("Το τμήμα του πίνακα θα διαγραφεί. Συνέχεια;", Λειτουργία διαλόγου Ερώτηση. Ναι Όχι);
Αν Απάντηση = Κωδικός επιστροφής διαλόγου.ΝαιΕπειτα
//αλγόριθμος πλήρωσης
Τέλος εαν ;
Διαδικασία λήξης

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

Το άνοιγμα των modal παραθύρων καλώντας τη μέθοδο OpenModal() προκαλεί επίσης παύσεις στην εκτέλεση κώδικα και αποκλεισμό της διεπαφής.

Όταν εργάζεστε με τη διαμόρφωση σε λειτουργία πελάτη web μέσω ενός προγράμματος περιήγησης, σε αυτήν την περίπτωση θα ανοίξει ένα νέο παράθυρο - ένα αναδυόμενο παράθυρο που θα αποκλείει όχι μόνο την τρέχουσα καρτέλα, αλλά και ολόκληρη τη διεπαφή του προγράμματος περιήγησης, συμπεριλαμβανομένων άλλων ανοιχτών παραθύρων και καρτελών.

Τα αναδυόμενα παράθυρα στο Διαδίκτυο χρησιμοποιούνται συχνά για την κακόβουλη διανομή ανεπιθύμητων διαφημίσεων, γι' αυτό και τα προγράμματα περιήγησης περιέχουν λειτουργίες αποκλεισμού αναδυόμενων παραθύρων.

Σε αυτήν την περίπτωση, για να εργαστείτε με διαμορφώσεις 1C:Enterprise 8 μέσω ενός προγράμματος περιήγησης, πρέπει να απενεργοποιήσετε τον αποκλεισμό αναδυόμενων παραθύρων.

Προβλήματα προκύπτουν επίσης κατά την εργασία σε κινητές συσκευές. Για παράδειγμα, τα modal windows δεν υποστηρίζονται στο iPad.

Για να λύσετε αυτά τα προβλήματα, θα πρέπει να χρησιμοποιήσετε τον αποκλεισμό των παραθύρων αντί για τα τροπικά. Για τον χρήστη, οπτικά όλα φαίνονται ίδια: το παράθυρο μπλοκάρει τη διεπαφή πελάτη web.

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

Έτσι, τα αναδυόμενα παράθυρα δεν ανοίγουν στο πρόγραμμα περιήγησης και διασφαλίζεται η εργασία μέσω του προγράμματος-πελάτη ιστού σε κινητές συσκευές.

Το ριζικό στοιχείο της διαμόρφωσης έχει μια ιδιότητα "Modality mode", η οποία καθορίζει εάν μπορούν να ανοίξουν παράθυρα modal στη διαμόρφωση.

Εάν είναι επιλεγμένη η επιλογή "Χρήση", τότε μπορούν να ανοίξουν τα παράθυρα τρόπων. Εάν είναι επιλεγμένη η επιλογή «Να μην χρησιμοποιείται», τότε δεν επιτρέπονται τα παράθυρα τροπικής λειτουργίας. Όταν προσπαθείτε να καλέσετε μια μέθοδο που ανοίγει ένα παράθυρο τρόπου λειτουργίας, το σύστημα εμφανίζει ένα μήνυμα σφάλματος:

Με αυτήν την τιμή της ιδιότητας "Modality usage mode", επιτρέπεται μόνο ο αποκλεισμός παραθύρων.

Εάν είναι επιλεγμένη η επιλογή "Χρήση με προειδοποιήσεις", τότε όταν ανοίγουν τα παράθυρα μοντάζ, εμφανίζεται το ακόλουθο κείμενο στο παράθυρο μηνύματος:

Αυτή η επιλογή εργασίας μπορεί να χρησιμοποιηθεί ως ενδιάμεση κατά την επανεπεξεργασία της διαμόρφωσης προκειμένου να εγκαταλειφθεί η χρήση των modal windows.

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

Επομένως, οι προγραμματιστές θα πρέπει να ξαναγράψουν τον κώδικα του προγράμματος που χρησιμοποιεί modal windows για να λάβουν υπόψη αυτήν τη δυνατότητα.

Ο κώδικας πρέπει να χωριστεί σε δύο μέρη:

  • άνοιγμα ενός παραθύρου αποκλεισμού.
  • επεξεργασία επιλογής χρήστη.

Το τμήμα κώδικα που δίνεται στην αρχή του άρθρου πρέπει να ξαναγραφτεί ως εξής:

&OnClient
Διαδικασία Συμπληρώστε Προϊόντα(Ομάδα)
Ειδοποίηση = Νέο ΠεριγραφήΕιδοποιήσεις(, ThisObject );

Λειτουργία διαλόγου Ερώτηση. Ναι Όχι);
Διαδικασία λήξης
&OnClient
Διαδικασία (Αποτέλεσμα, Επιπλέον επιλογές) Εξαγωγή
Αν Αποτέλεσμα = Κωδικός επιστροφής διαλόγου.ΝαιΕπειτα
//αλγόριθμος πλήρωσης
Τέλος εαν ;
Διαδικασία λήξης

Μετά την εκτέλεση της διαδικασίας ShowQuestion(), το σύστημα δεν σταματά, περιμένοντας την απάντηση του χρήστη, η εκτέλεση κώδικα συνεχίζεται.

Ο χρήστης θα μπορεί να κάνει μια επιλογή μόνο αφού ολοκληρωθεί ολόκληρη η διαδικασία. Σε αυτήν την περίπτωση, θα κληθεί η διαδικασία εξαγωγής FillItemsQuestionComplete(). Περάσαμε το όνομά του στον κατασκευαστή του αντικειμένου DescriptionAlerts.

Η διαδικασία που θα κληθεί μετά την επιλογή μπορεί να βρίσκεται σε μια ενότητα φόρμας, μια ενότητα εντολών ή μια γενική μη καθολική λειτουργική μονάδα.

Στο εξεταζόμενο παράδειγμα, η διαδικασία που καλείται βρίσκεται σε μια λειτουργική μονάδα διαχειριζόμενης φόρμας, επομένως περάσαμε στην παράμετρο ThisObject.

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

Τότε ο χειριστής εντολών συμπλήρωσης θα μοιάζει με αυτό:

&OnClient
Διαδικασία Συμπληρώστε Προϊόντα(Ομάδα)
Ειδοποίηση = Νέο ΠεριγραφήΕιδοποιήσεις(“Συμπλήρωση προϊόντων Συμπλήρωση ερώτησης”,
ProcessingAlerts);
Κείμενο Ερώτησης = «Το τμήμα του πίνακα θα διαγραφεί. Να συνεχίσει?" ;
ShowQuestion (Ειδοποίηση , Κείμενο ερώτησης , Λειτουργία διαλόγου Ερώτηση. Ναι Όχι);
Διαδικασία λήξης

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

Για να μεταφέρετε το περιβάλλον (βοηθητικά δεδομένα, ορισμένες παράμετροι, τιμές μεταβλητών) από τη διαδικασία που ανοίγει το παράθυρο τρόπου λειτουργίας στη διαδικασία που καλείται όταν είναι κλειστό, παρέχεται μια τρίτη προαιρετική παράμετρος του κατασκευαστή αντικειμένου: DescriptionAlerts – Πρόσθετες παράμετροι.

Αυτό το αντικείμενο (οποιουδήποτε τύπου) θα μεταβιβαστεί στη διαδικασία που περιγράφεται στην Περιγραφή ειδοποίησης ως τελευταία παράμετρος.

Χρησιμοποιώντας το παράδειγμα της ενότητας κώδικα που συζητήθηκε παραπάνω, αυτό μπορεί να γίνει ως εξής:

&OnClient
Διαδικασία Συμπληρώστε Προϊόντα(Ομάδα)
Παράμετρος1 = 0 ;
Παράμετρος2 = 0 ;
Λίστα παραμέτρων= Νέα δομή (“Parameter1, Parameter2″, Parameter1, Parameter2);
Ειδοποίηση = Νέο ΠεριγραφήΕιδοποιήσεις(“Συμπλήρωση προϊόντων Συμπλήρωση ερώτησης”, Αυτό το αντικείμενο,
Λίστα παραμέτρων);
ShowQuestion (Ειδοποίηση, "Το τμήμα του πίνακα θα διαγραφεί. Συνέχεια;",
Λειτουργία διαλόγου Ερώτηση. Ναι Όχι);
Διαδικασία λήξης
&OnClient
Διαδικασία Συμπληρώστε ΠροϊόνταΕρώτησηΣυμπλήρωση(Αποτέλεσμα, Επιπλέον επιλογές) Εξαγωγή
Αν Αποτέλεσμα = Κωδικός επιστροφής διαλόγου.ΝαιΕπειτα
//analyze Additional Parameters.Parameter1
//analyze Additional Parameters.Parameter2
Τέλος εαν ;
Διαδικασία λήξης

Εάν πρέπει να περάσετε μόνο μία τιμή, τότε δεν μπορείτε να χρησιμοποιήσετε τη δομή, αλλά να εκχωρήσετε αυτήν την τιμή στην παράμετρο Πρόσθετες παράμετροι του κατασκευαστή του αντικειμένου DescriptionAlerts.

Ας δούμε μερικά παραδείγματα εργασίας με μπλοκάρισμα παραθύρων.

Εργασία 1: Ανοίξτε μια άλλη φόρμα

Από τη φόρμα εγγράφου, κάνοντας κλικ στο κουμπί «Άνοιγμα παραμέτρων», πρέπει να ανοίξετε μια φόρμα στην οποία υπάρχουν δύο πλαίσια ελέγχου Παράμετρος1 και Παράμετρος2, τα οποία πρέπει να ορίσει ο χρήστης. Αφού κλείσετε τη φόρμα, εμφανίστε τις τιμές των παραμέτρων στη γραμμή μηνύματος.

Δημιουργούμε μια γενική φόρμα "ParametersForm", στην οποία τοποθετούμε τις λεπτομέρειες Parameter1 και Parameter2, καθώς και την εντολή CloseForm:

Ο χειριστής εντολών μοιάζει με αυτό:

Ο χειριστής εντολών μοιάζει με αυτό: &OnClient
Διαδικασία CloseForm (εντολή)
Λίστα παραμέτρων= Νέα δομή ( "Παράμετρος 1, Παράμετρος 2", Παράμετρος1 , Παράμετρος2 );
Κλείσε ( Λίστα παραμέτρων) Διαδικασία λήξης

Για τη φόρμα, ορίστε την ιδιότητα WindowOpenMode σε "Αποκλεισμός ολόκληρης της διεπαφής":

Στη φόρμα εγγράφου τοποθετούμε την εντολή OpenParameters, ο χειριστής της οποίας περιγράφεται ως εξής:

&OnClient
Διαδικασία OpenOptions(Ομάδα)
Ειδοποίηση = Νέο ΠεριγραφήΕιδοποιήσεις(«Άνοιγμα επιλογών Τέλος», ThisObject );
OpenForm ( "GeneralForm.FormParameters", , , , , , Γνωστοποίηση);
Διαδικασία λήξης
&OnClient
Διαδικασία OpenOptionsComplete(Αποτέλεσμα, Επιπλέον επιλογές) Εξαγωγή
Αν TypeValue (Αποτέλεσμα) = Πληκτρολογήστε ("Structure") Στη συνέχεια
Για κάθε KeyValue From Result Loop
Μήνυμα = Νέο Μήνυμα προς τον χρήστη;
Message.Text = "Κλειδί: "" ” + KeyValue.Key + “””, τιμή = ”
+ KeyValue.Value;
Μήνυμα.Αναφορά();
EndCycle ;
Τέλος εαν ;
Διαδικασία λήξης

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

Για μεγέθυνση, κάντε κλικ στην εικόνα.

Η λειτουργία ανοίγματος παραθύρου μπορεί επίσης να καθοριστεί στην τελευταία παράμετρο της διαδικασίας OpenForm.

&OnClient
Διαδικασία OpenOptions(Ομάδα)
Ειδοποίηση = Νέο ΠεριγραφήΕιδοποιήσεις(«Άνοιγμα επιλογών Τέλος», ThisObject );
OpenForm ( "GeneralForm.FormParameters", , , , , , Συναγερμός
FormWindowOpenMode.LockEntireInterface
);
Διαδικασία λήξης

Εργασία 2. Ερώτηση κατά το κλείσιμο της φόρμας

Όταν κλείνετε ένα παράθυρο επεξεργασίας, ρωτήστε τον χρήστη εάν θέλει πραγματικά να κλείσει το παράθυρο.

Αυτό το πρόβλημα μπορεί να λυθεί χρησιμοποιώντας τον ακόλουθο κώδικα που βρίσκεται στη μονάδα φόρμας επεξεργασίας:

&OnClient
Περέμ Πρέπει να κλείσετε τη φόρμα;
&OnClient
Διαδικασία πριν από το κλείσιμο (Αποτυχία, Τυπική Επεξεργασία)
Αν όχι Πρέπει να κλείσετε τη φόρμα= Αλήθεια Τότε
Refuse = Αληθινό ;
Ειδοποίηση = Νέο ΠεριγραφήΕιδοποιήσεις(“Πριν από το κλείσιμο Ολοκλήρωση”, ThisObject );
ShowQuestion (Ειδοποίηση, "Είστε βέβαιοι ότι θέλετε να κλείσετε το παράθυρο;",
Λειτουργία διαλόγου Ερώτηση. Ναι Όχι
);
Τέλος εαν ;
Διαδικασία λήξης
&OnClient
Διαδικασία Πριν από την ολοκλήρωση του κλεισίματος(Αποτέλεσμα, Επιπλέον επιλογές) Εξαγωγή
Αν Αποτέλεσμα = Κωδικός επιστροφής διαλόγου.ΝαιΕπειτα
Πρέπει να κλείσετε τη φόρμα= Αλήθεια ;
Κλείσε();
Σε διαφορετική περίπτωση
Πρέπει να κλείσετε τη φόρμα= Απροσδιόριστο ;
Τέλος εαν ;
Διαδικασία λήξης

Στη διαδικασία φόρμας Πριν από το κλείσιμο, τίθεται μια ερώτηση στον χρήστη, η σημαία άρνησης ορίζεται σε True και το κλείσιμο της φόρμας ακυρώνεται.

Μετά από μια καταφατική απάντηση στην ερώτηση, η μεταβλητή Need toCloseForm ορίζεται σε True και η φόρμα κλείνει ξανά.

Εργασία 3: Εισαγωγή αριθμητικής τιμής

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

Για να το κάνετε αυτό, πρέπει να χρησιμοποιήσετε τη μέθοδο ShowNumberInput() αντί για EnterNumber(), η οποία ανοίγει ένα παράθυρο αποκλεισμού αντί για ένα modal.

&OnClient
Διαδικασία εισαγωγής αριθμών (εντολή)
Ειδοποίηση = Νέο ΠεριγραφήΕιδοποιήσεις("EnterNumberComplete", ThisObject );
ShowEnterNumbers(Ειδοποίηση, 0, "Εισαγωγή ποσότητας", 15, 3);
Διαδικασία λήξης
&OnClient
Διαδικασία Εισαγωγή ΑριθμώνΣυμπλήρωση(Αποτέλεσμα, Επιπλέον επιλογές) Εξαγωγή

Μήνυμα = Νέο Μήνυμα προς τον χρήστη;
Message.Text = "Έχετε εισάγει μια ποσότητα" + Αποτέλεσμα;
Μήνυμα.Αναφορά();
Τέλος εαν ;
Διαδικασία λήξης

Μετά το κλείσιμο του παραθύρου εισαγωγής αριθμού, θα κληθεί μια διαδικασία, η πρώτη παράμετρος της οποίας θα είναι ο εισαγόμενος αριθμός ή η Απροσδιόριστη τιμή εάν ο χρήστης αρνηθεί να εισαγάγει.

Εργασία 4. Επιλογή χρώματος

Όταν κάνετε κλικ στο κουμπί στη φόρμα επεξεργασίας, χρησιμοποιώντας το διάλογο τυπικής επιλογής χρώματος, ο χρήστης καθορίζει το επιθυμητό χρώμα. Ορίστε αυτό το χρώμα για το φόντο του κουμπιού που κάνετε κλικ.

Προσθέστε την εντολή SelectColor στη φόρμα με τον ακόλουθο χειριστή:

&OnClient
Διαδικασία Επιλογή χρώματος (εντολή)
Διάλογος επιλογής χρώματος= Καινούργιο Διάλογος επιλογής χρώματος;
Ειδοποίηση = Νέο ΠεριγραφήΕιδοποιήσεις(«Ολοκληρώθηκε η επιλογή χρώματος», ThisObject );
Διάλογος επιλογής χρώματος.Εμφάνιση (Ειδοποίηση);
Διαδικασία λήξης
&OnClient
Διαδικασία ChoiceColorsCompletion(Αποτέλεσμα, Επιπλέον επιλογές) Εξαγωγή
Αν ΟΧΙ Αποτέλεσμα = Απροσδιόριστο Τότε
Στοιχεία.Επιλογή χρώματος.Χρώμα φόντου= Αποτέλεσμα ;
Τέλος εαν ;
Διαδικασία λήξης

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

Μετά το κλείσιμο του παραθύρου, θα κληθεί μια διαδικασία, στην πρώτη παράμετρο της οποίας θα περάσει η επιλεγμένη τιμή (χρώμα, γραμματοσειρά κ.λπ.) ή η τιμή Undefined εάν ο χρήστης έχει αρνηθεί την επιλογή.

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

Για να χρησιμοποιήσετε το παράθυρο διαλόγου επιλογής αρχείου στο πρόγραμμα-πελάτη Ιστού, πρέπει πρώτα να ενεργοποιήσετε την επέκταση αρχείου.

Οι διάλογοι που υλοποιούνται μέσω της επέκτασης αρχείου δεν δημιουργούν τα ίδια λειτουργικά προβλήματα με τα παράθυρα τροπικού προγράμματος περιήγησης, επομένως το άνοιγμα των παραθύρων αποκλεισμού για το αντικείμενο FileSelectionDialog δεν υλοποιήθηκε.

Συμπερασματικά, σημειώνουμε ότι ξεκινώντας από την έκδοση 8.3.10, η υποστήριξη για modal windows έχει διακοπεί στον web-πελάτη. Σε αυτήν την περίπτωση, εάν καλείται μια τροπική μέθοδος στη διαμόρφωση, δημιουργείται μια εξαίρεση. Επίσης, η υποστήριξη για τη λειτουργία διεπαφής έχει διακοπεί στο πρόγραμμα-πελάτη Ιστού Σε ξεχωριστά παράθυρα. Επιπλέον, τόσο στο πρόγραμμα-πελάτη thin όσο και στο πρόγραμμα-πελάτη web δεν είναι πλέον δυνατό να ανοίξετε μια φόρμα σε ξεχωριστό παράθυρο (όταν εργάζεστε στη λειτουργία διεπαφής σελιδοδεικτών). Τέτοια δραστικά βήματα κατέστησαν δυνατή την εγκατάλειψη της λειτουργίας διεπαφής, η οποία δεν υποστηρίζεται πλέον από όλα τα σύγχρονα προγράμματα περιήγησης.

Τι πρακτικό συμπέρασμα μπορεί να εξαχθεί από αυτές τις πληροφορίες; Και το συμπέρασμα είναι πολύ απλό - εάν για κάποιο λόγο εξακολουθούν να υπάρχουν τροπικές κλήσεις στη διαμόρφωσή σας, τότε σε αυτά τα μέρη του προγράμματος-πελάτη Ιστού θα εμφανιστεί ένα παράθυρο με ένα μήνυμα σφάλματος. Θα ήθελα να προειδοποιήσω να μην προσπαθήσετε να "Google" κάποια γρήγορη λύση σε αυτό το πρόβλημα, επειδή... Οι περισσότερες συμβουλές βασίζονται σε αυτήν τη συνταγή: στον διαμορφωτή σε επίπεδο διαμόρφωσης, ορίστε την ιδιότητα "Modality usage mode" σε "Use". Φυσικά, αυτή τη στιγμή, αυτό δεν θα λειτουργήσει μόνο επειδή τα ίδια τα σύγχρονα προγράμματα περιήγησης δεν υποστηρίζουν πλέον τις κλήσεις.

Και έχετε μόνο δύο τρόπους για να λύσετε το πρόβλημα που περιγράφεται παραπάνω:

  1. Ενημερώστε την πλατφόρμα για να κυκλοφορήσει την έκδοση 8.3.10+ (8.3.11), ορίστε την ιδιότητα διαμόρφωσης "Λειτουργία συμβατότητας" σε "Μη χρησιμοποιήστε" και ξαναγράψτε τμήματα κώδικα που χρησιμοποιούν τροπικές μεθόδους σε ένα ασύγχρονο επιχειρηματικό μοντέλο λογικής
  2. Προτείνετε στους πελάτες σας να χρησιμοποιούν παλαιότερα προγράμματα περιήγησης που εξακολουθούν να υποστηρίζουν τροπικές κλήσεις (εκδόσεις Mozilla Firefox 37 και νεότερες, εκδόσεις Chrome κάτω από 37 κ.λπ.).

Παρεμπιπτόντως, ξεκινώντας από την έκδοση 8.3.11, οι εκδόσεις 8 και 9 των προγραμμάτων περιήγησης ιστού Microsoft Internet Explorer δεν υποστηρίζονται πλέον.

Αντιμετωπίσαμε τα προγράμματα περιήγησης ιστού υπό το πρίσμα της τροπικότητας, τώρα ήρθε η ώρα να ξεκαθαρίσουμε την κατάσταση με άλλους πελάτες.

Ξεκινώντας με την έκδοση 8.3.5, η ιδιότητα Modality Usage Mode σε λεπτούς και χοντρούς πελάτες γίνεται σεβαστή μόνο εάν έχει καθοριστεί η επιλογή γραμμής εντολών /EnableCheckModal. Αυτή η παράμετρος εισάγεται αυτόματα στη γραμμή εντολών μόνο όταν η εφαρμογή εκκινείται από το πρόγραμμα διαμόρφωσης. Εάν αυτή η παράμετρος δεν έχει καθοριστεί, τότε δεν δημιουργούνται εξαιρέσεις και δεν εμφανίζονται οι αντίστοιχες προειδοποιήσεις. Εκείνοι. Στην πράξη, όταν χρησιμοποιείτε ένα παχύ και λεπτό πρόγραμμα-πελάτη, δεν παρατηρείται καμία θεμελιώδης αλλαγή στη λειτουργία κατά τη χρήση του τρόπου λειτουργίας - οι κλήσεις τροπικών θα λειτουργούν όπως λειτουργούσαν πριν, χωρίς να παράγουν προειδοποιήσεις, όπως στο πρόγραμμα-πελάτη web.

Για να σημαδέψετε τα i, σημειώστε ότι ξεκινώντας από την έκδοση 8.3.9, ο παχύς πελάτης αγνοεί την ιδιότητα διαμόρφωσης «Λειτουργία χρήσης σύγχρονων κλήσεων σε επεκτάσεις πλατφόρμας και εξωτερικά στοιχεία», ενώ οι αντίστοιχες σύγχρονες μέθοδοι λειτουργούν χωρίς να δημιουργούν εξαιρέσεις και να εμφανίζουν προειδοποιήσεις. Η καθορισμένη ιδιότητα που αγνοήθηκε προστέθηκε στην έκδοση 8.3.5 για την υποστήριξη ασύγχρονης εργασίας με εξωτερικά στοιχεία, κρυπτογραφία και επεκτάσεις για εργασία με αρχεία στο πρόγραμμα περιήγησης ιστού Google Chrome. Είναι σαφές ότι αυτό δεν έχει να κάνει με τον παχύ πελάτη και επομένως η «αθόρυβα» αγνόηση αυτής της ιδιότητας απλώς εξαλείφει τους περιττούς ελέγχους για τη χρήση σύγχρονων μεθόδων κατά τη χρήση της διαμόρφωσης.

Παρεμπιπτόντως! Λόγω του γεγονότος ότι η πλατφόρμα κινείται με σιγουριά προς το διαδίκτυο, με την έκδοση 8.3.8 οι προγραμματιστές έχουν εισαγάγει ορισμένους περιορισμούς στον κώδικα του προγράμματος που σχετίζεται με τη λογική για το κλείσιμο μιας φόρμας ή μιας εφαρμογής, που εκτελείται σε πυκνούς και λεπτούς πελάτες. Φροντίστε να διαβάσετε το άρθρο μας που καλύπτει λεπτομερώς αυτήν την απόχρωση. Επιπλέον, στο μάθημα «Επαγγελματική ανάπτυξη διεπαφών και φορμών στο 1C: Enterprise 8.3», υπάρχει ένα κεφάλαιο αφιερωμένο στην εγκατάλειψη της τροπικότητας και μπορείτε να συγκεντρώσετε πολλές χρήσιμες και σχετικές πληροφορίες για αυτό το θέμα.

Συνάδελφοι, υπάρχουν δύο πράγματα που μπορείτε να διαβάσετε ατελείωτα: τη ροή VKontakte και τη λίστα των αλλαγών στην επόμενη έκδοση της πλατφόρμας, οπότε ας συνοψίσουμε τα τελικά αποτελέσματα.)

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

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

Αντί για συμπέρασμα

Ο κύκλος μας «Πρώτα βήματα στην ανάπτυξη 1C» έφτασε στο τέλος του. Αν το διαβάσετε ολόκληρο, τότε πιθανότατα έχετε ήδη παρατηρήσει πώς η πλατφόρμα αναπτύσσεται αλματωδώς τον τελευταίο καιρό. Το υλικό αυτής της σειράς γράφτηκε σχετικά πρόσφατα, αλλά αναγκαστήκαμε να το ενημερώσουμε σοβαρά, γιατί... Ακόμη και σε τόσο σύντομο χρονικό διάστημα, έχουν εμφανιστεί πολλές νέες σημαντικές λειτουργίες και αλλαγές. Τέτοιες σημαντικές αλλαγές μπορεί να είναι κάπως περίπλοκες για έναν προγραμματιστή 1C, εάν δεν έχει αναπτυχθεί και αναπτυχθεί επαγγελματικά με την πλατφόρμα όλο αυτό το διάστημα.

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

Γιατί εμφανίζεται το σφάλμα "Η χρήση σύγχρονων μεθόδων στον πελάτη απαγορεύεται";

Εάν αντιμετωπίσετε ένα τέτοιο σφάλμα κατά την ολοκλήρωση των μαθημάτων, είναι πολύ εύκολο να το διορθώσετε.

Επιστρέψτε στο πρόγραμμα διαμόρφωσης και επιλέξτε το στοιχείο μενού "Configuration" -> "Open configuration":

Στο παράθυρο που ανοίγει, κάντε δεξί κλικ στο στοιχείο "Διαμόρφωση" και επιλέξτε "Ιδιότητες" από το μενού που ανοίγει:

Θα ανοίξει ένα παράθυρο με ιδιότητες διαμόρφωσης (δεξιά):

Κάντε κύλιση στο κάτω μέρος και βρείτε το στοιχείο "Modality mode" εκεί:

Ορίστε την τιμή του σε "Χρήση":

Προσοχή!Λάβετε υπόψη ότι εάν χρησιμοποιείτε μια πλατφόρμα 1C διαφορετική από αυτήν που κατεβάσαμε στο πρώτο μάθημα (μεταγενέστερη έκδοση), τότε θα έχετε επίσης το πεδίο "Λειτουργία για χρήση σύγχρονων κλήσεων...". Πρέπει επίσης να ρυθμιστεί σε "Χρήση".

Τέλος, επιλέξτε το στοιχείο μενού "Configuration" -> "Save configuration":

Ετοιμος! Τώρα το σφάλμα δεν θα εμφανίζεται πλέον.

Επεξηγήσεις παρακάτω - για όσους ενδιαφέρονται για αυτό που κάναμε.

Έχουμε ενεργοποιήσει τη λειτουργία modality στη διαμόρφωσή μας. Από προεπιλογή, αυτή η λειτουργία είναι απενεργοποιημένη και αυτό δεν μας επιτρέπει να χρησιμοποιούμε εντολές όπως EnterNumber, EnterString, EnterDate, OpenValue.

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

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