Πλατφόρμα "1C: Enterprise" - τι υπάρχει κάτω από την κουκούλα;

Γεια σου Χαμπρ!
Σε αυτό το άρθρο θα ξεκινήσουμε την ιστορία για το πώς λειτουργεί στο εσωτερικό πλατφόρμα "1C:Enterprise 8" και ποιες τεχνολογίες χρησιμοποιούνται στην ανάπτυξή του.

Πλατφόρμα "1C: Enterprise" - τι υπάρχει κάτω από την κουκούλα;

Γιατί πιστεύουμε ότι αυτό είναι ενδιαφέρον; Πρώτον, επειδή η πλατφόρμα 1C:Enterprise 8 είναι μια μεγάλη (περισσότερες από 10 εκατομμύρια γραμμές κώδικα) εφαρμογή σε C++ (πελάτης, διακομιστής κ.λπ.), JavaScript (πελάτης Ιστού) και, πιο πρόσφατα, Και Java. Τα μεγάλα έργα μπορεί να είναι ενδιαφέροντα τουλάχιστον λόγω της κλίμακας τους, επειδή ζητήματα που είναι αόρατα σε μια μικρή βάση κώδικα προκύπτουν σε πλήρη ισχύ σε τέτοια έργα. Δεύτερον, το "1C:Enterprise" είναι ένα αναπαραγόμενο, "συσκευασμένο" προϊόν και υπάρχουν πολύ λίγα άρθρα σχετικά με τέτοιες εξελίξεις στο Habré. Είναι επίσης πάντα ενδιαφέρον να γνωρίζουμε πώς είναι η ζωή σε άλλες ομάδες και εταιρείες.

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

  • σύμπλεγμα διακομιστών
  • "thin" client με δυνατότητα σύνδεσης στον διακομιστή μέσω http και του δικού του δυαδικού πρωτοκόλλου
  • πελάτη για εργασία σε αρχιτεκτονική δύο επιπέδων με βάση δεδομένων που βρίσκεται σε σκληρό δίσκο ή φάκελο δικτύου
  • web client
  • εργαλεία διαχείρισης διακομιστή εφαρμογών
  • περιβάλλον ανάπτυξης (γνωστό ως Configurator)
  • περιβάλλον χρόνου εκτέλεσης για iOS, Android και Windows Phone (κινητή πλατφόρμα 1C)

Όλα αυτά τα μέρη, με εξαίρεση τον web-πελάτη, είναι γραμμένα σε C++. Επιπλέον, υπάρχει η πρόσφατα ανακοινωθεί Διαμορφωτής νέας γενιάς, γραμμένο σε Java.

Εγγενείς εφαρμογές

Το C++03 χρησιμοποιείται για την ανάπτυξη εγγενών εφαρμογών. Για Windows, το Microsoft Visual C++ 12 (προφίλ συμβατό με Windows XP) χρησιμοποιείται ως μεταγλωττιστής και για Linux και Android - gcc 4.8, για iOS - clang 5.0. Η τυπική βιβλιοθήκη που χρησιμοποιείται είναι η ίδια για όλα τα λειτουργικά συστήματα και τους μεταγλωττιστές - STLPort. Αυτή η λύση μειώνει την πιθανότητα σφαλμάτων που αφορούν την εφαρμογή STL. Αυτήν τη στιγμή σχεδιάζουμε τη μετάβαση στην υλοποίηση STL που διατίθεται με CLang, καθώς το STLPort έχει διακοπεί και δεν είναι συμβατό με τη λειτουργία ενεργοποιημένης C++11 του gcc.
Η βάση κώδικα του διακομιστή είναι 99% κοινή, του πελάτη - 95%. Επιπλέον, ακόμη και η φορητή πλατφόρμα χρησιμοποιεί τον ίδιο κώδικα C++ με τη «μεγάλη», αν και το ποσοστό ενοποίησης εκεί είναι κάπως χαμηλότερο.
Όπως οι περισσότεροι χρήστες C++, δεν ισχυριζόμαστε ότι χρησιμοποιούμε το 100% των δυνατοτήτων της γλώσσας και των βιβλιοθηκών της. Έτσι, πρακτικά δεν χρησιμοποιούμε το Boost και ένα από τα χαρακτηριστικά της γλώσσας είναι η μετάδοση δυναμικού τύπου. Ταυτόχρονα, χρησιμοποιούμε ενεργά:

  • STL (συγκεκριμένα συμβολοσειρές, κοντέινερ και αλγόριθμοι)
  • πολλαπλή κληρονομιά, συμπ. πολλαπλή κληρονομικότητα υλοποίησης
  • πρότυπα
  • εξαιρέσεις
  • έξυπνοι δείκτες (προσαρμοσμένη υλοποίηση)

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

