Σχέδιο λειτουργίας της υπηρεσίας web 1C. Διαδικτυακές υπηρεσίες. Παροχή λειτουργικότητας μέσω υπηρεσιών Web


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

Χαρακτηριστικό του άρθρουείναι αυτό:

  • Διάφορες μέθοδοι και τεχνικές που μπορούν να χρησιμοποιηθούν κατά την ενσωμάτωση εφαρμογών 1C, WEB (php) και φορητών συσκευών (Ios, Android) εξετάζονται (και συγκρίνονται μεταξύ τους).
U διαφορετικοί τρόποιέχουν τα πλεονεκτήματα/τα μειονεκτήματά τους και είναι λογικό να επιλέξετε το πιο απλό, συμπαγές για μια συγκεκριμένη εργασία.
  • Ταυτόχρονα, δίνονται παραδείγματα λύσεων τόσο από την πλευρά 1C όσο και από την πλευρά του διακομιστή WEB (PHP).
Παραδείγματα λύσεων μπορεί να είναι χρήσιμα τόσο για προγραμματιστές 1C όσο και για ειδικούς WEB, εκείνους που εργάζονται στη διασταύρωση περιοχών.
  • Όλες οι απαραίτητες πληροφορίες έχουν συγκεντρωθεί μαζί ( οδηγίες βήμα προς βήμα) για να κάνετε μια «γρήγορη εκκίνηση» και να ξεκινήσετε την ανάπτυξη. Δηλαδή, για να μην χάνουμε πολύ χρόνο μελετώντας και ρυθμίζοντας WEB servers, windows, «μάχοντας» σφάλματα συστήματοςκαι τα λοιπά.
Το άρθρο απευθύνεται σε:
  • 1C: Προγραμματιστές και ειδικοί στο WEB που μελετούν την ενοποίηση χρησιμοποιώντας τεχνολογία διαδικτυακών υπηρεσιών.
  • Οι σχεδιαστές και οι αναλυτές πληροφορικής πρέπει να κατανοήσουν την «ουσία» και να κάνουν μια ορθολογική επιλογή τεχνολογιών κατά τη δημιουργία έργων.
Ολοκληρώνοντας το εισαγωγικό μέρος, αξίζει να πούμε ότι εάν είχατε ήδη εμπειρία εργασίας με τεχνολογίες COM/Ole, τότε αυτό θα σας βοηθήσει να κατανοήσετε καλά την τεχνολογία των υπηρεσιών WEB.

1.1 Δυνατότητες τεχνολογίας, υποστήριξη από την πλατφόρμα 1C

1.2 Εφαρμογή τεχνολογιών για εργασίες αλληλεπίδρασης πελάτη-διακομιστή.


2. Γρήγορη εκκίνηση. Από πού να ξεκινήσω;


Σημείο Νο. 0.
Πρώτα απ 'όλα, πρέπει να επιλέξετε (να αποφασίσετε) για την τεχνολογία ενσωμάτωσης και να κατανοήσετε την "ουσία" - δηλαδή πώς θα λειτουργήσει.
Με άλλα λόγια, πρέπει να απαντήσετε σε δύο ερωτήσεις:

  • Ποια βάση δεδομένων 1C (ή άλλο πρόγραμμα) θα λειτουργεί ως πελάτης και ποια ως διακομιστής.
Όταν προσδιορίζετε ποιος θα είναι ο πελάτης και ποιος ο διακομιστής, μπορείτε να χρησιμοποιήσετε απλός κανόνας: Ο πελάτης μπορεί να "καλέσει" (ελέγχει) τον διακομιστή, αλλά δεν είναι δυνατή η επιστροφή κλήσης.
  • Ποια τεχνολογία αλληλεπίδρασης πελάτη-διακομιστή είναι πιο κατάλληλη για εσάς και θα χρησιμοποιηθεί.
Περιέγραψα τις συστάσεις μου για την επιλογή τεχνολογίας παραπάνω.

Σημείο Νο. 1.
Έτσι, κατανοείται η «ουσία» της αλληλεπίδρασης πελάτη-διακομιστή. Η τεχνολογία αλληλεπίδρασης έχει προσδιοριστεί. Τώρα πρέπει να δημιουργήσετε ένα «πεδίο δοκιμών» όπου θα πραγματοποιηθεί η ανάπτυξη.

Σε αυτό το άρθρο, δύο τεχνολογίες θα συζητηθούν χρησιμοποιώντας παραδείγματα:

Συνεργασία με τον μηχανισμό υπηρεσιών WEB.

Θα ληφθούν υπόψη παραδείγματα εργασιών από το 1C 8 και την PHP.

Εργασία με τον μηχανισμό αιτήματος http (REST Web services).

Θα ληφθούν επίσης υπόψη παραδείγματα εργασιών από το 1C 8 και την PHP.
Σε εργασίες που σχετίζονται με την ανάπτυξη WEB, είναι παραδοσιακά αποδεκτό:

  • Δημιουργήστε ένα «πεδίο δοκιμής» για ανάπτυξη και εντοπισμό σφαλμάτων στον τοπικό διακομιστή WEB του προγραμματιστή (localhost).
  • Μετά την ολοκλήρωση της ανάπτυξης, τα αποτελέσματα πρέπει να μεταφερθούν στον "combat" διακομιστή WEB.

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

Έτσι, για να μην «χάσουμε» πολύ χρόνο «παλεύοντας» με τις ρυθμίσεις IIS(Internet Information Server) / mastering του διακομιστή απάχης, και τη δημιουργία δικαιωμάτων Πρόσβαση στα Windows, προτείνω τα εξής:

  • (1) Δημιουργήστε το "Πολύγωνο" στην τοπική μηχανή εργασίας σας. Λειτουργικό σύστημα - Windows 7 (επαγγελματικό ή μέγιστο). Όλες οι εργασίες πρέπει να γίνονται κάτω από λογαριασμόςδιαχειριστής.
  • (2) Αναπτύξτε τη βάση δεδομένων 1C 8 σε λειτουργία πελάτη-διακομιστή (MS Διακομιστής SQL, προτείνω 2008 R2). Η χρήση του 1C 8 σε λειτουργία πελάτη-διακομιστή θα εξαλείψει την ανάγκη εκτέλεσης πρόσθετης εργασίας. ρυθμίσεις για δικαιώματα πρόσβασης στη βάση δεδομένων 1C από τον διακομιστή WEB.
  • (3) Εγκατάσταση IIS, αν λείπει. Στα Windows μπορείτε να το "επανεγκαταστήσετε" τακτικά

Τα πλαίσια ελέγχου για τις επιλογές εγκατάστασης για στοιχεία IIS μπορούν να οριστούν από προεπιλογή.
Τα σημαντικά πράγματα που πρέπει να προσέξετε είναι οι ακόλουθες επιλογές (επεκτάσεις ISAPI - αυτό απαιτείται για να λειτουργούν οι συνδέσεις σαπουνιού σε υπηρεσίες WEB και CGI - αυτό απαιτείται για να λειτουργήσει η PHP)

Αφού ολοκληρωθεί η εγκατάσταση IISΑς βεβαιωθούμε ότι λειτουργεί. Για αυτό, σε γραμμή διεύθυνσηςΕισαγάγετε το πρόγραμμα περιήγησης WEB:

(4) Δημοσίευση (σύνδεση) βάσης δεδομένων 1C σε διακομιστή WEB.

Και έτσι, διακομιστής WEB IISεγκατασταθεί και λειτουργεί. Ας δημοσιεύσουμε τη βάση δεδομένων μας 1C και ας ελέγξουμε ότι η πρόσβαση σε αυτήν είναι πλέον δυνατή και μέσω του προγράμματος-πελάτη WEB.

Συνιστάται η δημοσίευση σε διακομιστή WEB της βάσης δεδομένων 1C που παρέχει λειτουργία σε λειτουργία διαχειριζόμενης εφαρμογής (thin client).

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

β) Καθορίστε τις παραμέτρους δημοσίευσης:

Δηλαδή σε έναν κατάλογο (φάκελο) wwwrootδικό σου IISπρέπει να δημιουργήσετε έναν ξεχωριστό φάκελο (κατάλογο) για τη δημοσίευση της βάσης δεδομένων 1C.

ο κατάλογος wwwroot θα δημιουργηθεί αυτόματα όταν εγκατασταθεί το IIS
Ας δημιουργήσουμε και επιλέξουμε έναν τέτοιο φάκελο (wsBase10), προσδιορίζουμε το όνομα για δημοσίευση (θα τον ονομάσουμε επίσης wsBase10).

Εάν, ξαφνικά, λάβετε ένα μήνυμα ως απάντηση,

τότε μη φοβάσαι.

Ο μηχανισμός δημοσίευσης 1C είναι πολύ ιδιότροπος. Δοκιμάστε να κάνετε ξανά κλικ στο "Δημοσίευση".

Και αν ως αποτέλεσμα λάβετε ένα μήνυμα,

αυτό σημαίνει ότι όλα λειτούργησαν.

Είναι πολύ σημαντικό να κατανοήσουμε ότι κατά τη δημοσίευση μιας βάσης δεδομένων 1C και των υπηρεσιών WEB της σε έναν διακομιστή "combat" (για παράδειγμα, Windows 2008 R2), εμφανίζονται συχνά σφάλματα εάν αποφασίσετε να χρησιμοποιήσετε έναν διακομιστή ιστού IIS.

Συμβουλή: μην εγκαταστήσετε σε διακομιστή "combat". IIS! Εγκαθιστώ απάχης.

Αυτό θα σας προστατεύσει από πολλά σφάλματα συστήματος. Και η δημοσίευση (αναδημοσίευση - με αλλαγές στη διαμόρφωση) θα γίνει για απάχηςομαλά, χωρίς να χρειάζεται να ασχοληθείτε με τα αρχεία και τις ρυθμίσεις vrd IIS.

Σε αυτό το άρθρο δεν θα εξετάσω τη διαδικασία εγκατάστασης και ρυθμίσεις apache. Υπάρχουν και άλλες πηγές για αυτό το θέμα.

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

1. Κατά την εγκατάσταση απάχηςΦροντίστε να ενεργοποιήσετε την υποστήριξη για επεκτάσεις ISAPI.

2. Ενεργοποιήστε την υποστήριξη cgi-bin εάν εργάζεστε με PHP.

3. Θα χρειαστεί να εισαγάγετε έναν ειδικό «χρήστη» στη βάση δεδομένων 1C...

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

... Τελειώσαμε με το apache και ας επιστρέψουμε ξανά στο «Πολύγωνο» μας.

Εδώ βλέπουμε - το 1C ξεκινά. Ο διακομιστής WEB μαζί με το 1C λειτουργεί.
4. Εγκαταστήστε την υπηρεσία PHP για WINDOWS.

Θα το χρειαστείτε εάν, ως μέρος της εργασίας σας, πρέπει να αναπτύξετε πελάτη (ιστοσελίδες για πρόσβαση σε 1C) ή διακομιστή (σενάρια επεξεργασίας αιτημάτων http από 1C) στην PHP.

5 Ας προσθέσουμε τον κατάλογο wsClient10 στο IIS, στον οποίο θα εκτελούνται τα σενάρια PHP μας.

Σενάρια PHP που θα χρησιμοποιήσουμε:

  • Για να δημιουργήσετε το τμήμα πελάτη κατά την ανάπτυξη υπηρεσιών 1C WEB.
  • Για την ανάπτυξη του τμήματος διακομιστή, κατά την ανάπτυξη υπηρεσιών web REST (αιτήματα http).

6. Ας εγκαταστήσουμε το πρόγραμμα Notepap++. Αυτό το συμπαγές και βολικό πρόγραμμαΣυνιστώ να το χρησιμοποιήσετε για να επεξεργαστείτε σενάρια PHP.

Μετά την εγκατάσταση του Notepad++, θα ελέγξουμε αμέσως ότι η PHP λειτουργεί για εμάς. Ας δημιουργήσουμε ένα απλό σενάριο hello.php για αυτό. Ας το τοποθετήσουμε στον κατάλογο wsClient και ας εκτελέσουμε το σενάριο από το πρόγραμμα περιήγησης:

Ολα καλά. Η PHP λειτουργεί. Ο χώρος δοκιμών είναι εντελώς έτοιμος.

3. Δημιουργία υπηρεσίας WEB, αιτήματα σαπουνιού, XDTO και JSON. Παραδείγματα 1C και PHP. Σε αυτό το στάδιο, θα πρέπει να έχετε έτοιμο το "Polygon" και μπορείτε να ξεκινήσετε την ανάπτυξη υπηρεσιών WEB.

- Από πού να ξεκινήσετε τη μελέτη αυτής της τεχνολογίας; Φυσικά, με ένα κλασικό πρόβλημα όπως το «Hello word»!

1. Το έργο της δημιουργίας του απλούστερου υπηρεσία WEB. Ας δούμε παραδείγματα σε 1C και PHP.

1.1. Ας προσθέσουμε στη βάση δεδομένων (wsBase10) την υπηρεσία ιστού "_Υπολογισμοί κατά τιμολόγια"

Ας ορίσουμε το όνομα του αρχείου δημοσίευσης σε "calcOrder10.1cws". Πρέπει επίσης να καθοριστεί ο χώρος ονομάτων URI. Κατ 'αρχήν, μπορείτε να καθορίσετε οποιοδήποτε όνομα.

1.2. Ας προσθέσουμε την πράξη "getHello" εντός της υπηρεσίας web "_Υπολογισμοί κατά τιμολόγια".

Η ουσία της λειτουργίας θα είναι η απλούστερη - πάρτε τρεις παραμέτρους (συμβολοσειρές, αριθμούς) ως είσοδο (από τον πελάτη) και επιστρέψτε μια ενοποιητική συμβολοσειρά πίσω σε αυτόν (ως αποτέλεσμα). Ο τύπος τιμής επιστροφής θα είναι πρωτόγονος - συμβολοσειρά.

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