Εξαρτήματα

Για να διασφαλιστεί η αρθρωτή λειτουργία, όλες οι λειτουργίες χωρίζονται σε στοιχεία, τα οποία είναι δυναμικές βιβλιοθήκες (*.dll για Windows, *.so για Linux). Υπάρχουν περισσότερα από εκατόν πενήντα συστατικά συνολικά· εδώ είναι περιγραφές μερικών από αυτά:

backend
Περιέχει τη μηχανή μεταδεδομένων πλατφόρμας

λογ
Αντικείμενα που χρησιμοποιούν οι προγραμματιστές εφαρμογών για τη δημιουργία λογιστικών εγγραφών (λογιστικά γραφήματα και λογιστικά μητρώα)

bsl
Ενσωματωμένη μηχανή εκτέλεσης γλώσσας

Nuke
Προσαρμοσμένη υλοποίηση του εκχωρητή μνήμης

dbeng8
Μηχανή βάσης δεδομένων αρχείων. Μια απλή μηχανή βάσης δεδομένων διακομιστή αρχείων βασισμένη στο ISAM, η οποία περιλαμβάνει επίσης έναν απλό επεξεργαστή SQL

wbase
Περιέχει τις βασικές κλάσεις και τις λειτουργίες για την υλοποίηση της διεπαφής χρήστη των Windows - κλάσεις παραθύρου, πρόσβαση GDI κ.λπ.

Η διαίρεση σε πολλαπλά συστατικά είναι χρήσιμη από πολλές απόψεις:

  • Ο διαχωρισμός προάγει τον καλύτερο σχεδιασμό, ιδιαίτερα την καλύτερη απομόνωση κώδικα
  • Από ένα σύνολο εξαρτημάτων μπορείτε να συναρμολογήσετε με ευελιξία διαφορετικές επιλογές παράδοσης:
    • Για παράδειγμα, μια εγκατάσταση thin client θα περιέχει wbase, αλλά δεν θα έχει backend
    • αλλά στον διακομιστή wbase, αντίθετα, δεν θα είναι
    • Και οι δύο επιλογές θα περιέχουν φυσικά nuke και bsl

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

SCOM

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

  • Παρέχει εργοστασιακές μεθόδους που σας επιτρέπουν να δημιουργήσετε μια κλάση από άλλο στοιχείο γνωρίζοντας μόνο το όνομά του (χωρίς να αποκαλύπτεται η υλοποίηση)
  • Παρέχει μια υποδομή έξυπνου δείκτη μέτρησης αναφοράς. Η διάρκεια ζωής της κλάσης SCOM δεν χρειάζεται να παρακολουθείται χειροκίνητα
  • Σας επιτρέπει να μάθετε εάν ένα αντικείμενο υλοποιεί μια συγκεκριμένη διεπαφή και μετατρέπει αυτόματα έναν δείκτη στο αντικείμενο σε έναν δείκτη στη διεπαφή
  • Δημιουργήστε ένα αντικείμενο υπηρεσίας που είναι πάντα προσβάσιμο μέσω της μεθόδου get_service, κ.λπ.

Για παράδειγμα, μπορείτε να περιγράψετε μια τάξη για ανάγνωση JSON (για παράδειγμα, JSONStreamReader) στο στοιχείο json.dll.
Οι κλάσεις και τα στιγμιότυπα μπορούν να δημιουργηθούν από άλλα στοιχεία· πρέπει να καταχωρηθούν στη μηχανή SCOM:

SCOM_CLASS_ENTRY(JSONStreamReader)

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

IJSONStreamReaderPtr jsonReader = create_instance<IJSONStreamReader>(SCOM_CLSIDOF(JSONStreamReader));

Για την υποστήριξη των υπηρεσιών, η SCOM προσφέρει μια πρόσθετη, μάλλον πολύπλοκη υποδομή. Κεντρικό στοιχείο είναι η έννοια μιας διαδικασίας SCOM, η οποία χρησιμεύει ως κοντέινερ για την εκτέλεση υπηρεσιών (δηλαδή παίζει το ρόλο του Service Locator) και περιέχει επίσης μια σύνδεση με τοπικούς πόρους. Η διαδικασία SCOM συνδέεται με το νήμα του λειτουργικού συστήματος. Χάρη σε αυτό, μέσα στην εφαρμογή μπορείτε να λαμβάνετε υπηρεσίες όπως αυτή:

SCOM_Process* process = core::current_process();
if (process)
         return get_service<IMyService>(process);

Επιπλέον, με την εναλλαγή λογικών διεργασιών (SCOM) που συνδέονται με ένα νήμα, μπορείτε να λάβετε εφαρμογές που είναι πρακτικά ανεξάρτητες από την άποψη του χώρου πληροφοριών, που εκτελούνται μέσα στο ίδιο νήμα. Αυτός είναι ο τρόπος με τον οποίο ο thin client μας λειτουργεί με μια βάση δεδομένων αρχείων - μέσα σε μια διαδικασία λειτουργικού συστήματος υπάρχουν δύο διεργασίες SCOM, η μία σχετίζεται με τον πελάτη και η δεύτερη με τον διακομιστή. Αυτή η προσέγγιση μας επιτρέπει να ενοποιήσουμε τη σύνταξη κώδικα που θα λειτουργεί τόσο στην τοπική βάση δεδομένων αρχείων όσο και στην «πραγματική» έκδοση πελάτη-διακομιστή. Το τίμημα για μια τέτοια ομοιομορφία είναι γενικά, αλλά η πρακτική δείχνει ότι αξίζει τον κόπο.

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

Διεπαφή χρήστη

Παρεμπιπτόντως, σχετικά με τις διεπαφές. Δεν χρησιμοποιούμε τυπικά στοιχεία ελέγχου των Windows, τα στοιχεία ελέγχου μας υλοποιούνται απευθείας στο API των Windows. Για την έκδοση Linux, έχει δημιουργηθεί ένα επίπεδο που λειτουργεί μέσω της βιβλιοθήκης wxWidgets.
Η βιβλιοθήκη των στοιχείων ελέγχου δεν εξαρτάται από άλλα μέρη του 1C:Enterprise και χρησιμοποιείται από εμάς σε πολλά άλλα μικρά εσωτερικά βοηθητικά προγράμματα.

Με τα χρόνια ανάπτυξης του 1C:Enterprise, η εμφάνιση των στοιχείων ελέγχου άλλαξε, αλλά μια σοβαρή αλλαγή στις αρχές σημειώθηκε μόνο μία φορά, το 2009, με την κυκλοφορία της έκδοσης 8.2 και την εμφάνιση των "διαχειριζόμενων φορμών". Εκτός από την αλλαγή της εμφάνισης, η αρχή της διάταξης της φόρμας έχει αλλάξει ριζικά - υπήρξε απόρριψη της τοποθέτησης των στοιχείων ανά εικονοστοιχείο προς όφελος της διάταξης ροής των στοιχείων. Επιπλέον, στο νέο μοντέλο, τα στοιχεία ελέγχου δεν λειτουργούν απευθείας με αντικείμενα τομέα, αλλά με ειδικούς DTO (Αντικείμενα μεταφοράς δεδομένων).
Αυτές οι αλλαγές κατέστησαν δυνατή τη δημιουργία ενός προγράμματος-πελάτη ιστού 1C:Enterprise που αναπαράγει τη λογική C++ των στοιχείων ελέγχου JavaScript. Προσπαθούμε να διατηρήσουμε λειτουργική ισοδυναμία μεταξύ thin και web clients. Σε περιπτώσεις όπου αυτό δεν είναι δυνατό, για παράδειγμα λόγω περιορισμών του διαθέσιμου API JavaScript (για παράδειγμα, η δυνατότητα εργασίας με αρχεία είναι πολύ περιορισμένη), συχνά υλοποιούμε την απαραίτητη λειτουργικότητα χρησιμοποιώντας επεκτάσεις προγράμματος περιήγησης γραμμένες σε C++. Προς το παρόν υποστηρίζουμε Internet Explorer και Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows και Linux) και Safari (MacOS).

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