Εάν η λειτουργία μας άλλαξε δεδομένα στη βάση δεδομένων 1C, τότε η επιλογή αυτού του πλαισίου θα είχε νόημα.
Το όνομα της μεθόδου (συνάρτησης) που θα επεξεργαστεί τα εισερχόμενα δεδομένα (και θα επιστρέψει το αποτέλεσμα) θα είναι "getHello".

1.3. Ας προσθέσουμε εισερχόμενες παραμέτρους για τη λειτουργία "getHello".

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

1.4. Ας γράψουμε ένα πρόγραμμα χειρισμού για τη λειτουργία "getHello" στη μονάδα υπηρεσιών web
///////////////////

Συνάρτηση getHello(strParametr, floatParametr, integerParametr)
επιστροφή strParametr+string(floatParametr+integerParametr)
EndFunction

////////

1.5. Σε αυτό το σημείο ολοκληρώνεται η εργασία για τη δημιουργία μιας απλής υπηρεσίας WEB. Και τώρα, πρέπει να δημοσιεύσετε την υπηρεσία WEB "_Calculations by Tariffs".

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

- Γιατί να το κάνεις αυτό;

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

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

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

1.6. Και έτσι, ας δημοσιεύσουμε την υπηρεσία WEB:

Λάβετε υπόψη ότι δεν χρειάζεται να ελέγξουμε το πλαίσιο ελέγχου "Χρήση ελέγχου ταυτότητας λειτουργικού συστήματος στον διακομιστή ιστού". Είναι επειδή αυτή τη λειτουργίαπαρέχεται μόνο για διακομιστή WEB IIS, και στον διακομιστή "combat" θα λειτουργήσει Απάχης.

1.7. Ας δημιουργήσουμε ένα τμήμα πελάτη και ας δοκιμάσουμε τη λειτουργία του διακομιστή WEB.

ΕΝΑ) Αρχικά, ας κάνουμε μια κλήση πελάτη από το 1C.

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

/////

&OnClient
Διαδικασία Εκτέλεση ερωτήματος 10 (εντολή)
// Εισαγάγετε τα περιεχόμενα του προγράμματος χειρισμού.
LineResult = SERVER_ExecuteWSQuery10();
Warning(StringResult);
Τέλος Διαδικασίας
&OnServerWithout Context
Συνάρτηση SERVER_RunWSRequest10()
// Δεν θα πραγματοποιήσουμε έλεγχο ταυτότητας στην τοποθεσία δοκιμής!
Όνομα χρήστη = απροσδιόριστο;
Κωδικός πρόσβασης = απροσδιόριστος;
http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ",UserName,Password);
Proxy.User = Όνομα χρήστη;
Proxy.Password = Undefined;
strResult = Proxy.getHello("Ivanov",100.35,20);
επιστροφή strResult;
EndFunction ///////////////////////////////////////////////////////////////////////////////////////

Ας ελέγξουμε τη λειτουργία της συνάρτησης SERVER_ExecuteWSRequest10().

ΕΝΤΑΞΕΙ. Εργα!
σι) Τώρα ας κάνουμε μια κλήση πελάτη στην υπηρεσία web από την PHP.
Ο κώδικας σεναρίου PHP θα είναι κάπως έτσι:

/
//////////////////////////////////////////////////////////////////////////////////

error_reporting(E_ERROR); // 1. Απενεργοποιήστε τα περιττά μηνύματα
// 2. Απενεργοποιήστε την προσωρινή αποθήκευση για το SOAP. Εάν αυτό δεν γίνει,


// 3. Δημιουργήστε μια σύνδεση σαπουνιού
$client = new SoapClient("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ",
πίνακας(
"login" => null, //login, δεν θα πραγματοποιήσουμε έλεγχο ταυτότητας
"password" => null, //password
"ίχνος" => αληθές,
"features" => SOAP_USE_XSI_ARRAY_TYPE,
//"συμπίεση" =>
);
// 4. Συμπλήρωση του πίνακα των περασμένων παραμέτρων
$params["strParametr"] = "test_Soap10:";
$params["floatParametr"] = 10,34;
$params["integerParametr"] = 12;
// 5. Εκτελέστε τη λειτουργία getHello
$result = $client->getHello($params);
// 6. Εμφανίστε το αποτέλεσμα στην οθόνη
var_dump($result);
?>

////
///

Ας καλέσουμε το σενάριο από το πρόγραμμα περιήγησης και ας ελέγξουμε τη λειτουργία του:

Όλα είναι καλά, η κλήση 1C από μια ΙΣΤΟΣΕΛΙΔΑ λειτουργεί!

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

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

2. Η εργασία δημιουργίας μιας υπηρεσίας WEB χρησιμοποιώντας πακέτα XDTO.

Όπως και πριν, ας δούμε παραδείγματα σε 1C και PHP.

Ας βάλουμε στους εαυτούς μας το εξής καθήκον:Η υπηρεσία WEB θα πρέπει να μας επιστρέψει όχι μια συμβολοσειρά, αλλά δεδομένα αντικειμένου - έναν "πίνακα τιμών" (ακριβέστερα, θα είναι ένας πίνακας αντικειμένων!).

Προκειμένου να περιγραφούν διάφορες δομές δεδομένων (οι οποίες θα απαιτηθούν κατά τη λήψη/μετάδοση στον διακομιστή WEB), η πλατφόρμα 1C:8 παρέχει έναν μηχανισμό για πακέτα XDTO.

Εκείνοι. Πρώτα περιγράφουμε όλους τους τύπους δεδομένων που χρειαζόμαστε και μετά υποδεικνύουμε:

  • Με ποια πακέτα XDTO μπορεί να λειτουργήσει η υπηρεσία WEB μας (μπορείτε να καθορίσετε είτε ένα είτε μια λίστα πακέτων).
  • Για κάθε παράμετρο της λειτουργίας και το αποτέλεσμα που επιστρέφει, μπορείτε να καθορίσετε τι είδους δεδομένα (από το πακέτο XDTO) θα είναι.
Στη συνέχεια, θα εξετάσουμε την εργασία με το XDTO χρησιμοποιώντας το παράδειγμα λήψης ενός συγκεκριμένου "πίνακα τιμών" από τον διακομιστή:

Ας δημιουργήσουμε τη λειτουργία GetTzTariffs_0, η οποία θα επιστρέψει δεδομένα του τύπου tzTariffs.

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

- Πώς να το δείτε;

  • Εάν η παράμετρος "μέγιστο" ορίζεται ως "-1", τότε ο αριθμός αυτών των αντικειμένων δεν είναι περιορισμένος (πίνακας με απεριόριστο αριθμό σειρών).
  • Εάν δεν χρειαζόμαστε έναν πίνακα, αλλά χρειαζόμαστε απλώς μια δομή (μία σειρά), τότε οι μέγιστες και ελάχιστες τιμές θα πρέπει να προσδιορίζονται ίσες με "1".
  • Με τη σειρά του, το αντικείμενο el είναι μια δομή που περιέχει ένα χαρακτηριστικό τύπου αντικειμένου (eTariff) και ένα χαρακτηριστικό πρωτόγονου τύπου (cPrice, σχόλιο).

Προχωρώντας προς τα κάτω στην ιεραρχία, μπορείτε να δείτε ότι ο τύπος τιμολόγησης είναι μια δομή (μέγιστη και ελάχιστη ποσότητα = 1), μία από τις λεπτομέρειες της οποίας περιλαμβάνει τον τύπο kindOfTariff.

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

Συμβουλή: Είναι καλύτερο να χρησιμοποιήσετε ένα πακέτο XDTO για μια υπηρεσία web για να αποφύγετε την πολυπλοκότητα και να αποφύγετε σφάλματα σχεδιασμού.
Ας προχωρήσουμε... Μετά:

  • Το πακέτο XTDO έχει δημιουργηθεί.
  • Περιγράφονται όλοι οι τύποι δεδομένων.
  • Για την υπηρεσία WEB, υποδεικνύεται η χρήση αυτού του πακέτου.
  • Για παραμέτρους και αποτελέσματα λειτουργιών επιλέγονται οι κατάλληλοι τύποι (από το πακέτο XDTO)
Στη συνέχεια, μπορείτε να προχωρήσετε στο «γέμισμα» αντικειμένων (δομές, πίνακες δομών) με δεδομένα.

Στο παράδειγμά μας, η λειτουργία GetTzTariffs_0 θα πρέπει να επιστρέψει μια σειρά από συμβολοσειρές που περιέχει αντικείμενα Tariffs.

////////////////

Συνάρτηση GetTzTariffs_0()
// Εισαγάγετε τα περιεχόμενα του προγράμματος χειρισμού.
Επιστροφή GetTZTariffs_0();
EndFunction

Συνάρτηση GetTZTariffs_0()


// Συμπλήρωση των τεχνικών προδιαγραφών
// 1η γραμμή

kindOfTariff.active = ψευδής;


tariff.kind = kindOfTariff;

elementTZ.eTariff = τιμολόγιο;
elementTZ.cΤιμή = 100;

//
// 2η γραμμή
kindOfTariff = FactoryXDTO.Create(kindOfTariffType);

tariff = FactoryXDTO.Create(tariffType);
tariff.begdate = CurrentDate();
tariff.kind = kindOfTariff;
elementTZ = FactoryXDTO.Create(elementTZType);
elementTZ.eTariff = τιμολόγιο;
elementTZ.cΤιμή = 200;
// Προσθέστε τη 2η σειρά στον πίνακα
tzTariffs.el.Add(elementTZ);
Επιστροφή tzTariffs;
EndFunction

//////////
Στη συνέχεια, δίνουμε ένα παράδειγμα κλήσης της λειτουργίας "GetTzTariffs_0" από την πλευρά του πελάτη, από 1C.

&OnClient
Διαδικασία Εκτέλεση ερωτήματος 20 (εντολή)
// Εισαγάγετε τα περιεχόμενα του προγράμματος χειρισμού.
Warning(SERVER_ExecuteWSQuery20());
Τέλος Διαδικασίας
&OnServerWithout Context
Συνάρτηση SERVER_ExecuteWSRequest20()
Ορισμοί = νέοι ορισμοί WSD("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl");
Proxy = new WSPProxy(Definitions,"www.URI.com","_Calculations By Tariffs","_Calculations By TariffsSoap");
XDTResult = Proxy.GetTzTariffs_0();
// Ας προσπελάσουμε τη γραμμή στο δείκτη μηδέν, μετά στο χαρακτηριστικό eTariff, μετά στο είδος του ένθετου χαρακτηριστικού και μετά στο όνομα του ένθετου χαρακτηριστικού.
EndFunction

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Μια παρόμοια κλήση από την PHP και επεξεργασία των αποτελεσμάτων XDTO θα ήταν ως εξής:
////////////////////////////////////////////////////////////////////////////////////



// Οι συναρτήσεις της υπηρεσίας web δεν θα λειτουργήσουν σωστά.
ini_set("soap.wsdl_cache_enabled", "0");
$client = new SoapClient("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl");
$result = $client->GetTzTariffs_0();
$mResult = $result->return->el;
// mResult - μια σειρά αντικειμένων. Ας περάσουμε από τα στοιχεία του πίνακα και ας εμφανίσουμε τα αποτελέσματα στην οθόνη
για ($i=0; $i {
ηχώ "
";
$eTariff = iconv("utf-8","cp1251",$mResult[$i]->eTariff->fullName);
var_dump($eTariff);
$cPrice = $mResult[$i]->cPrice;
var_dump($cPrice);
$cComment = $mResult[$i]->cComment;
var_dump($cComment);
ηχώ "
";
}
?>

//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////

Τώρα Ας περιπλέκουμε ακόμη περισσότερο το έργο. Ας μεταφέρουμε τον ίδιο τύπο δεδομένων αντικειμένου από τον πελάτη στην υπηρεσία WEB (ως παράμετρος). Ας είναι tzKind.
Για να γίνει αυτό, περιγράφουμε πρώτα αυτόν τον τύπο στο πακέτο dataTariffs και, στη συνέχεια, προσθέτουμε τη λειτουργία GetTzTariffs_1.

Ας υποδείξουμε τον τύπο της παραμέτρου tzKind.

Ένα παράδειγμα του πώς λειτουργεί μια υπηρεσία WEB με μια εισερχόμενη παράμετρο XDTO:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Συνάρτηση GetTZTariffs_1(tzKind)
tzTariffsType = FactoryXDTO.Type(" ", "tzTariffs");
tzTariffs = FactoryXDTO.Create(tzTariffsType);
elementTZType = FactoryXDTO.Type(" ", "elementTZ");
tariffType = FactoryXDTO.Type(" ", "tariff");
kindOfTariffType = FactoryXDTO.Type(" ", "kindOfTariff");
// Συμπλήρωση των τεχνικών προδιαγραφών
// 1η γραμμή
kindOfTariff = FactoryXDTO.Create(kindOfTariffType);
kindOfTariff.name = "Μεταφορά";
kindOfTariff.active = ψευδής;
tariff = FactoryXDTO.Create(tariffType);
tariff.fullName = "Tariff 1";
tariff.begdate = CurrentDate();
tariff.kind = kindOfTariff;
elementTZ = FactoryXDTO.Create(elementTZType);
elementTZ.eTariff = τιμολόγιο;
elementTZ.cΤιμή = 100;
elementTZ.comment = "Περιγραφή του τιμολογίου 1";
// Προσθέστε την 1η σειρά στον πίνακα
tzTariffs.el.Add(elementTZ);
// 2η γραμμή
kindOfTariff = FactoryXDTO.Create(kindOfTariffType);
kindOfTariff.name = "Παράδοση";
kindOfTariff.active = true;
tariff = FactoryXDTO.Create(tariffType);
tariff.fullName = "Tariff 2";
tariff.begdate = CurrentDate();
tariff.kind = kindOfTariff;
elementTZ = FactoryXDTO.Create(elementTZType);
elementTZ.eTariff = τιμολόγιο;
elementTZ.cΤιμή = 200;
elementTZ.comment = "Περιγραφή του τιμολογίου 2";
// Προσθέστε μια 3η σειρά στον πίνακα (συμπληρώστε τον με τα εισερχόμενα δεδομένα)
tzTariffs.el.Add(elementTZ);
// 3η γραμμή
kindOfTariff = FactoryXDTO.Create(kindOfTariffType);
kindOfTariff.name = tzKind.el.eKind.name;
kindOfTariff.active = tzKind.el.eKind.active;
tariff = FactoryXDTO.Create(tariffType);
tariff.fullName = "Tariff 3";
tariff.begdate = CurrentDate();
tariff.kind = kindOfTariff;
elementTZ = FactoryXDTO.Create(elementTZType);
elementTZ.eTariff = τιμολόγιο;
elementTZ.cΤιμή = 300;
elementTZ.comment = "Περιγραφή του τιμολογίου 3";
// Προσθέστε μια 3η σειρά στον πίνακα
tzTariffs.el.Add(elementTZ);
Επιστροφή tzTariffs;
EndFunction

//////////////////////////////////////////////////////////////////////////////////
Από την πλευρά του πελάτη 1C, θα χρειαστεί να προετοιμάσουμε δεδομένα του τύπου tzKind και να τα μεταφέρουμε στην υπηρεσία WEB.

Ακολουθεί ένα παράδειγμα τέτοιας κλήσης:
/////////////////////////////////////////////////////////////////////////////////

&OnClient
Διαδικασία Εκτέλεση ερωτήματος 30 (εντολή)
// Εισαγάγετε τα περιεχόμενα του προγράμματος χειρισμού.
Warning(SERVER_ExecuteWSQuery30());
Τέλος Διαδικασίας
&OnServerWithout Context
Συνάρτηση SERVER_ExecuteWSRequest30()
Ορισμοί = νέοι ορισμοί WSD("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl");
Proxy = new WSPProxy(Definitions,"www.URI.com","_Calculations By Tariffs","_Calculations By TariffsSoap");
// Δημιουργήστε έναν πίνακα παραμέτρων που μεταβιβάστηκαν στο WS
tzKindType = Proxy.FactoryXDTO.Type(" ", "tzKind");
tzKind = Proxy.FactoryXDTO.Create(tzKindType);
kindOfTariffType = Proxy.FactoryXDTO.Type(" ", "kindOfTariff");
kindOfTariff = Proxy.XDTO Factory.Create(kindOfTariffType);
kindOfTariff.name = "Δοκιμαστικός τύπος χρέωσης";
kindOfTariff.active = ψευδής;
elementKindType = Proxy.FactoryXDTO.Type(" ", "elementKind");
elementKind = Proxy.XDTO Factory.Create(elementKindType);
elementKind.eKind = kindOfTariff;
elementKind.qty = 10;
// Προσθέστε μια σειρά στον πίνακα
tzKind.el.Add(elementKind);
XDTOResult = Proxy.GetTzTzriffs_1(tzKind);
ExampleResult_Name of Tariff Type = XDTOResult.el.eTariff.kind.name;
Παράδειγμα επιστροφήςResult_Name of Tariff Type;
EndFunction

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Θα ήθελα να επιστήσω την προσοχή σας στο σχέδιο: Proxy.FactoryXDTO.Type("...

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

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Τώρα ήρθε η ώρα να κάνουμε την ερώτηση:υπάρχει εναλλακτική λύση στα αντικείμενα XDTO ?

Είναι δυνατόν να μην "επικοινωνήσετε" καθόλου με το εργοστάσιο XDTO, να μεταδώσετε/λάβετε από μια υπηρεσία WEB με κάποιο άλλο τρόπο.. (ειδικά εάν ο πελάτης δεν είναι 1C, αλλά για παράδειγμα μια σελίδα WEB, μια εφαρμογή σε Android, iOS , και τα λοιπά.).

Η απάντηση είναι- ναι μπορείς!
Για παράδειγμα, μπορείτε να χρησιμοποιήσετε συμβολοσειρά ως τύπους παραμέτρων. Και «συσκευάστε» (σειριοποιήστε) δομές δεδομένων σε αυτό.

Αυτή η τεχνολογία στον προγραμματισμό WEB έχει αναπτυχθεί εδώ και καιρό και ονομάζεται JSON.
Είναι επίσης μεγάλη βοήθεια το γεγονός ότι στην PHP, η συσκευασία/εξαγωγή οποιασδήποτε δομής/συμβολοσειράς πίνακα εκτελείται σε μία ενέργεια!
Ένα παράδειγμα στην PHP συσκευασίας αντικειμένων σε JSON/εξαγωγή, μετάδοση/λήψη σε υπηρεσία WEB:

///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////

// σειριοποιήστε τον πίνακα mDelivery σε μια συμβολοσειρά και τοποθετήστε τον στην παράμετρο παράδοσης
// * Αρχικά, ας περιγράψουμε τη δομή παράδοσης
παράδοση τάξης (
var $id;
var $ελεγμένο;
var $value;
}
// Συμπληρώστε τη δομή με κάποια δεδομένα
$sDelivery = νέα παράδοση;
$sDelivery->id = "000000005";
$sDelivery->checked = TRUE;
$sDelivery->value = 0;
// Προσθέστε το στον πίνακα των αντικειμένων mDelivery
$mDelivery = $sDelivery;
// Μετατρέψτε τον πίνακα mDelivery σε συμβολοσειρά JSON και τοποθετήστε το αποτέλεσμα στην παράμετρο παράδοσης
$params["delivery"] = json_encode($mDelivery);
// Καλέστε τη λειτουργία ExitCalcOrder στην υπηρεσία WEB και περάστε μια παράμετρο σε αυτήν (συμβολοσειρά - παράδοση).
$result = $client->ExitCalcOrder($params);
// Λάβετε το αποτέλεσμα της λειτουργίας ExitCalcOrder στη μεταβλητή jsCalcResult (συμβολοσειρά)
$jsCalcResult = $result->return;
// Εκτελέστε τον αντίστροφο μετασχηματισμό: από τη συμβολοσειρά jsCalcResult σε ένα αντικείμενο (πίνακας αντικειμένων, τύπος αντιστοίχισης) arrCalcResult
$arrCalcResult = json_decode($jsCalcResult);
// Εμφάνιση πληροφοριών στην οθόνη σχετικά με το αντικείμενο arrCalcResult
var_dump($arrCalcResult);

////////////////////////////////////////////////////////////////////////////////

Αλλά πώς να εκτελέσετε μετατροπές JSON σε 1C;
Η πλατφόρμα 1C 8 δεν υποστηρίζει το πρότυπο JSON, αλλά αυτό δεν είναι πρόβλημα.
Η επεξεργασία μετατροπής/εξαγωγής JSON υπάρχει, είναι διαθέσιμη και λειτουργεί εξαιρετικά από
// Πνευματικά δικαιώματα © 2010-2012 Alexander Pereverzev
// 1C:JSON . Αναλυτής και σειριοποιητής σημειογραφίας αντικειμένου JavaScript.

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

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

CargoData = νέα δομή.
CargoData.Insert("code",CargoCode);
CargoData.Insert("number",CargoNumber);
CargoData.Insert("plan", QuantityPlan);
CargoData.Insert("character",CargoCharacter);
CargoData.Insert("packing", Packaging);
CargoData.Insert("damage",Damage to Packaging);
CargoData.Insert("volume",Volume);
CargoData.Insert("weight",Weight);
CargoData.Insert("status",Status);
jsResult = JSON.WriteJSON(LoadData); //Μετατρέψτε το αποτέλεσμα σε JSON
επιστροφή jsResult;

Εξαγωγή παραδείγματος αντικείμενο σε 1C από συμβολοσειρά JSON:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 1. Επαναφορά αντικειμένων από JSON
JSON = Process.JSON.Create();
mdelivery = JSON.ReadJSON(delivery);
// ως αποτέλεσμα, το mdelivery είναι ένας πίνακας. Στοιχείο πίνακα - αντιστοίχιση.
// Δηλαδή, για παράδειγμα, mdelivery. ["id"] θα περιέχει "000000005"

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

Ας προσέξουμε τις μεταμορφώσεις iconv("cp1251","utf-8","
και iconv("utf-8","cp1251", που θα απαιτηθεί (κατά την αλληλεπίδραση με PHP - 1 C) για τη μετατροπή κυριλλικών συμβολοσειρών από κωδικοποίηση cp 1251 σε utf -8 και αντίστροφα.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

error_reporting(E_ERROR); // Απενεργοποίηση μηνυμάτων
// Απενεργοποίηση προσωρινής αποθήκευσης για SOAP. Εάν αυτό δεν γίνει,
// Οι συναρτήσεις της υπηρεσίας web δεν θα λειτουργήσουν σωστά.
ini_set("soap.wsdl_cache_enabled", "0");
$client = new SoapClient("http://localhost/wsBase10/ws/wsQuery.1cws?wsdl");
$params["fname"] = iconv("cp1251","utf-8","dataFreight");
$params["param1"] = iconv("cp1251","utf-8",$_GET["code"]);
$params["param2"] = iconv("cp1251","utf-8",$_GET["αριθμός"]);
$result = $client->executeQuery($params);
$jsResult = $result->return;
$dataFreight = json_decode($jsResult);
$statusFreight = $dataFreight->codeNm;
$numberFreight = iconv("utf-8","cp1251",$dataFreight->nameRus);
?>

///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////

Το πιθανό σενάριο είναι: ένας απομακρυσμένος χρήστης από κάποια από τα προγράμματά του (π.χ. από ιστότοπο WEB, εφαρμογή για κινητά κ.λπ.) καλεί την υπηρεσία WEB σας και... δεν λαμβάνει αποτελέσματα.. Ή το λαμβάνει, αλλά κάτι δεν πάει καλά.

Ερώτηση: - Πώς να μάθετε για τέτοια σφάλματα και να διορθώσετε σφάλματα στην υπηρεσία WEB;
Συνιστώ να χρησιμοποιείτε ένα αρχείο καταγραφής για την παρακολούθηση σφαλμάτων (και να συλλέγετε τις εισερχόμενες παραμέτρους "τι οδήγησε την υπηρεσία web σε σφάλμα").

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

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

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

Ας συνοψίσουμε: Εξετάζονται παραδείγματα εργασίας με υπηρεσίες WEB από 1C και PHP. Για να μεταφέρουμε δομές δεδομένων αντικειμένων μεταξύ του πελάτη και του διακομιστή, χρησιμοποιήσαμε δύο τεχνολογίες:

  • (1) Πακέτα XDTO
  • (2) Αντικείμενα JSON.

4. Εναλλακτική - Υπηρεσίες Web REST (http αιτήματα). Παραδείγματα υλοποίησης σε 1C και PHP.
Στην προηγούμενη ενότητα, εξετάσαμε αναλυτικά την τεχνολογία των υπηρεσιών WEB. Σε αυτή την ενότητα θα εξετάσουμε μια εναλλακτική τεχνολογία, τη λεγόμενη. Υπηρεσίες Ιστού REST.

Τίθεται ένα δίκαιο ερώτημα: - Γιατί;

Οι υπηρεσίες WEB είναι πλήρως λειτουργικές και σας επιτρέπουν να επιλύετε προβλήματα οποιασδήποτε πολυπλοκότητας.

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

Η τεχνολογία των υπηρεσιών WEB βασίζεται σε 2 σημεία:

  • (1) Χρησιμοποιείται σύνδεση SOAP. Γίνεται δηλαδή αίτημα SOAP.
Στο σαπούνι "1C" η σύνδεση διαμορφώνεται ως εξής:
/////////////////////////////////////////////////////////////////////////////////////////

Definitions = new WSD Definitions("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl",UserName,Password);
Proxy = new WSPProxy(Definitions,"www.URI.com","_Calculations By Tariffs","_Calculations By TariffsSoap");

/////////////////////////////////////////////////////////////////////////////////////////

Στην PHP είναι κάπως έτσι:

/////////////////////////////////////////////////////////////////////////////////////////

$client = new SoapClient("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ",
πίνακας(
"login" => login, //login,
"password" => pass, //password
"ίχνος" => αληθές,
"features" => SOAP_USE_XSI_ARRAY_TYPE,
//"συμπίεση" => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP | 5
);

/////////////////////////////////////////////////////////////////////////////////////////

  • (2) Για την επεξεργασία μιας σύνδεσης σαπουνιού σε λειτουργία διακομιστή, η πλατφόρμα 1C 8 παρέχει ειδικές υπηρεσίες WEB αντικειμένου μεταδεδομένων.

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

- Πότε είναι δυνατή μια εναλλακτική;

  • Πρώτον, όταν το 1C ενεργεί μόνο ως πελάτης.
  • Δεύτερον, όταν ο διακομιστής με τον οποίο πρέπει να εργαστείτε (για παράδειγμα, ένας ιστότοπος ή κάποιο είδος εφαρμογής WEB), δεν σχεδιάζεται να υποστηρίζει μια σύνδεση SOAP.
- Ποια εναλλακτική λύση για μια σύνδεση SOAP είναι δυνατή;

Μια πολύ δημοφιλής επιλογή - http σύνδεση.

Σε συστήματα που βασίζονται στο web (PHP, Android, iOS) είναι ευκολότερο να εργάζεστε με αιτήματα http παρά με αιτήματα SOAP. Και για όχι πολύ περίπλοκα έργα, η τεχνολογία αιτήματος http είναι αρκετά κατάλληλη.

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

Είναι χαρακτηριστικό ότι σε τυπικές διαμορφώσεις 1C, η ενοποίηση με τοποθεσίες υλοποιείται χρησιμοποιώντας αιτήματα http.
Ας δούμε λοιπόν την τεχνολογία http αιτήματαΓια παράδειγμα αλληλεπίδραση μεταξύ 1C (πελάτης, 1C 8) και τοποθεσίας WEB (PHP, διακομιστής).

1. Δημιουργία σύνδεσης και μεθόδων για τη μετάδοση παραμέτρων σε ένα αίτημα http

Ένα παράδειγμα δημιουργίας σύνδεσης με τον διακομιστή από την πλευρά 1C:
/////////////////////////////////////////////////////////////////////////////

προστατευμένο = ψευδές;
HTTPConnect = νέο HTTPConnect("localhost/wsClient10/json/testHTTPQuery11.php", Προστατευμένο);

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

(1) Μέθοδος "get"?

Οι παράμετροι (όπως όνομα και κωδικός πρόσβασης) καθορίζονται απευθείας στη διεύθυνση URL κλήσης διακομιστή.

Δηλαδή, μια διαδραστική κλήση στο σενάριο (απευθείας από ένα πρόγραμμα περιήγησης WEB) θα μοιάζει με αυτό:

Στο 1C:8, για προγραμματική κλήση του διακομιστή (και μεταφορά παραμέτρων των μεθόδων Get σε αυτόν), παρέχεται η μέθοδος "Get".

Παράδειγμα:
προστατευμένο = ψευδές;
HTTPConnect = νέο HTTPConnect("localhost", Secure);
HTTPConnect.Get("wsClient10/json/testHTTPQuery11.php?nameVasya&password=123",OutputFileName);

όπου OutputFileName: Το όνομα του αρχείου στο οποίο τοποθετούνται τα δεδομένα που επιστρέφονται από τον διακομιστή.
Δηλαδή, ως αποτέλεσμα της επεξεργασίας του αιτήματος, ο διακομιστής επιστρέφει το αποτέλεσμα στο 1C και στη συνέχεια (αυτόματα) δημιουργείται ένα αρχείο που περιέχει το αποτέλεσμα.

Κατά συνέπεια, μετά από αυτό, στο "1C" είναι απαραίτητο (προγραμματικά) να διαβάσετε αυτό το αρχείο και να εξαγάγετε το αποτέλεσμα που προέκυψε από αυτό. Αυτό είναι όλο.

(2) "μετά" μέθοδος?

Σε αυτήν την επιλογή, οι παράμετροι δεν τοποθετούνται στη διεύθυνση URL, αλλά μεταδίδονται ξεχωριστά, στο σώμα της σύνδεσης http.

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

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

Για τη λήψη/μετάδοση δεδομένων μεταξύ 1C και τοποθεσίας WEB, θα χρησιμοποιήσουμε αρχεία κειμένου.
Και θα "συσκευάσουμε/εξάγουμε" δεδομένα από αρχεία χρησιμοποιώντας την τεχνολογία JSON που είναι ήδη γνωστή σε εμάς! Αυτό πρακτικά θα μας γλιτώσει από την ανάγκη «ανάλυσης» του αρχείου στην πλευρά 1C και στην πλευρά της PHP.

Για να καλέσετε τον διακομιστή και να μεταφέρετε παραμέτρους σε αυτόν χρησιμοποιώντας τη μέθοδο "post", το 1C:8 παρέχει τη μέθοδο: SendForProcessing

Και έτσι, ας δώσουμε ένα παράδειγμα στο οποίο στο πλάι 1Cεκτελούνται όλα τα στάδια επεξεργασίας http αίτημα:

Αρχικά, ας γράψουμε το σχέδιο δράσης (μεγεθυμένο):

Και τώρα, η εφαρμογή λογισμικού του σε 1C:8

////////////////////

// 1. Συμπληρώστε τη δομή των μεταδιδόμενων δεδομένων
postDataToPHP = νέα δομή.
postDataToPHP.Insert("param1","ivanon");
postDataToPHP.Insert("param2","ivan");
postDataToPHP.Insert("param3","ivanovich");

// 2. Μετατρέψτε τα δεδομένα σε συμβολοσειρά JSON
JSON = Process.JSON.Create();
jsPostDataToPHP = JSON.WriteJSON(postDataToPHP);


// 3. Δημιουργήστε ένα προσωρινό εξερχόμενο μήνυμα (που μεταδίδεται στον διακομιστή χρησιμοποιώντας τη μέθοδο POST)
// αρχείο, τοποθετήστε μια συμβολοσειρά JSON σε αυτό.
tFile = νέο TextDocument;
stringData = jsPostDataToPHP;
tFile.AddLine(stringData);


// 4. Λάβετε το όνομα για το προσωρινό εξερχόμενο αρχείο. Θα περιέχει τα εξερχόμενα δεδομένα με τη μορφή συμβολοσειράς JSON
OutgoingFileName = GetTemporaryFileName(.txt");

tFile.Write(OutgoingFileName,TextEncoding.UTF);

// 5. Λάβετε το όνομα για το προσωρινό αρχείο εισόδου. Θα λάβει μια συμβολοσειρά JSON: απόκριση διακομιστή PHP
InputFileName = GetTemporaryFileName(.txt");


// 6. Δημιουργήστε μια σύνδεση HTTP με το διακομιστή
προστατευμένο = ψευδές;
HTTPConnect = νέο HTTPConnect("localhost/wsClient10/json/testHTTPQuery10.php", Προστατευμένο);


// 7. Ας εκτελέσουμε ένα αίτημα HTTP. Ας μεταφέρουμε το εξερχόμενο αρχείο στον διακομιστή (το αρχείο περιέχει ένα αντικείμενο JSON, δηλ. εξερχόμενες παραμέτρους)


HTTPConnect.SendForProcessing(OutgoingFileName,"/json/",IncomingFileName);


// Και θα λάβουμε απάντηση από τον διακομιστή (εισερχόμενο αρχείο). Το αρχείο περιέχει ένα αντικείμενο //JSON (δηλαδή δεδομένα που επιστρέφονται από τον διακομιστή)

// 8. Εξαγωγή των δεδομένων που λαμβάνονται από το διακομιστή από το εισερχόμενο αρχείο
ResponseFile = νέο TextDocument.
ResponseFile.Read(InputFileName,TextEncoding.UTF);
json_Data = ResponseFile.GetString(1);
mData = JSON.ReadJSON(json_Data);


// 9. Εμφάνιση των δεδομένων που λαμβάνονται για το χρήστη
Αναφορά(mData["v1"]);
Αναφορά(mData["v2"]);


// 10. Διαγράψτε τα χρησιμοποιημένα (δεν χρειάζονται πλέον) προσωρινά αρχεία.
DeleteFiles(OutgoingFileName);
DeleteFiles(InputFileName);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Και τελικά, παράδειγμα στην PHP για την επεξεργασία ενός αιτήματος από την πλευρά του διακομιστή:

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 1. Λάβετε δεδομένα συμβολοσειράς από το εισερχόμενο αρχείο
$json_filedata = file_get_contents("php://input");
// 2. Κόψτε όλα τα περιττά (προστίθενται 2 χαρακτήρες υπηρεσίας), τα οποία // παρεμποδίζουν τη μετατροπή από JSON
$jsData = trim(ltrim($json_filedata));
$dlinaStr = strlen($jsData);
$_jsData = "";
$i=1;
ενώ ($i<$dlinaStr) {
αν ($i>2) (
$_jsData = $_jsData.substr($jsData, $i, 1);
}
$i++;
}
// 3. Μετατροπή δεδομένων από JSON σε αντικείμενο (δομή)
$mData = json_decode($_jsData);
// 4. Ας δημιουργήσουμε μια άλλη δομή, την οποία θα συμπληρώσουμε με δεδομένα και // θα επιστρέψουμε στο 1C
τα δεδομένα επιστροφής κλάσης(
var $v1;
var $v2;
}
$sReturnData = νέα δεδομένα επιστροφής;
$sReturnData->v1 = $mData->param1;
$sReturnData->v2 = $mData->param2;
// 5. Μετατρέψτε τα δεδομένα δομής σε συμβολοσειρά JSON
$json_returnData = json_encode($sReturnData);
// 6. Επιστρέψτε τα δεδομένα στο 1C (τα δεδομένα εξόδου θα ανακατευθυνθούν σε ένα αρχείο, το οποίο θα επιστραφεί σε 1C)
echo $json_returnData;
?>

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Αυτό είναι όλο.Συμπαγές και λειτουργικό!

5. Καθήκοντα σε ζήτηση (υποθέσεις έργου)

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

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

Εισαγωγή

Πρέπει να ξεκινήσουμε με το γιατί δημιουργήθηκε η έννοια των διαδικτυακών υπηρεσιών. Μέχρι τη στιγμή που εμφανίστηκε αυτή η ιδέα στον κόσμο, υπήρχαν ήδη τεχνολογίες που επέτρεπαν στις εφαρμογές να αλληλεπιδρούν εξ αποστάσεως, όπου ένα πρόγραμμα μπορούσε να καλέσει κάποια μέθοδο σε άλλο πρόγραμμα, το οποίο θα μπορούσε να ξεκινήσει σε έναν υπολογιστή που βρίσκεται σε άλλη πόλη ή ακόμη και χώρα. Όλα αυτά συντομεύονται ως RPC (Remote Procedure Calling). Παραδείγματα περιλαμβάνουν τεχνολογίες CORBA και για Java - RMI (Remote Method Invoking). Και όλα δείχνουν να είναι καλά σε αυτούς, ειδικά στην CORBA, γιατί... Μπορείτε να εργαστείτε με αυτό σε οποιαδήποτε γλώσσα προγραμματισμού, αλλά κάτι έλειπε ακόμα. Πιστεύω ότι το μειονέκτημα του CORBA είναι ότι λειτουργεί μέσω ορισμένων δικών του πρωτοκόλλων δικτύου αντί για απλό HTTP, το οποίο θα χωράει σε οποιοδήποτε τείχος προστασίας. Η ιδέα της υπηρεσίας Ιστού ήταν να δημιουργήσει ένα RPC που θα εισαγόταν σε πακέτα HTTP. Έτσι ξεκίνησε η ανάπτυξη του προτύπου. Ποιες είναι οι βασικές έννοιες αυτού του προτύπου:
  1. ΣΑΠΟΥΝΙ. Πριν καλέσετε μια απομακρυσμένη διαδικασία, πρέπει να περιγράψετε αυτήν την κλήση σε ένα αρχείο XML σε μορφή SOAP. Το SOAP είναι απλώς μια από τις πολλές σημάνσεις XML που χρησιμοποιούνται σε υπηρεσίες web. Όλα όσα θέλουμε να στείλουμε κάπου μέσω HTTP μετατρέπονται πρώτα σε περιγραφή XML SOAP, στη συνέχεια γεμίζονται σε ένα πακέτο HTTP και αποστέλλονται σε άλλον υπολογιστή στο δίκτυο μέσω TCP/IP.
  2. WSDL. Υπάρχει μια διαδικτυακή υπηρεσία, δηλ. ένα πρόγραμμα του οποίου οι μέθοδοι μπορούν να καλούνται εξ αποστάσεως. Αλλά το πρότυπο απαιτεί αυτό το πρόγραμμα να συνοδεύεται από μια περιγραφή που λέει ότι "ναι, έχετε δίκιο - αυτή είναι πραγματικά μια υπηρεσία web και μπορείτε να καλέσετε τέτοιες και τέτοιες μεθόδους από αυτήν." Αυτή η περιγραφή αντιπροσωπεύεται από ένα άλλο αρχείο XML, το οποίο έχει διαφορετική μορφή, δηλαδή το WSDL. Εκείνοι. Το WSDL είναι απλώς ένα αρχείο XML που περιγράφει μια υπηρεσία Ιστού και τίποτα περισσότερο.
Γιατί τόσο συνοπτικά ρωτάς; Δεν μπορείς να γίνεις πιο συγκεκριμένος; Είναι πιθανώς δυνατό, αλλά για να το κάνετε αυτό θα πρέπει να απευθυνθείτε σε βιβλία όπως το T. Mashnin, "Java Web Services". Εκεί, στις πρώτες 200 σελίδες, υπάρχει μια λεπτομερής περιγραφή κάθε ετικέτας των προτύπων SOAP και WSDL. Αξίζει να το κάνετε; Κατά τη γνώμη μου, όχι γιατί... Όλα αυτά δημιουργούνται αυτόματα στην Java και χρειάζεται μόνο να γράψετε τα περιεχόμενα των μεθόδων που υποτίθεται ότι καλούνται εξ αποστάσεως. Έτσι, ένα API όπως το JAX-RPC εμφανίστηκε στην Java. Αν κάποιος δεν ξέρει, όταν λέει ότι η Java έχει ένα τέτοιο API, σημαίνει ότι υπάρχει ένα πακέτο με ένα σύνολο κλάσεων που ενσωματώνουν την εν λόγω τεχνολογία. Το JAX-RPC εξελίχθηκε με την πάροδο του χρόνου από έκδοση σε έκδοση και τελικά έγινε JAX-WS. Το WS προφανώς σημαίνει WebService και ίσως πιστεύετε ότι πρόκειται απλώς για μια μετονομασία του RPC ως δημοφιλούς λέξης στις μέρες μας. Αυτό δεν είναι αλήθεια, γιατί Τώρα οι υπηρεσίες web έχουν απομακρυνθεί από την αρχική ιδέα και σας επιτρέπουν όχι μόνο να καλείτε απομακρυσμένες μεθόδους, αλλά και να στέλνετε απλά μηνύματα εγγράφων σε μορφή SOAP. Δεν ξέρω γιατί αυτό χρειάζεται ακόμα· είναι απίθανο η απάντηση εδώ να είναι «σε περίπτωση που χρειαστεί». Ο ίδιος θα ήθελα να μάθω από πιο έμπειρους συντρόφους. Και τέλος, εμφανίστηκε το JAX-RS για τις λεγόμενες υπηρεσίες RESTful web, αλλά αυτό είναι το θέμα ενός ξεχωριστού άρθρου. Η εισαγωγή μπορεί να τελειώσει εδώ, γιατί... Στη συνέχεια θα μάθουμε να δουλεύουμε με το JAX-WS.

Γενική προσέγγιση

Στις υπηρεσίες web υπάρχει πάντα ένας πελάτης και ένας διακομιστής. Ο διακομιστής είναι η υπηρεσία ιστού μας και μερικές φορές ονομάζεται τελικό σημείο (όπως στο τελικό σημείο όπου φτάνουν τα μηνύματα SOAP από τον πελάτη). Πρέπει να κάνουμε τα εξής:
  1. Περιγράψτε τη διεπαφή της υπηρεσίας Ιστού μας
  2. Εφαρμογή αυτής της διεπαφής
  3. Εκκινήστε την υπηρεσία ιστού μας
  4. Γράψτε έναν πελάτη και καλέστε εξ αποστάσεως την επιθυμητή μέθοδο υπηρεσίας web
Μπορείτε να εκκινήσετε μια υπηρεσία Ιστού με διαφορετικούς τρόπους: είτε να περιγράψετε μια κλάση με την κύρια μέθοδο και να εκκινήσετε την υπηρεσία Ιστού απευθείας ως διακομιστής, είτε να την αναπτύξετε σε έναν διακομιστή όπως ο Tomcat ή οποιοσδήποτε άλλος. Στη δεύτερη περίπτωση, εμείς οι ίδιοι δεν εκκινούμε έναν νέο διακομιστή και δεν ανοίγουμε άλλη θύρα στον υπολογιστή, αλλά απλώς πείτε στο κοντέινερ servlet Tomcat ότι «έχουμε γράψει μαθήματα διαδικτυακής υπηρεσίας εδώ, παρακαλούμε δημοσιεύστε τα ώστε όλοι όσοι επικοινωνούν μαζί σας να μπορούν χρησιμοποιήστε τη χρήση της υπηρεσίας web." Ανεξάρτητα από τη μέθοδο εκκίνησης της υπηρεσίας web, θα έχουμε τον ίδιο πελάτη.

Υπηρέτης

Ας ξεκινήσουμε το IDEA και ας δημιουργήσουμε ένα νέο έργο Δημιουργία νέου έργου. Ας υποδείξουμε το όνομα HelloWebServiceκαι πατήστε το κουμπί Επόμενο, μετά κουμπί Φινίρισμα. Σε φάκελο srcας δημιουργήσουμε ένα πακέτο ru.javarush.ws. Σε αυτό το πακέτο θα δημιουργήσουμε τη διεπαφή HelloWebService: πακέτο ru. javarush. ws; // αυτοί είναι σχολιασμοί, δηλ. ένας τρόπος να επισημάνουμε τις τάξεις και τις μεθόδους μας, // σε σχέση με την τεχνολογία υπηρεσιών webεισαγωγή javax. jws. WebMethod; εισαγωγή javax. jws. WebService; εισαγωγή javax. jws. σαπούνι. SOAPBinding; // λέμε ότι η διεπαφή μας θα λειτουργεί ως υπηρεσία web@WebService // λέμε ότι η υπηρεσία Ιστού θα χρησιμοποιηθεί για την κλήση μεθόδων@SOAPBinding (στυλ = SOAPBinding. Στυλ. RPC) δημόσια διεπαφή HelloWebService ( // λέμε ότι αυτή η μέθοδος μπορεί να κληθεί εξ αποστάσεως@WebMethod δημόσια συμβολοσειρά getHelloString(Όνομα συμβολοσειράς) ; ) Σε αυτόν τον κώδικα, οι κλάσεις WebService και WebMethod είναι οι λεγόμενοι σχολιασμοί και δεν κάνουν τίποτα εκτός από την επισήμανση της διεπαφής μας και της μεθόδου της ως υπηρεσίας web. Το ίδιο ισχύει και για την κατηγορία SOAPBinding. Η μόνη διαφορά είναι ότι το SOAPBinding είναι ένας σχολιασμός με παραμέτρους. Σε αυτήν την περίπτωση, η παράμετρος στυλ χρησιμοποιείται με μια τιμή που υποδεικνύει ότι η υπηρεσία web δεν θα λειτουργεί μέσω μηνυμάτων εγγράφων, αλλά ως κλασικό RPC, π.χ. για να καλέσετε μια μέθοδο. Ας εφαρμόσουμε τη λογική διεπαφής μας και ας δημιουργήσουμε μια κλάση HelloWebServiceImpl στο πακέτο μας. Παρεμπιπτόντως, σημειώνω ότι ο τερματισμός μιας κλάσης με Impl είναι μια σύμβαση στην Java, σύμφωνα με την οποία η υλοποίηση των διεπαφών ορίζεται έτσι (Impl - από τη λέξη υλοποίηση, δηλ. υλοποίηση). Αυτό δεν είναι απαίτηση και είστε ελεύθεροι να ονομάσετε την τάξη όπως θέλετε, αλλά οι καλοί τρόποι το απαιτούν: πακέτο ru. javarush. ws; // ο ίδιος σχολιασμός όπως όταν περιγράφεται η διεπαφή,εισαγωγή javax. jws. WebService; // αλλά εδώ χρησιμοποιείται με την παράμετρο endpointInterface, // υποδεικνύοντας το πλήρες όνομα της κλάσης διεπαφής της υπηρεσίας ιστού μας@WebService(endpointInterface= "ru.javarush.ws.HelloWebService") δημόσια κλάση HelloWebServiceImpl υλοποιεί το HelloWebService ( @Override public String getHelloString (Όνομα συμβολοσειράς) ( // απλώς επιστρέψτε τον χαιρετισμόεπιστροφή "Γεια, " + όνομα + "!" ; ) ) Ας ξεκινήσουμε την υπηρεσία ιστού μας ως ανεξάρτητος διακομιστής, π.χ. χωρίς τη συμμετοχή οποιουδήποτε διακομιστή Tomcat και εφαρμογών (αυτό είναι ένα θέμα για ξεχωριστή συζήτηση). Για να το κάνετε αυτό, στη δομή του έργου στο φάκελο srcΑς δημιουργήσουμε ένα πακέτο ru.javarush.endpoint και σε αυτό θα δημιουργήσουμε μια κλάση HelloWebServicePublisher με την κύρια μέθοδο: πακέτο ru. javarush. τελικό σημείο? // κλάση για τη λειτουργία ενός διακομιστή web με υπηρεσίες webεισαγωγή javax. xml. ws. Τελικό σημείο; // κατηγορία της διαδικτυακής μας υπηρεσίαςεισαγωγή ru. javarush. ws. HelloWebServiceImpl; δημόσια κλάση HelloWebServicePublisher ( δημόσιο static void main (String... args) ( // εκκίνηση του διακομιστή web στη θύρα 1986 // και στη διεύθυνση που καθορίζεται στο πρώτο όρισμα, // εκκίνηση της υπηρεσίας Ιστού που μεταβιβάστηκε στο δεύτερο όρισμαΤελικό σημείο. δημοσιεύω( "http://localhost:1986/wss/hello", νέο HelloWebServiceImpl () ); ) ) Τώρα ας εκτελέσουμε αυτήν την κλάση κάνοντας κλικ Shift+F10. Δεν θα εμφανιστεί τίποτα στην κονσόλα, αλλά ο διακομιστής εκτελείται. Μπορείτε να το επαληθεύσετε πληκτρολογώντας τη γραμμή http://localhost:1986/wss/hello?wsdl στο πρόγραμμα περιήγησής σας. Η σελίδα που ανοίγει, αφενός, αποδεικνύει ότι έχουμε έναν διακομιστή web (http://) που εκτελείται στη θύρα 1986 στον υπολογιστή μας (localhost) και, αφετέρου, δείχνει μια περιγραφή WSDL της υπηρεσίας web μας. Εάν διακόψετε την εφαρμογή, η περιγραφή δεν θα είναι διαθέσιμη, όπως και η ίδια η υπηρεσία web, επομένως δεν θα το κάνουμε αυτό, αλλά θα προχωρήσουμε στη σύνταξη του πελάτη.

Πελάτης

Στο φάκελο του έργου srcΑς δημιουργήσουμε ένα πακέτο ru.javarush.client , και σε αυτό την κλάση HelloWebServiceClient με την κύρια μέθοδο: πακέτο ru. javarush. πελάτης; // απαιτείται για να λάβετε την περιγραφή wsdl και μέσω αυτής // πρόσβαση στην ίδια την υπηρεσία webεισαγωγή java. καθαρά. URL? // Αυτή η εξαίρεση θα προκύψει κατά την εργασία με ένα αντικείμενο URLεισαγωγή java. καθαρά. MalformedURLException; // κλάσεις για ανάλυση xml με περιγραφή wsdl // και μεταβείτε στην ετικέτα υπηρεσίας σε αυτήνεισαγωγή javax. xml. χώρο ονομάτων. QName; εισαγωγή javax. xml. ws. Υπηρεσία; // διεπαφή της υπηρεσίας ιστού μας (χρειαζόμαστε περισσότερα)εισαγωγή ru. javarush. ws. HelloWebService; δημόσια κλάση HelloWebServiceClient ( δημόσιο στατικό κενό main (String args) ρίχνει MalformedURLException ( // δημιουργήστε έναν σύνδεσμο προς την περιγραφή wsdl URL URL = νέα διεύθυνση URL ( "http://localhost:1986/wss/hello?wsdl") ; // Εξετάζουμε τις παραμέτρους του επόμενου κατασκευαστή στην πρώτη ετικέτα της περιγραφής WSDL - ορισμοί // κοιτάξτε το 1ο όρισμα στο χαρακτηριστικό targetNamespace // κοιτάξτε το 2ο όρισμα στο χαρακτηριστικό name QName qname = νέο QName ("http://ws.javarush.ru/" , "HelloWebServiceImplService" ); // Τώρα μπορούμε να φτάσουμε στην ετικέτα υπηρεσίας στην περιγραφή wsdl, Service service = Service. δημιουργία (url, qname) ; // και στη συνέχεια μέχρι την ετικέτα θύρας που είναι ένθετη σε αυτήν, έτσι ώστε // λάβετε έναν σύνδεσμο προς ένα αντικείμενο υπηρεσίας ιστού που είναι απομακρυσμένο από εμάς HelloWebService γεια = υπηρεσία. getPort(HelloWebService.class); // Ωραία! Τώρα μπορείτε να καλέσετε την απομακρυσμένη μέθοδοΣύστημα. έξω. println (γεια. getHelloString ("JavaRush") ); ) ) Έδωσα τα μέγιστα σχόλια για τον κωδικό στην καταχώριση. Δεν έχω τίποτα να προσθέσω, οπότε ας τρέξουμε (Shift+F10). Θα πρέπει να δούμε το κείμενο στην κονσόλα: Γεια σου, JavaRush! Εάν δεν το είδατε, τότε μάλλον ξεχάσατε να ξεκινήσετε την υπηρεσία Ιστού.

συμπέρασμα

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

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

Εισαγωγή

Πρέπει να ξεκινήσουμε με το γιατί δημιουργήθηκε η έννοια των διαδικτυακών υπηρεσιών. Μέχρι τη στιγμή που εμφανίστηκε αυτή η ιδέα στον κόσμο, υπήρχαν ήδη τεχνολογίες που επέτρεπαν στις εφαρμογές να αλληλεπιδρούν εξ αποστάσεως, όπου ένα πρόγραμμα μπορούσε να καλέσει κάποια μέθοδο σε άλλο πρόγραμμα, το οποίο θα μπορούσε να ξεκινήσει σε έναν υπολογιστή που βρίσκεται σε άλλη πόλη ή ακόμη και χώρα. Όλα αυτά συντομεύονται ως RPC (Remote Procedure Calling). Παραδείγματα περιλαμβάνουν τεχνολογίες CORBA και για Java - RMI (Remote Method Invoking). Και όλα δείχνουν να είναι καλά σε αυτούς, ειδικά στην CORBA, γιατί... Μπορείτε να εργαστείτε με αυτό σε οποιαδήποτε γλώσσα προγραμματισμού, αλλά κάτι έλειπε ακόμα. Πιστεύω ότι το μειονέκτημα του CORBA είναι ότι λειτουργεί μέσω ορισμένων δικών του πρωτοκόλλων δικτύου αντί για απλό HTTP, το οποίο θα χωράει σε οποιοδήποτε τείχος προστασίας. Η ιδέα της υπηρεσίας Ιστού ήταν να δημιουργήσει ένα RPC που θα εισαγόταν σε πακέτα HTTP. Έτσι ξεκίνησε η ανάπτυξη του προτύπου. Ποιες είναι οι βασικές έννοιες αυτού του προτύπου:
  1. ΣΑΠΟΥΝΙ. Πριν καλέσετε μια απομακρυσμένη διαδικασία, πρέπει να περιγράψετε αυτήν την κλήση σε ένα αρχείο XML σε μορφή SOAP. Το SOAP είναι απλώς μια από τις πολλές σημάνσεις XML που χρησιμοποιούνται σε υπηρεσίες web. Όλα όσα θέλουμε να στείλουμε κάπου μέσω HTTP μετατρέπονται πρώτα σε περιγραφή XML SOAP, στη συνέχεια γεμίζονται σε ένα πακέτο HTTP και αποστέλλονται σε άλλον υπολογιστή στο δίκτυο μέσω TCP/IP.
  2. WSDL. Υπάρχει μια διαδικτυακή υπηρεσία, δηλ. ένα πρόγραμμα του οποίου οι μέθοδοι μπορούν να καλούνται εξ αποστάσεως. Αλλά το πρότυπο απαιτεί αυτό το πρόγραμμα να συνοδεύεται από μια περιγραφή που λέει ότι "ναι, έχετε δίκιο - αυτή είναι πραγματικά μια υπηρεσία web και μπορείτε να καλέσετε τέτοιες και τέτοιες μεθόδους από αυτήν." Αυτή η περιγραφή αντιπροσωπεύεται από ένα άλλο αρχείο XML, το οποίο έχει διαφορετική μορφή, δηλαδή το WSDL. Εκείνοι. Το WSDL είναι απλώς ένα αρχείο XML που περιγράφει μια υπηρεσία Ιστού και τίποτα περισσότερο.
Γιατί τόσο συνοπτικά ρωτάς; Δεν μπορείς να γίνεις πιο συγκεκριμένος; Είναι πιθανώς δυνατό, αλλά για να το κάνετε αυτό θα πρέπει να απευθυνθείτε σε βιβλία όπως το T. Mashnin, "Java Web Services". Εκεί, στις πρώτες 200 σελίδες, υπάρχει μια λεπτομερής περιγραφή κάθε ετικέτας των προτύπων SOAP και WSDL. Αξίζει να το κάνετε; Κατά τη γνώμη μου, όχι γιατί... Όλα αυτά δημιουργούνται αυτόματα στην Java και χρειάζεται μόνο να γράψετε τα περιεχόμενα των μεθόδων που υποτίθεται ότι καλούνται εξ αποστάσεως. Έτσι, ένα API όπως το JAX-RPC εμφανίστηκε στην Java. Αν κάποιος δεν ξέρει, όταν λέει ότι η Java έχει ένα τέτοιο API, σημαίνει ότι υπάρχει ένα πακέτο με ένα σύνολο κλάσεων που ενσωματώνουν την εν λόγω τεχνολογία. Το JAX-RPC εξελίχθηκε με την πάροδο του χρόνου από έκδοση σε έκδοση και τελικά έγινε JAX-WS. Το WS προφανώς σημαίνει WebService και ίσως πιστεύετε ότι πρόκειται απλώς για μια μετονομασία του RPC ως δημοφιλούς λέξης στις μέρες μας. Αυτό δεν είναι αλήθεια, γιατί Τώρα οι υπηρεσίες web έχουν απομακρυνθεί από την αρχική ιδέα και σας επιτρέπουν όχι μόνο να καλείτε απομακρυσμένες μεθόδους, αλλά και να στέλνετε απλά μηνύματα εγγράφων σε μορφή SOAP. Δεν ξέρω γιατί αυτό χρειάζεται ακόμα· είναι απίθανο η απάντηση εδώ να είναι «σε περίπτωση που χρειαστεί». Ο ίδιος θα ήθελα να μάθω από πιο έμπειρους συντρόφους. Και τέλος, εμφανίστηκε το JAX-RS για τις λεγόμενες υπηρεσίες RESTful web, αλλά αυτό είναι το θέμα ενός ξεχωριστού άρθρου. Η εισαγωγή μπορεί να τελειώσει εδώ, γιατί... Στη συνέχεια θα μάθουμε να δουλεύουμε με το JAX-WS.

Γενική προσέγγιση

Στις υπηρεσίες web υπάρχει πάντα ένας πελάτης και ένας διακομιστής. Ο διακομιστής είναι η υπηρεσία ιστού μας και μερικές φορές ονομάζεται τελικό σημείο (όπως στο τελικό σημείο όπου φτάνουν τα μηνύματα SOAP από τον πελάτη). Πρέπει να κάνουμε τα εξής:
  1. Περιγράψτε τη διεπαφή της υπηρεσίας Ιστού μας
  2. Εφαρμογή αυτής της διεπαφής
  3. Εκκινήστε την υπηρεσία ιστού μας
  4. Γράψτε έναν πελάτη και καλέστε εξ αποστάσεως την επιθυμητή μέθοδο υπηρεσίας web
Μπορείτε να εκκινήσετε μια υπηρεσία Ιστού με διαφορετικούς τρόπους: είτε να περιγράψετε μια κλάση με την κύρια μέθοδο και να εκκινήσετε την υπηρεσία Ιστού απευθείας ως διακομιστής, είτε να την αναπτύξετε σε έναν διακομιστή όπως ο Tomcat ή οποιοσδήποτε άλλος. Στη δεύτερη περίπτωση, εμείς οι ίδιοι δεν εκκινούμε έναν νέο διακομιστή και δεν ανοίγουμε άλλη θύρα στον υπολογιστή, αλλά απλώς πείτε στο κοντέινερ servlet Tomcat ότι «έχουμε γράψει μαθήματα διαδικτυακής υπηρεσίας εδώ, παρακαλούμε δημοσιεύστε τα ώστε όλοι όσοι επικοινωνούν μαζί σας να μπορούν χρησιμοποιήστε τη χρήση της υπηρεσίας web." Ανεξάρτητα από τη μέθοδο εκκίνησης της υπηρεσίας web, θα έχουμε τον ίδιο πελάτη.

Υπηρέτης

Ας ξεκινήσουμε το IDEA και ας δημιουργήσουμε ένα νέο έργο Δημιουργία νέου έργου. Ας υποδείξουμε το όνομα HelloWebServiceκαι πατήστε το κουμπί Επόμενο, μετά κουμπί Φινίρισμα. Σε φάκελο srcας δημιουργήσουμε ένα πακέτο ru.javarush.ws. Σε αυτό το πακέτο θα δημιουργήσουμε τη διεπαφή HelloWebService: πακέτο ru. javarush. ws; // αυτοί είναι σχολιασμοί, δηλ. ένας τρόπος να επισημάνουμε τις τάξεις και τις μεθόδους μας, // σε σχέση με την τεχνολογία υπηρεσιών webεισαγωγή javax. jws. WebMethod; εισαγωγή javax. jws. WebService; εισαγωγή javax. jws. σαπούνι. SOAPBinding; // λέμε ότι η διεπαφή μας θα λειτουργεί ως υπηρεσία web@WebService // λέμε ότι η υπηρεσία Ιστού θα χρησιμοποιηθεί για την κλήση μεθόδων@SOAPBinding (στυλ = SOAPBinding. Στυλ. RPC) δημόσια διεπαφή HelloWebService ( // λέμε ότι αυτή η μέθοδος μπορεί να κληθεί εξ αποστάσεως@WebMethod δημόσια συμβολοσειρά getHelloString(Όνομα συμβολοσειράς) ; ) Σε αυτόν τον κώδικα, οι κλάσεις WebService και WebMethod είναι οι λεγόμενοι σχολιασμοί και δεν κάνουν τίποτα εκτός από την επισήμανση της διεπαφής μας και της μεθόδου της ως υπηρεσίας web. Το ίδιο ισχύει και για την κατηγορία SOAPBinding. Η μόνη διαφορά είναι ότι το SOAPBinding είναι ένας σχολιασμός με παραμέτρους. Σε αυτήν την περίπτωση, η παράμετρος στυλ χρησιμοποιείται με μια τιμή που υποδεικνύει ότι η υπηρεσία web δεν θα λειτουργεί μέσω μηνυμάτων εγγράφων, αλλά ως κλασικό RPC, π.χ. για να καλέσετε μια μέθοδο. Ας εφαρμόσουμε τη λογική διεπαφής μας και ας δημιουργήσουμε μια κλάση HelloWebServiceImpl στο πακέτο μας. Παρεμπιπτόντως, σημειώνω ότι ο τερματισμός μιας κλάσης με Impl είναι μια σύμβαση στην Java, σύμφωνα με την οποία η υλοποίηση των διεπαφών ορίζεται έτσι (Impl - από τη λέξη υλοποίηση, δηλ. υλοποίηση). Αυτό δεν είναι απαίτηση και είστε ελεύθεροι να ονομάσετε την τάξη όπως θέλετε, αλλά οι καλοί τρόποι το απαιτούν: πακέτο ru. javarush. ws; // ο ίδιος σχολιασμός όπως όταν περιγράφεται η διεπαφή,εισαγωγή javax. jws. WebService; // αλλά εδώ χρησιμοποιείται με την παράμετρο endpointInterface, // υποδεικνύοντας το πλήρες όνομα της κλάσης διεπαφής της υπηρεσίας ιστού μας@WebService(endpointInterface= "ru.javarush.ws.HelloWebService") δημόσια κλάση HelloWebServiceImpl υλοποιεί το HelloWebService ( @Override public String getHelloString (Όνομα συμβολοσειράς) ( // απλώς επιστρέψτε τον χαιρετισμόεπιστροφή "Γεια, " + όνομα + "!" ; ) ) Ας ξεκινήσουμε την υπηρεσία ιστού μας ως ανεξάρτητος διακομιστής, π.χ. χωρίς τη συμμετοχή οποιουδήποτε διακομιστή Tomcat και εφαρμογών (αυτό είναι ένα θέμα για ξεχωριστή συζήτηση). Για να το κάνετε αυτό, στη δομή του έργου στο φάκελο srcΑς δημιουργήσουμε ένα πακέτο ru.javarush.endpoint και σε αυτό θα δημιουργήσουμε μια κλάση HelloWebServicePublisher με την κύρια μέθοδο: πακέτο ru. javarush. τελικό σημείο? // κλάση για τη λειτουργία ενός διακομιστή web με υπηρεσίες webεισαγωγή javax. xml. ws. Τελικό σημείο; // κατηγορία της διαδικτυακής μας υπηρεσίαςεισαγωγή ru. javarush. ws. HelloWebServiceImpl; δημόσια κλάση HelloWebServicePublisher ( δημόσιο static void main (String... args) ( // εκκίνηση του διακομιστή web στη θύρα 1986 // και στη διεύθυνση που καθορίζεται στο πρώτο όρισμα, // εκκίνηση της υπηρεσίας Ιστού που μεταβιβάστηκε στο δεύτερο όρισμαΤελικό σημείο. δημοσιεύω( "http://localhost:1986/wss/hello", νέο HelloWebServiceImpl () ); ) ) Τώρα ας εκτελέσουμε αυτήν την κλάση κάνοντας κλικ Shift+F10. Δεν θα εμφανιστεί τίποτα στην κονσόλα, αλλά ο διακομιστής εκτελείται. Μπορείτε να το επαληθεύσετε πληκτρολογώντας τη γραμμή http://localhost:1986/wss/hello?wsdl στο πρόγραμμα περιήγησής σας. Η σελίδα που ανοίγει, αφενός, αποδεικνύει ότι έχουμε έναν διακομιστή web (http://) που εκτελείται στη θύρα 1986 στον υπολογιστή μας (localhost) και, αφετέρου, δείχνει μια περιγραφή WSDL της υπηρεσίας web μας. Εάν διακόψετε την εφαρμογή, η περιγραφή δεν θα είναι διαθέσιμη, όπως και η ίδια η υπηρεσία web, επομένως δεν θα το κάνουμε αυτό, αλλά θα προχωρήσουμε στη σύνταξη του πελάτη.

Πελάτης

Στο φάκελο του έργου srcΑς δημιουργήσουμε ένα πακέτο ru.javarush.client , και σε αυτό την κλάση HelloWebServiceClient με την κύρια μέθοδο: πακέτο ru. javarush. πελάτης; // απαιτείται για να λάβετε την περιγραφή wsdl και μέσω αυτής // πρόσβαση στην ίδια την υπηρεσία webεισαγωγή java. καθαρά. URL? // Αυτή η εξαίρεση θα προκύψει κατά την εργασία με ένα αντικείμενο URLεισαγωγή java. καθαρά. MalformedURLException; // κλάσεις για ανάλυση xml με περιγραφή wsdl // και μεταβείτε στην ετικέτα υπηρεσίας σε αυτήνεισαγωγή javax. xml. χώρο ονομάτων. QName; εισαγωγή javax. xml. ws. Υπηρεσία; // διεπαφή της υπηρεσίας ιστού μας (χρειαζόμαστε περισσότερα)εισαγωγή ru. javarush. ws. HelloWebService; δημόσια κλάση HelloWebServiceClient ( δημόσιο στατικό κενό main (String args) ρίχνει MalformedURLException ( // δημιουργήστε έναν σύνδεσμο προς την περιγραφή wsdl URL URL = νέα διεύθυνση URL ( "http://localhost:1986/wss/hello?wsdl") ; // Εξετάζουμε τις παραμέτρους του επόμενου κατασκευαστή στην πρώτη ετικέτα της περιγραφής WSDL - ορισμοί // κοιτάξτε το 1ο όρισμα στο χαρακτηριστικό targetNamespace // κοιτάξτε το 2ο όρισμα στο χαρακτηριστικό name QName qname = νέο QName ("http://ws.site/" , "HelloWebServiceImplService" ) ; // Τώρα μπορούμε να φτάσουμε στην ετικέτα υπηρεσίας στην περιγραφή wsdl, Service service = Service. δημιουργία (url, qname) ; // και στη συνέχεια μέχρι την ετικέτα θύρας που είναι ένθετη σε αυτήν, έτσι ώστε // λάβετε έναν σύνδεσμο προς ένα αντικείμενο υπηρεσίας ιστού που είναι απομακρυσμένο από εμάς HelloWebService γεια = υπηρεσία. getPort(HelloWebService.class); // Ωραία! Τώρα μπορείτε να καλέσετε την απομακρυσμένη μέθοδοΣύστημα. έξω. println (γεια. getHelloString ("JavaRush") ); ) ) Έδωσα τα μέγιστα σχόλια για τον κωδικό στην καταχώριση. Δεν έχω τίποτα να προσθέσω, οπότε ας τρέξουμε (Shift+F10). Θα πρέπει να δούμε το κείμενο στην κονσόλα: Γεια σου, JavaRush! Εάν δεν το είδατε, τότε μάλλον ξεχάσατε να ξεκινήσετε την υπηρεσία Ιστού.

συμπέρασμα

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

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

Δημιουργία υπηρεσίας web 1C

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

Πώς να δημιουργήσετε μια υπηρεσία Ιστού στο 1C;

Προκειμένου μια συγκεκριμένη λειτουργία του συστήματος 1C να γίνει διαθέσιμη σε εξωτερικό λογισμικό, είναι απαραίτητο να εκτελέσετε τον ακόλουθο αλγόριθμο ενεργειών:

  1. Μεταβείτε στη διαμόρφωση και προσθέστε ένα αντικείμενο υπηρεσίας WEB σε έναν συγκεκριμένο κλάδο του δέντρου.
  2. Περιγράψτε όλες τις λειτουργίες που μπορεί να εκτελέσει η λειτουργικότητά μας. Η περιγραφή των λειτουργιών πραγματοποιείται στη μονάδα στην ενσωματωμένη γλώσσα 1C.
  3. Προσθέστε μια περιγραφή των παραμέτρων των λειτουργιών της υπηρεσίας web. Λάβετε υπόψη ότι οι τύποι δεδομένων περιγράφονται λαμβάνοντας υπόψη τους υπάρχοντες τύπους του μηχανισμού XDTO που εισήχθη στην έκδοση 8.1 της πλατφόρμας.
  4. Δημοσιεύστε τη δημιουργημένη υπηρεσία WEB στον διακομιστή. Ο μηχανισμός που είναι ενσωματωμένος στην πλατφόρμα 1C υποστηρίζει τα ακόλουθα πρότυπα:
  • SSL/TLS
  • WS-I BP

Ένα παράδειγμα δημιουργίας μιας απλής υπηρεσίας WEB

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

Ανοίξτε το πρόγραμμα διαμόρφωσης, βρείτε τον κλάδο «Υπηρεσίες WEB» στο δέντρο και προσθέστε μια νέα υπηρεσία «wa_LengthString». Πρέπει επίσης να προσθέσετε μια νέα λειτουργία στην καρτέλα "Λειτουργίες". Ας το ονομάσουμε "CalcLengthString", καθορίστε τον τύπο τιμής επιστροφής στις ιδιότητες - int ή ακέραιος και δημιουργήστε την παράμετρο "InputString" μέσα σε αυτό. Αφήνουμε τον τύπο τιμής ως συμβολοσειρά.

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


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

Για να μπορέσουμε να δημοσιεύσουμε τη δημιουργημένη διαδικτυακή υπηρεσία με τη λειτουργικότητά της, πρέπει να έχουμε πρόσβαση στον ιστότοπο. Πριν ξεκινήσουμε τη δημοσίευση της υπηρεσίας, πρέπει να ελέγξουμε το όνομα του αρχείου στις ιδιότητες της δημιουργημένης λειτουργικής μονάδας wa_LengthString. Θα πρέπει να είναι σαφές, απλό και να έχει την επέκταση «1cws».


Τώρα ήρθε η ώρα να δημοσιεύσουμε την υπηρεσία WEB που δημιουργήσαμε στον διακομιστή. Αυτή η δυνατότητα εμφανίστηκε στην έκδοση 8.3 της πλατφόρμας και πολλές εταιρείες έχουν ήδη συνειδητοποιήσει τα πλήρη οφέλη αυτής της λειτουργικότητας. Για να ξεκινήσετε τη δημοσίευση, πρέπει να ανοίξετε τη φόρμα «Διαχείριση/Δημοσίευση σε διακομιστή web...» στο πρόγραμμα διαμόρφωσης.


Στο παράθυρο που ανοίγει, πρέπει να διαμορφώσουμε τις υπηρεσίες Web 1C και να συμπληρώσουμε ορισμένα πεδία:

  • Ονομα. Καθορίζει το φάκελο στον διακομιστή web στον οποίο θα αποθηκευτεί η περιγραφή της υπηρεσίας web μας. Να είστε προσεκτικοί με τις περιπτώσεις, καθώς μερικές φορές οι διακομιστές κάνουν διάκριση μεταξύ μεγάλων και μικρών χαρακτήρων πεζών-κεφαλαίων.
  • Διακομιστής Ιστού. Πρέπει να επιλέξετε έναν διακομιστή από αυτούς που είναι εγκατεστημένοι στον υπολογιστή σας.
  • Κατάλογος. Πρέπει να επιλέξετε τη διαδρομή προς το φάκελο όπου είναι αποθηκευμένα τα δεδομένα διακομιστή web για τη ρύθμιση της σύνδεσης. Χρησιμοποιούνται μόνο λατινικά γράμματα.
  • Δύο ζώδια τύπου Boolean. Το πρώτο θα μας είναι χρήσιμο εάν χρειαστεί να διαμορφώσουμε την πρόσβαση στη διαμόρφωση μέσω ενός προγράμματος-πελάτη web. Για να δημοσιεύσετε μια υπηρεσία 1C, πρέπει να επιλέξετε το δεύτερο πλαίσιο.

Το μόνο που μένει είναι να ελέγξετε ότι η επιθυμητή υπηρεσία WEB έχει επιλεγμένο το πλαίσιο ελέγχου στην πρώτη στήλη και κάντε κλικ στο «Δημοσίευση».


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

<имяСервера>.ru/<ИмяУказанногоКаталогаНаСервере>/ws/<НаименованиеФайла>.1cws?wsdl

Σε απόκριση σε ένα τέτοιο αίτημα διεύθυνσης, το πρόγραμμα περιήγησης πρέπει να εμφανίζει τη δομή του αρχείου XML. Εάν δείτε μια κενή σελίδα, ένα σφάλμα ή περίεργους χαρακτήρες (προβλήματα κωδικοποίησης), τότε πρέπει να ελέγξετε ξανά όλα τα βήματα. Είναι επίσης καλή ιδέα να βεβαιωθείτε ότι ο διακομιστής έχει ρυθμιστεί σωστά και ότι έχετε πρόσβαση σε αυτόν. Μετά την επιτυχή δημοσίευση, η υπηρεσία 1C WEB θα μπορεί να χρησιμοποιηθεί από εφαρμογές τρίτων.


Λέξεις-κλειδιά: web service, web service, SOAP, WSDL, ws link

Αποποίηση ευθύνης και όροι χρήσης

Όλα τα εμπορικά σήματα που αναφέρονται κατά λάθος σε αυτό το άρθρο ανήκουν στους αντίστοιχους κατόχους τους.
Αυτό το άρθρο δημοσιεύεται με άδεια Creative Commons Attribution-Share Alike 3.0 Unported License. http://creativecommons.org/licenses/by-sa/3.0/

Άλλη μια αποποίηση ευθυνών (μετά από πολλές φορές)

Η πλατφόρμα 1C:Enterprise 8 εξελίσσεται συνεχώς. Επομένως, ο κώδικας που παρουσιάζεται σε αυτό το άρθρο θα δημιουργήσει ένα σφάλμα στις πιο πρόσφατες εκδόσεις της πλατφόρμας. Αυτό συμβαίνει, ειδικότερα, λόγω του γεγονότος ότι έχει αλλάξει η σειρά των μεθόδων κλήσης ενός αντικειμένου διακομιστή μεσολάβησης υπηρεσίας web: για παράδειγμα, τα σύνθετα αντικείμενα πρέπει να μετατραπούν ρητά σε ένα αντικείμενο XDTO του κατάλληλου τύπου, χρησιμοποιώντας το Factory της αντίστοιχης υπηρεσίας . Μπορείτε να διαβάσετε σχετικά στο φόρουμ μας ή στο βιβλίο "1C: Enterprise Integration Technologies" http://v8.1c.ru/metod/books/book.jsp?id=288

Εισαγωγή

Όταν εμφανίζεται μια νέα έκδοση ενός προϊόντος λογισμικού, φυσικά, πρώτα απ 'όλα, θέλετε να κατανοήσετε τι νέο υπάρχει σε αυτό. Στην περίπτωση του 1C:Enterprise 8.1, οι υπηρεσίες web έγιναν ένα τόσο νέο "χαρακτηριστικό" για μένα. Πολλά έχουν γραφτεί και ειπωθεί για τις υπηρεσίες Ιστού, αφού αυτή η τεχνολογία υπάρχει εδώ και πολύ καιρό σύμφωνα με τα πρότυπα των υπολογιστών. Επομένως, δεν θα επαναλάβω τον εαυτό μου· παραπέμπω όλους στο Yandex για πληροφορίες. Θα πω μόνο ότι με την κυκλοφορία της νέας έκδοσης της πλατφόρμας 1C:Enterprise 8.1, η 1Snikov έχει την ευκαιρία να δημιουργήσει και να χρησιμοποιήσει την τεχνολογία υπηρεσιών web, όντας, ας πούμε, στο εγγενές περιβάλλον της. Σε αυτό το άρθρο θέλω να δείξω πώς να χρησιμοποιείτε εξωτερικές υπηρεσίες web στις εξελίξεις σας.

Για όσους είναι εντελώς «εκτός λειτουργίας»: σχετικά με τις υπηρεσίες ιστού «στα χέρια σας»

ΕΝΤΑΞΕΙ, ειδικά για σέναΘα προσπαθήσω να σας πω λίγα λόγια για το τι είναι μια διαδικτυακή υπηρεσία και γιατί ακριβώς ΑυτόΜου φάνηκε μια τόσο «νόστιμη» καινοτομία της πλατφόρμας. Ίσως γνωρίζετε για την τεχνολογία COM ή έχετε ακούσει κάτι για το OLE; Αργά ή γρήγορα, οποιοσδήποτε μεμονωμένος εργαζόμενος θα συναντήσει αυτήν την τεχνολογία (ειδικά αν πρέπει να μεταφέρετε γρήγορα κάποιον κατάλογο "Εργαζόμενοι" και το τμήμα HR, προβλέποντας την ανάγκη να οδηγήσει και τους 1.500 υπαλλήλους ξανά, είναι έτοιμο να σας κρεμάσει από την πρώτη κατάλληλο νύχι που έρχεται).
Ναι, έτσι, στην καρδιά της τεχνολογίας COM βρίσκεται η ιδέα του δυνατότητεςκλήση κώδικα προγράμματος (και πρόσβαση σε δεδομένα) μιας εφαρμογής από άλλη εφαρμογή. Εξάλλου, δυνατότητεςνα το κάνετε αυτό όχι στο επίπεδο των επιμέρους διαδικασιών και λειτουργιών, αλλά με το να είστε στη διάθεση αντικείμεναάλλη εφαρμογή. Όταν χρησιμοποιούμε το OLE, δημιουργούμε ένα αντικείμενο στην εφαρμογή μας που είναι " εκπρόσωπος"ή, αν προτιμάτε," περικάλυμμα"κάποιου αντικειμένου της εφαρμογής με το οποίο θέλουμε να αλληλεπιδράσουμε (το λεγόμενο "αντικείμενο OLE" ή "αντικείμενο COM"). Μέσω αυτού του αντικειμένου "περιτύλιγμα" γίνονται διαθέσιμες σε εμάς οι ιδιότητες και οι μέθοδοι του αντικειμένου μιας άλλης εφαρμογής , και μόνο εκείνα των οποίων ο προγραμματιστής Να πάωΟι εφαρμογές μας επέτρεψαν να τις χρησιμοποιήσουμε δημοσιεύοντας τις στην περιγραφή διεπαφή. (Λοιπόν, δεν ήθελα να μπω στα αγριόχορτα, αλλά δεν υπάρχει άλλος τρόπος...)
Τώρα ας το φανταστούμε ακριβώς το ίδιοη εφαρμογή βρίσκεται σε άλλον υπολογιστή και ούτε καν στο τοπικό δίκτυο (το DCOM, το CORBA και άλλες δυσνόητες συντομογραφίες χειρίζονται καλά τέτοιες περιπτώσεις), αλλά κάπου μακριά, πολύ μακριά στο Διαδίκτυο. Εδώ έρχονται στο προσκήνιο οι υπηρεσίες ιστού (συμπληρώνονται επίσης με δυσνόητα ακρωνύμια: SOAP, WSDL, κ.λπ.), που σας επιτρέπουν να εκτελέσετε ένα παρόμοιο «κόλπο» σε αυτήν την περίπτωση: π.χ. λήψη δεδομένων και χειρισμός αντικειμένων από μια εφαρμογή που εκτελείται σε υπολογιστή στην άλλη πλευρά του Διαδικτύου.
Κάτω από " εξωτερικός"Με τον όρο διαδικτυακή υπηρεσία εννοώ μια υπηρεσία ιστού που παρέχεται σε ορισμένους προμηθευτήςυπηρεσία (δηλαδή όχι η εφαρμογή μας.) Κατά συνέπεια, από "εσωτερική" - την υπηρεσία web που θα παρέχουμε από, ή, ακριβέστερα, με βάσητην αίτησή μας. Όταν χρησιμοποιούμε εξωτερικές υπηρεσίες ιστού, πρέπει να καταλάβουμε ότι, παρόλο που το αντικείμενο «περιτύλιγμα» δημιουργείται στην «τοπική» μας εφαρμογή, ο «κώδικας εκτέλεσης» αυτού του αντικειμένου βρίσκεται, ίσως, στην άλλη πλευρά του Υδρόγειου. Ταυτόχρονα, η ανταλλαγή μεταξύ μαςΚαι τουςλαμβάνει χώρα στην πανταχού παρούσα XML, με τα γνωστά «πλεονεκτήματα» (ευελιξία και δομή) και «μειονεκτήματα» (bloat), και το παλιό καλό http χρησιμοποιείται ως «γραμμή μετάδοσης».
Ναι, και μην ξεχνάτε την κίνηση στο Διαδίκτυο! Επιπλέον, στην περίπτωση εξωτερικών υπηρεσιών web, το μεγαλύτερο μέρος τους θα είναι ενεργοποιημένο εισερχόμενοςσυστατικό.
Όλα τα άλλα είναι στο Yandex. Ας προχωρήσουμε...

Από πού είναι τα πόδια, δηλ. τα φτερά μεγαλώνουν

Έχοντας ψάξει στο Yandex, βρήκα μια υπέροχη υπηρεσία web από την εταιρεία Aeroflot, η οποία σας επιτρέπει να λαμβάνετε πληροφορίες σχετικά με την άφιξη και την αναχώρηση των αεροσκαφών σε πραγματικό χρόνο και αποφάσισα να δημιουργήσω ένα είδος "Airport Display" στο 1C:Enterprise. Η ίδια η υπηρεσία ζει εδώ: http://webservices.aeroflot.ru/desc_flightinfo.asp

Είπε: "Πάμε!"

Αρχικά, δημιούργησα μια κενή διαμόρφωση του "1C:Enterprise 8.1" (τη στιγμή που γράφω τη συγγραφή είχα στη διάθεσή μου την έκδοση πλατφόρμας 8.1.5.123). Στη συνέχεια πρόσθεσα ένα νέο αντικείμενο τύπου WS-link στη διαμόρφωσή μου. Όταν μου ζητήθηκε να εισαγάγω τη διεύθυνση URL του εισαγόμενου WSDL, εισήγαγα έναν σύνδεσμο προς το αρχείο WSDL, ο οποίος παρατίθεται στη σελίδα υπηρεσίας: http://webservices.aeroflot.aero/flightstatus.wsdl (Το αρχείο WSDL είναι μια περιγραφή του υπηρεσία web. Για λεπτομέρειες, μεταβείτε στο Yandex ) και ονόμασε με περηφάνια τη δημιουργηθείσα εγκατάσταση "Aeroflot". Κάνοντας διπλό κλικ σε αυτό το αντικείμενο, έλαβα ένα δέντρο με τη δομή της υπηρεσίας web.

Αυτό το δέντρο αντιπροσωπεύει ένα «πορτρέτο» της υπηρεσίας Ιστού, όπως το βλέπει η 1Ska. Το πιο ενδιαφέρον πράγμα είναι στον κλάδο "Υπηρεσίες Ιστού": αυτό ονόματαΚαι λιμάνιαυπηρεσίες web (στην πραγματικότητα, ένα αρχείο WSDL μπορεί να περιγράψει όχι μία, αλλά πολλές υπηρεσίες Ιστού, τότε κάθε υπηρεσία Ιστού θα έχει το δικό της υποκατάστημα) και παρατίθενται μεθόδουςυπηρεσία Ιστού. Αυτές είναι οι ίδιες οι «χορδές», τραβώντας τις οποίες μπορείτε να δώσετε στον εαυτό σας πρόσβαση στα δεδομένα που παρέχει η υπηρεσία web. Ο κλάδος "Μοντέλο δεδομένων" περιέχει μια περιγραφή των βιβλιοθηκών τύπων δεδομένων που χρησιμοποιούνται από την υπηρεσία Ιστού.
Μια σύντομη περίληψη του τρόπου χρήσης της υπηρεσίας Ιστού βρίσκεται συνήθως στο ίδιο σημείο με τη σύνδεση προς το αρχείο WSDL. Στην περίπτωση της Aeroflot, αυτή είναι η σελίδα http://webservices.aeroflot.aero/flightstatus.asmx

«Τώρα απογείωση, τώρα προσγείωση…»

Για να εργαστώ με την υπηρεσία Ιστού, πρόσθεσα την επεξεργασία "Προβολή αναχωρήσεων" στη διαμόρφωση και σε αυτήν - μία φόρμα, την οποία όρισα ως την κύρια. Στη φόρμα τοποθέτησα το πεδίο επιλογής "Επιλογή αεροδρομίου", το πεδίο εισαγωγής "Ημερομηνία πτήσης", τον πίνακα "Πίνακας πίνακα" με δύο σελίδες "Αφίξεις" και "Αναχωρήσεις", ενώ ξετσεκάρω τη σημαία "Διανομή σε σελίδες" στο ιδιότητες πίνακα και το πεδίο πίνακα "Πίνακας".
Η αλληλεπίδραση με μια υπηρεσία Ιστού πραγματοποιείται με την αρχή «αίτημα-απόκριση» και δημιουργείται ένα ειδικό ενδιάμεσο αντικείμενο για την υπηρεσία Ιστού. Επομένως, πρόσθεσα τα στοιχεία της φόρμας «ServiceAeroflot» προσαρμοσμένου τύπου.
Εάν διαβάσετε προσεκτικά την περιγραφή της υπηρεσίας, μπορείτε να δείτε ότι η υπηρεσία web παρέχει δεδομένα για αφίξεις και αναχωρήσεις μέσω κλήσεων στις μεθόδους Άφιξης και Αναχώρησης, αντίστοιχα. Σε αυτήν την περίπτωση, και οι δύο μέθοδοι λαμβάνουν ως παραμέτρους τον κωδικό του αεροδρομίου και την επιθυμητή ημερομηνία. Επιπλέον, η υπηρεσία web παρέχει τη δυνατότητα λήψης λίστας αεροδρομίων για τα οποία υπάρχουν διαθέσιμα δεδομένα στο σύστημα. Το ακόλουθο σενάριο αλληλεπίδρασης με μια υπηρεσία web είναι αρκετά προφανές:
1. Λάβετε μια λίστα με αεροδρόμια.
2. Επιλέξτε το επιθυμητό αεροδρόμιο και την ημερομηνία.
3. Λάβετε δεδομένα σχετικά με τις αφίξεις ή τις αναχωρήσεις.
Αλλά πριν αποκτήσετε πρόσβαση στην υπηρεσία web, πρέπει να αρχικοποιήσετε ένα ενδιάμεσο αντικείμενο (όπως το WSProxy), κάτι που έκανα στον χειριστή ανοίγματος φόρμας:
ServiceAeroflot=WSLinks.Aeroflot.CreateWSProxy(" http: //www.aeroflot.ru/", "FlightStatus", "FlightStatusSoap");
Η πρώτη παράμετρος είναι το URI του χώρου ονομάτων της υπηρεσίας Ιστού. Μπορείτε να το μάθετε ανοίγοντας τις ιδιότητες της υπηρεσίας web στο δέντρο συνδέσμων WS. Η δεύτερη και η τρίτη παράμετρος μεταδίδουν το όνομα και τη θύρα της υπηρεσίας web, αντίστοιχα.
(μην συγχέετε τις έννοιες «όνομα», «θύρα», «μεσολαβητής» κ.λπ. όπως εφαρμόζονται στις υπηρεσίες web με τις πιο γνωστές έννοιες του πρωτοκόλλου TCP/IP. Εάν υπάρχει αντιστοιχία μεταξύ τους, είναι μάλλον σημασιολογική Στη γενική περίπτωση, πρέπει να καταλάβετε ότι, για παράδειγμα, μια θύρα υπηρεσίας web και μια θύρα TCP είναι εντελώς διαφορετικά πράγματα).
Έτσι, αρχικοποίησα το αντικείμενο Aeroflot Service τύπου WSProxy, το οποίο είναι ουσιαστικά ένα «περιτύλιγμα» της υπηρεσίας web. Μέσω αυτού, μπορώ να έχω πρόσβαση σε μεθόδους υπηρεσιών web ως «εγγενείς» μεθόδους της πλατφόρμας.
Πρώτα απ 'όλα, έλαβα μια λίστα με αεροδρόμια και συμπλήρωσα τη λίστα του πεδίου επιλογής "Επιλογή αεροδρομίου":

SelectionList=FormElements.AirportSelection.SelectionList; SelectionList.Clear(); AirportList=Aeroflot Service.AirportList().GetList("list"); TotalAirports=ListAirports.Count(); Για ui=0 προς TotalAirports-1 Cycle Airport=ListAirports.Get(ες); SelectionList.Add(Airport.code, ""+Airport.city+" : "+Airport.name); EndCycle;
Εδώ χρειαζόμαστε ένα μικρό σχόλιο για την κατασκευή του Airport List = ServiceAeroflot.AirportList().GetList("list");
Το γεγονός είναι ότι οι τιμές που επιστρέφονται από μεθόδους υπηρεσιών web αντιπροσωπεύονται στην πλατφόρμα από αντικείμενα τύπου XDTO Object. Δεδομένου ότι το θέμα της τεχνολογίας XDTO είναι πέρα ​​από το πεδίο αυτού του άρθρου, θα το πω μόνο για μεταμορφώσειςαυτό το αντικείμενο σε μια λίστα (που είναι), κάλεσα τη μέθοδο GetList(). Ο υπόλοιπος κώδικας είναι αρκετά προφανής, συμπεριλαμβανομένων των ονομάτων των πεδίων της δομής του αεροδρομίου, τα οποία βρήκα στη σελίδα περιγραφής της υπηρεσίας web.
Τώρα μπορείτε να εκτελέσετε τη διαμόρφωση και να βεβαιωθείτε ότι η λίστα πεδίων επιλογής συμπληρώνεται με ονόματα αεροδρομίων:

"Ημέρα αναχώρησης, ημέρα άφιξης..."

Τώρα έχω σχεδόν τα πάντα έτοιμα για να λειτουργήσει ο πίνακας αποτελεσμάτων μου. Το μόνο που μένει είναι να το «βάψω και να το πετάξω» :) Αυτό θα κάνω:

Διαδικασία FillTableboard(Arrival=True) TableTableboard.Columns.Clear(); TableTableboard.Columns.Add("Flight Code", "Flight Code"); TableTableboard.Columns.Add(" Κωδικός αεροπορικής εταιρείας", "Αεροπορική εταιρεία"); TableTable.Columns.Add("FlightNumber", "Number"); TableTable.Columns.Add(" Διέλευση αεροδρομίου", "Διέλευση αεροδρομίου"); TableTable.Columns.Add("Airport", "Airport"+?(Arrivals,"departures,","Arivals")); TableTable.Columns.Add(" Χρονοδιάγραμμα", "Σε χρονοδιάγραμμα"); TableTableboard.Columns.Add(" Προγραμματισμένος χρόνος", "Προγραμματισμένο"); TableTableboard.Columns.Add(" TimeActual", "Πραγματικός"); TableTable.Columns.Add("Υπολογιζόμενος χρόνος", "Υπολογισμένος"); TableTable.Columns.Add("Ώρα προσγείωσης", ?(Άφιξη,Προσγείωση","Απογείωση")); Πίνακας πίνακα. Στήλες. Προσθήκη("Συνδυασμένη πτήση", "Συνδυασμένη πτήση"); Πίνακας.Στήλες.Προσθήκη("Κατάσταση", "Κατάσταση"); Αν δεν Άφιξη Τότε TableTable.Columns.Add("Εγγραφή", "Εγγραφή"); TableTable .Στήλες .Add("Land", "Landing"); EndIf; Form Elements. Scoreboard Table. Create Columns(); Form Elements. Πίνακας. Στήλες. Εκτιμώμενος χρόνος. Ορατότητα = False. EndIf. Εάν άφιξη, τότε δεδομένα = Υπηρεσία Aeroflot. Άφιξη (Επιλογή αεροδρομίου, ημερομηνία πτήσης). Λήψη λίστας ("λίστα"); Διαφορετικά δεδομένα = υπηρεσία Aeroflot. Αναχώρηση (Επιλογή αεροδρομίου, πτήση Ημερομηνία).Λήψη λίστας("λίστα"); EndIf; Σύνολο εγγραφών=Δεδομένα.Αριθμός( ); Για ii=0 για Εγγραφή Κύκλου TotalRecords-1=DATA.Get(s); NewRow=TableTable.Add(); NewRow. AirlineCode=Record.company; NewLine.FlightNumber = Entry.flight_no; NewLine.AirportTransit = Entry.airport_inter; NewLine.Airport = Entry.airport; NewLine.TimeSchedule=Record.sched; NewLine.TimePlanned=Record.plan; NewLine.TimeActual=Εγγραφή.γεγονός; NewLine.TimeCalculated=Record.calc; NewLine.LandingTime=Record.real; NewLine.UnionFlight=Record.union_flight_no; NewRow.Status=Record.status; If Not Arrival then NewLine.Registration=Record.is_check; NewLine.Landing = Entry.is_board; τέλος εαν; EndCycle; Τέλος Διαδικασίας

Για να ελέγξω πώς λειτουργούν όλα, πρόσθεσα ένα κουμπί "Ενημέρωση" με αντίστοιχη εικόνα στον πίνακα εντολών της φόρμας και στον χειριστή του έγραψα τα εξής:

Διαδικασία CommandPanel1 Update(Button) FillTableboard(FormElements.TableboardPanel.CurrentPage=FormElements.TableboardPanel.Pages.Arrivals); Τέλος Διαδικασίας
Αποθηκεύω, εκτελώ, επιλέγω, κάνω κλικ, λαμβάνω:

Επίλογος

Παραδόξως, μετά τη συγγραφή και δημοσίευση του άρθρου, αποδείχθηκε ότι το σεβαστό ZAV είχε ήδη δημοσιεύσει ένα παρόμοιο παράδειγμα στο IT-Land: http://itland.ru/biblio/detail.php?ID=1060
Για να αποφύγετε πιθανές κατηγορίες για λογοκλοπή, σας συνιστώ ανεπιφύλακτα να διαβάσετε και αυτό το άρθρο και να συγκρίνετε τις προσεγγίσεις των συγγραφέων.