Πλατφόρμα "1C: Enterprise" - τι υπάρχει κάτω από την κουκούλα;
Διασύνδεση 1C σε λειτουργικό σύστημα Linux

Πλατφόρμα "1C: Enterprise" - τι υπάρχει κάτω από την κουκούλα;
Διασύνδεση 1C σε φορητή συσκευή

Διασύνδεση 1C σε άλλες πλατφόρμες Πλατφόρμα "1C: Enterprise" - τι υπάρχει κάτω από την κουκούλα;
Διασύνδεση 1C σε λειτουργικό σύστημα Windows

Πλατφόρμα "1C: Enterprise" - τι υπάρχει κάτω από την κουκούλα;
Διεπαφή 1C - πελάτης ιστού

Ανοιχτή πηγή

Παρόλο που δεν χρησιμοποιούμε τυπικές βιβλιοθήκες για προγραμματιστές C++ στα Windows (MFC, στοιχεία ελέγχου από το WinAPI), δεν γράφουμε μόνοι μας όλα τα στοιχεία. Η βιβλιοθήκη έχει ήδη αναφερθεί wxWidgets, και χρησιμοποιούμε επίσης:

  • cURL για εργασία με HTTP και FTP.
  • OpenSSL για εργασία με κρυπτογραφία και δημιουργία συνδέσεων TLS
  • libxml2 και libxslt για ανάλυση XML
  • libetpan για εργασία με πρωτόκολλα αλληλογραφίας (POP3, SMTP, IMAP)
  • μιμητικός για ανάλυση μηνυμάτων email
  • sqllite για την αποθήκευση αρχείων καταγραφής χρηστών
  • ΜΕΘ για διεθνοποίηση

Η λίστα συνεχίζεται.
Επιπλέον, χρησιμοποιούμε μια εξαιρετικά τροποποιημένη έκδοση Google Test и Google Mock κατά την ανάπτυξη δοκιμών μονάδας.
Οι βιβλιοθήκες απαιτούσαν προσαρμογή για να είναι συμβατές με το μοντέλο οργάνωσης στοιχείων SCOM.
Η επικράτηση του 1C καθιστά την πλατφόρμα μια εξαιρετική δοκιμή αντοχής για τις βιβλιοθήκες που χρησιμοποιούνται σε αυτήν. Μια ποικιλία χρηστών και σεναρίων αποκαλύπτει γρήγορα σφάλματα ακόμη και στις πιο σπάνια χρησιμοποιούμενες περιοχές κώδικα. Τα διορθώνουμε μόνοι μας και προσπαθούμε να τα επιστρέψουμε στους συγγραφείς της βιβλιοθήκης. Η εμπειρία της αλληλεπίδρασης αποδεικνύεται πολύ διαφορετική.
Προγραμματιστές cURL и libetpan ανταποκρίνεται γρήγορα σε αιτήματα έλξης, αλλά η ενημέρωση κώδικα, για παράδειγμα, μέσα OpenSSL Δεν καταφέραμε ποτέ να το επιστρέψουμε.

Συμπέρασμα

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

Πώς υλοποιείται η κινητή πλατφόρμα 1C;
Περιγραφή της εσωτερικής δομής του προγράμματος-πελάτη Ιστού;
Ή μήπως σας ενδιαφέρει η διαδικασία επιλογής δυνατοτήτων για νέες εκδόσεις, ανάπτυξη και δοκιμή;

Γράψτε στα σχόλια!

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο