Λήψη δεδομένων μέσω σύνδεσης com από 1s. Τρεις πυλώνες εργασίας με αντικείμενα COM. Η εργασία μέσω μιας σύνδεσης COM είναι ευκολότερη από ό,τι νομίζετε. Δημιουργήστε μια σύνδεση OLE

Εκτύπωση (Ctrl+P)

Μία από τις επιλογές για την ανταλλαγή δεδομένων μεταξύ βάσεων δεδομένων 1C είναι η ανταλλαγή μέσω σύνδεσης COM. Χρησιμοποιώντας μια σύνδεση COM, μπορείτε να συνδεθείτε από μια βάση δεδομένων 1C σε μια άλλη και να διαβάσετε ή να γράψετε δεδομένα. Αυτή η μέθοδος μπορεί να χρησιμοποιηθεί τόσο σε εκδόσεις πελάτη-διακομιστή βάσεων δεδομένων όσο και σε βάσεις δεδομένων αρχείων. Αυτό το άρθρο εξετάζει αυτούς τους τύπους συνδέσεων στην πλατφόρμα 8.3

com σύνδεση

Μπορείτε να δημιουργήσετε δύο τύπους αντικειμένων COM για την εφαρμογή 1C. Αυτό είναι ole συνδέσεις V83.Εφαρμογή και συνδέσεις com V83.COMΣύνδεση . Σε περίπτωση που V83.ΕφαρμογήΚυκλοφορεί ένα σχεδόν πλήρες αντίγραφο της εφαρμογής 1C. Σε περίπτωση χρήσης V83.COMΣύνδεσηΈνα μικρό τμήμα διακομιστή εκκινείται. Η ταχύτητα λειτουργίας σε αυτήν την περίπτωση είναι υψηλότερη, αλλά ορισμένες λειτουργίες ενδέχεται να μην είναι διαθέσιμες. Ειδικότερα, η εργασία με φόρμες και κοινές μονάδες για τις οποίες δεν έχει οριστεί η ιδιότητα εργασίας με εξωτερικές συνδέσεις. Κυρίως πρέπει να χρησιμοποιήσετε V83.COMΣύνδεσηκαι μόνο σε περίπτωση έλλειψης λειτουργικότητας V83.Εφαρμογή. Η διαφορά στην ταχύτητα λειτουργίας μπορεί να είναι ιδιαίτερα αισθητή σε βάσεις δεδομένων μεγάλου όγκου. Χρησιμοποιείται για την πλατφόρμα 8.2 V82.Application ή V82.COMConnector

Δημιουργήστε μια σύνδεση OLE

Σύνδεση = Νέο COMObject("V83.Application") ;

Δημιουργήστε μια σύνδεση COM

Σύνδεση = Νέο αντικείμενο COMO ("V83.COMConnector" );

Συμβολοσειρά σύνδεσης

//Για την επιλογή πελάτη-διακομιστή
Συμβολοσειρά σύνδεσης= "Srvr = ""Όνομα διακομιστή" ";Αναφορά = " "Όνομα βάσης" ;
/Επιλογή /Για λειτουργία αρχείου:
Συμβολοσειρά σύνδεσης= "Αρχείο = ""PathKBase" "; Usr = Όνομα χρήστη; Pwd = Κωδικός πρόσβασης";
Απόπειρα
Σύνδεση = Σύνδεση . Συνδέω-συωδεομαι(ConnectionString) ;
Εξαίρεση
Message = New MessageToUser;
Μήνυμα . Κείμενο = "Αποτυχία σύνδεσης στη βάση δεδομένων" + DescriptionErrors(); Μήνυμα . Να αναφέρουν();
EndAttempt ;

Αποσύνδεση

Σύνδεση = Απροσδιόριστη ;
Για αντικείμενο V83.ΕφαρμογήΕίναι απαραίτητο να τερματίσετε τη σύνδεση, διαφορετικά θα παραμείνει μια ημιτελής συνεδρία, η οποία στη συνέχεια θα πρέπει να διαγραφεί χειροκίνητα. Σε περίπτωση που V83.COMΣύνδεσηη σύνδεση διακόπτεται αυτόματα όταν ολοκληρωθεί η διαδικασία με την οποία έγινε η σύνδεση.Και υπάρχει ένα ακόμη μικρό σημείο. Για τον χρήστη με τον οποίο πραγματοποιείται η σύνδεση, το πλαίσιο ελέγχου «Αίτημα επιβεβαίωσης κατά το κλείσιμο του προγράμματος» πρέπει να είναι απενεργοποιημένο στις ρυθμίσεις του.

Μέθοδος NewObject().

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

Για V83.COMΣύνδεση

RequestCOM = Σύνδεση. Νέοαντικείμενο( "Αίτηση ") ;
TableCOM = Σύνδεση. Νέοαντικείμενο( “Πίνακας αξιών”) ;
ArrayCOM = Σύνδεση. NewObject("Array") ;

ViewCOM =Connection.NewObject

Για V83.Εφαρμογή

RequestOLE = Σύνδεση. NewObject(" Αίτηση ") ;
TableOLE = Σύνδεση. NewObject(“Πίνακας αξιών”) ;
ArrayOLE = Connection.NewObject("Πίνακας" ) ;
ViewCOM =Connection.NewObject("UniqueIdentifier", StringUID);

RequestCOM . Κείμενο ="ΕΠΙΛΕΓΩ
| Θέσεις Οργανισμών Κώδικας,
| Θέσεις Οργανισμών.Όνομα
|ΑΠΟ | Κατάλογος.Θέσεις Οργανισμών
ΠΩΣ ΣΕ ΘΕΣΕΙΣ ΟΡΓΑΝΙΣΜΩΝ”;

Αποτέλεσμα = RequestCOM. Τρέξιμο();
Δείγμα = Αποτέλεσμα. Επιλέξτε () ;
Επιλογή αντίο. Επόμενο()Κύκλος
EndCycle ;
Μπορείτε επίσης να χρησιμοποιήσετε διαχειριστές αντικειμένων διαμόρφωσης:
DirectoryCOM = Σύνδεση. καταλόγους. DirectoryName;
DocumentCOM = Σύνδεση. Τεκμηρίωση. Όνομα εγγράφου;
RegisterCOM = Σύνδεση. Μητρώα Πληροφοριών. RegisterName ;

Λήψη και σύγκριση απαρίθμησης μέσω σύνδεσης COM

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

Αριθμός Στοιχείου = Connection.Directories.Directory1.FindByCode(1).Props1;

PossibleValues ​​= Enum Element.Metadata().Enum Values;

EnumerationElementNumber = PossibleValues.Index(PossibleValues.Find(Connection.XMLString(EnumerationElement)));

Αν EnumerationItemNumber = 0 Τότε Αναφορά( "Αριθμητική τιμή 1");

ElseIfEnumerationItemNumber = 1 ΕπειταΑναφορά ("EnumerationValue2");

τέλος εαν;

Ανάκτηση αντικειμένου μέσω COM με αναγνωριστικό

Μέσω των διαχειριστών αντικειμένων διαμόρφωσης παίρνουμε ένα αντικείμενο com, για παράδειγμα:
DocumentCOM = Σύνδεση. Τεκμηρίωση. Όνομα εγγράφου;

Στη συνέχεια, παίρνουμε μια συμβολοσειρά μοναδικού αναγνωριστικού:

StringUID =Connection.string ( DocumentCOM.UniqueIdentifier())

Αναγνωριστικό = Νέο U μοναδικό Αναγνωριστικό (StringUID);
ΜΕ linkByIdentifier = Documents[DocumentName].GetLink(Identifier);

Εάν πρέπει να βρείτε ένα αντικείμενο com ανά έγγραφο ανά αναγνωριστικό, τότε πρέπει να γράψετε ως εξής:

WidCOM = Connection.NewObject("UniqueIdentifier", StringUID);
LinkByIdentifier = Connection.Documents[DocumentName].GetLink(WidCOM);

Γεια σας Khabrachans!

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

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


Επέλεξα την Python ως τη γλώσσα που θα ενσωματωθεί στο 1C. Είναι πολύ κατάλληλο για αυτοματοποίηση διαδικασιών. Αυτό διευκολύνεται από τον μινιμαλισμό της σύνταξης (ο κώδικας πληκτρολογείται πολύ γρήγορα), πλούσιος τυπική βιβλιοθήκη(λιγότερη ανάγκη για λειτουργικές μονάδες τρίτων), cross-platform - με μεγάλη πιθανότητα, ο κώδικας γραμμένος σε Linix OS θα λειτουργήσει με επιτυχία στα Windows.

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

Μια φορά κι έναν καιρό, ένας οργανισμός είχε ένα πρόγραμμα γραμμένο στους Δελφούς και χρησιμοποιούσε το MSSQL/Firebird ως βάση δεδομένων. Σε αυτούς τους ένδοξους καιρούς, μπορούσατε να συνδεθείτε στη βάση δεδομένων χρησιμοποιώντας οποιαδήποτε γλώσσα και να εκτελέσετε πολλές ενέργειες - να επιλέξετε συνδρομητές οφειλετών, να δημοσιεύσετε πληρωμές που λάβατε, να καταγράψετε αναγνώσεις μέσων. Δεν προκαλεί έκπληξη το γεγονός ότι η συλλογή σεναρίων που αυτοματοποιούν τη ρουτίνα αυξάνεται συνεχώς. Οι προγραμματιστές μπορούσαν να εκτελέσουν οποιαδήποτε ενέργεια χωρίς να ανοίξουν το ίδιο το πρόγραμμα.

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

Τα κύρια καθήκοντα που αντιμετώπιζα ήταν η δυνατότητα γρήγορης απόκτησης δεδομένων για ένα συγκεκριμένο ΠΡΟΣΩΠΙΚΟΣ ΛΟΓΑΡΙΑΣΜΟΣ- Πλήρες όνομα, διεύθυνση, συσκευές μέτρησης, ενδείξεις μετρητών, πληρωμές, χρεώσεις. Συν τη δημιουργία εγγράφων - αναφορά συμφωνίας, απόδειξη πληρωμής. Επομένως, δεν υπάρχει δυνατότητα άμεσης σύνδεσης με τη βάση δεδομένων - όποιος έχει κοιτάξει μια βάση δεδομένων 1C σε έναν διακομιστή SQL έχει δει ότι είναι δύσκολο να κατανοήσει τη μάζα των πινάκων όπως aaa1, aaa2. Και η δημιουργία ερωτημάτων με τέτοια ονόματα πινάκων και πεδίων είναι απλά μη ρεαλιστική. Επιπλέον, πολλοί πίνακες 1C (ειδικά οι πιο σημαντικοί, όπως ένα κομμάτι του πιο πρόσφατου, ισορροπίες και περιστροφές) είναι εικονικοί και διάσπαρτοι σε διαφορετικούς φυσικούς πίνακες, που συλλέγονται από πολλαπλές συνδέσεις. Αυτή η μέθοδος δεν είναι κατάλληλη.

Η πλατφόρμα 1C παρέχει τη δυνατότητα σύνδεσης σε αυτήν μέσω σύνδεσης COM. Όπως πολλά προγράμματα των Windows, κατά την εγκατάσταση του 1C δύο αντικείμενα COM καταχωρούνται στο σύστημα - Διακομιστής Αυτοματισμού και Σύνδεση COM. Και τα δύο αντικείμενα μπορούν να εργαστούν χρησιμοποιώντας μια γλώσσα που υποστηρίζει την τεχνολογία COM.

Το αντικείμενο Automation Server είναι μια εφαρμογή 1C, σχεδόν καθόλου διαφορετική από μια κανονική εφαρμογή πελάτη. Η διαφορά είναι ότι υπάρχει μια επιπλέον ευκαιρία έλεγχος προγράμματοςπερίπτωση εφαρμογής. Όταν εργάζεστε με ένα αντικείμενο σύνδεσης COM, εκκινείται μια ελαφριά έκδοση της εφαρμογής 1C, στην οποία δεν είναι διαθέσιμες φόρμες, καθώς και λειτουργίες και μέθοδοι που σχετίζονται με τη διεπαφή και τα οπτικά εφέ. Η ίδια η εφαρμογή ξεκινά στη λειτουργία "Εξωτερική σύνδεση". Εκκίνηση καθολικών μεταβλητών (για παράδειγμα, ορισμός τρέχων χρήστηςκαι οι ρυθμίσεις του) πρέπει να εκτελούνται στη μονάδα εξωτερικής σύνδεσης 1C. Εάν σε λειτουργία εξωτερικής σύνδεσης ο κώδικας καλεί μια συνάρτηση που δεν είναι διαθέσιμη σε αυτήν τη λειτουργία, θα δημιουργηθεί μια εξαίρεση (η οποία θα περάσει στο σενάριο Python μας). Οι κλήσεις σε μη ασφαλείς συναρτήσεις θα πρέπει να πλαισιώνονται με κατασκευές της φόρμας

#If NOT a OuterJoin Τότε Προειδοποίηση("Γεια!"); #Τέλος εαν

Δεδομένου ότι η εργασία με αντικείμενα COM είναι μια τεχνολογία αποκλειστικά μόνο για Windows, δεν προκαλεί έκπληξη το γεγονός ότι δεν περιλαμβάνεται στην τυπική διανομή Python. Θα χρειαστεί να εγκαταστήσετε μια επέκταση - ένα σύνολο λειτουργιών που παρέχουν όλες τις απαραίτητες λειτουργίες για προγραμματισμό στα Windows σε Python. Μπορεί να γίνει λήψη ως προκατασκευασμένο πρόγραμμα εγκατάστασης exe. Η ίδια η επέκταση παρέχει πρόσβαση στο μητρώο, τις υπηρεσίες, τα αντικείμενα ODBC, COM κ.λπ. Εναλλακτικά, μπορείτε να εγκαταστήσετε αμέσως τη διανομή ActiveState Python, η οποία συνοδεύεται από μια επέκταση Win32 out of the box.

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

Η σύνδεση COM είναι αργή. Η χαμηλή απόδοση είναι ένα γνωστό μειονέκτημα της τεχνολογίας COM.
- Η διαδικασία δημιουργίας σύνδεσης με το 1C, ανάλογα με τη διαμόρφωση, μπορεί να διαρκέσει από 1 έως 8 δευτερόλεπτα (στην περίπτωσή μου - 6 δευτερόλεπτα). Περιττό να πούμε ότι η δημιουργία μιας σύνδεσης για κάθε αίτημα θα έχει ως αποτέλεσμα τη φόρτωση κάθε σελίδας σε 8 δευτερόλεπτα.
- Εφόσον οι εφαρμογές Ιστού στην Python λειτουργούν ως ανεξάρτητοι διακομιστές, το προηγούμενο σημείο μπορεί να αντισταθμιστεί με την αποθήκευση της σύνδεσης σε κάποια καθολική μεταβλητή και την επαναφορά της σε περίπτωση σφάλματος. Για να είμαι ειλικρινής, δεν έχω σκεφτεί ακόμα πώς να διατηρήσω μια σύνδεση στην PHP.
- Χάνεται η λειτουργία πολλαπλών πλατφορμών της διαδικτυακής εφαρμογής.

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

Η στρατηγική δράσης είναι η εξής: το σενάριο Python συνδέεται στο 1C, εκτελεί τα απαραίτητα ερωτήματα και ανεβάζει τα δεδομένα στη βάση δεδομένων SQLite. Μπορείτε να συνδεθείτε σε αυτή τη βάση δεδομένων από Python, PHP, Java. Τα περισσότερα από τα έργα μας λειτουργούν σε Python, και επειδή δεν αντέχω να γράφω ακατέργαστα ερωτήματα SQL με το χέρι, όλη η εργασία με τη βάση δεδομένων SQLite γίνεται μέσω του SQLAlchemy ORM. Το μόνο που χρειαζόταν ήταν να περιγραφεί η δομή δεδομένων της βάσης δεδομένων σε δηλωτικό στυλ:

Από sqlalchemy.ext.declarative εισαγωγή declarative_base από sqlalchemy εισαγωγή Στήλη, Ακέραιος, Αριθμητικός, ΗμερομηνίαΏρα, Unicode, Boolean, LargeBinary, ForeignKey Base = declarative_base() κλάση Abonent(Base): __tablename__" = "idgername__" = "idgername__" = "ingeritum" True) account = Column(Unicode(32), index=True) code = Column(Unicode(32)) address = Column(Unicode(512)) fio = Column(Unicode(256)) source = Column(Unicode(16)) ) psu = Column(Unicode(256)) tso = Column(Unicode(256)) np = Column(Unicode(256)) street = Column(Unicode(256)) house = Column(Integer) flat = Column(Integer) mro = Στήλη(Unicode(256)) class Payment(Base): __tablename__ = "πληρωμές" # και ούτω καθεξής...

Τώρα χρειάζεται απλώς να εισαγάγετε αυτήν την ενότητα σε οποιοδήποτε έργο Python και μπορείτε να εργαστείτε με τα δεδομένα.

Προβλέπω την ερώτησή σας - "γιατί SQLite"; Ο κύριος λόγος είναι ότι η βάση δεδομένων είναι μόνο για ανάγνωση, επομένως τα προβλήματα με την εγγραφή στο SQLite δεν πρέπει να μας ανησυχούν. Δεύτερον, η μορφή αυτού του DBMS είναι βολική - είναι πιο βολική η προβολή (υπάρχουν πολλά δωρεάν βοηθητικά προγράμματα, συμπεριλαμβανομένης μιας σούπερ επέκτασης για το FireFox). Τρίτον, σε ορισμένες περιπτώσεις ήταν απαραίτητο να αποκτήσετε πρόσβαση σε συνδρομητές από μηχανήματα που δεν έχουν σύνδεση με τον διακομιστή MySQL. Σε αυτήν την περίπτωση, αρκεί να αντιγράψετε το αρχείο βάσης δεδομένων SQLite και αυτό το μηχάνημα θα έχει πρόσβαση σε όλες τις πληροφορίες.

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

Η εργασία με αντικείμενα COM στην Python είναι λίγο ασυνήθιστη. Πρώτον, η "Pythonicity" του κώδικα χάνεται - οι κανόνες για την ονομασία μεταβλητών και συναρτήσεων στο 1C, για να το θέσω ήπια, δεν αντιστοιχούν στο Zen της Python. Δεύτερον, όλοι γνωρίζουν ότι τα αντικείμενα 1C συχνά ονομάζονται με κυριλλικούς χαρακτήρες, κάτι που θα προκαλέσει προβλήματα κατά την ανάπτυξη σε Python... αλλά μπορούν να λυθούν. Σας προτείνω να δείτε τον κώδικα:

Εισαγωγή pythoncom εισαγωγή win32com.client V82_CONN_STRING = "Srvr=v8_server;Ref=v8_db;Usr=username;Pwd=megapass;" pythoncom.CoInitialize() V82 = win32com.client.Dispatch("V82.COMConnector").Connect(V82_CONN_STRING)

Όπως φαίνεται από τον κώδικα, ο πελάτης προετοιμάζεται για να λειτουργεί με το 1C. Ένα αντικείμενο COM ορίζεται με το όνομα "V82.COMConnector". Λάβετε υπόψη ότι αυτό το όνομα ισχύει για την πλατφόρμα V8.2, εάν έχετε την έκδοση 8.1, τότε το όνομα θα είναι "V81.COMConnector".

Καλούμε τη μέθοδο Connect() στον αρχικοποιημένο πελάτη, περνώντας του τη συμβολοσειρά σύνδεσης. Η συμβολοσειρά αποτελείται από το όνομα διακομιστή, τη βάση δεδομένων, τον χρήστη και τον κωδικό πρόσβασης. Το αντικείμενο V82 που προκύπτει αποθηκεύει τη σύνδεση με την εφαρμογή 1C. Δεν έχει μέθοδο Disconnect() ή κάτι παρόμοιο. Για να αποσυνδεθείτε από τη βάση δεδομένων, απλώς διαγράψτε το αντικείμενο από τη μνήμη χρησιμοποιώντας τη συνάρτηση del() ή αντιστοιχίστε το στη μεταβλητή None.

Έχοντας ένα αντικείμενο, μπορείτε να αποκτήσετε πρόσβαση σε οποιαδήποτε πεδία και μεθόδους του παγκόσμιου περιβάλλοντος 1C, να λειτουργήσετε με καθολικά αντικείμενα όπως TabularDocument, ValueTable κ.λπ. Είναι σημαντικό να σημειωθεί ότι όταν εργάζεστε μέσω σύνδεσης COM, το 1C λειτουργεί στη λειτουργία "Εξωτερική σύνδεση". Δεν επιτρέπει καμία διαδραστική λειτουργία, όπως αναδυόμενα παράθυρα διαλόγου, ειδοποιήσεις και, κυρίως, φόρμες. Είμαι βέβαιος ότι θα καταραστείτε πολλές φορές τους προγραμματιστές ρυθμίσεων που περικλείουν την πιο σημαντική λειτουργία στη διαδικασία Button1Press() στη λειτουργική μονάδα φόρμας εγγράφου.

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

Set Con = CreateObject("v81.COMConnector") Set v8 =Con.Connect("Connection string") Set AccountsManager = v8.Documents.Accounts.... Ορισμός AccountsRecord= AccountsManager.CreateItem() AccountsRecord.Account = ... .... AccountsRecord.Write()

Στη συνέχεια, ο κώδικας της Python απλά θα συντριβεί με ένα Συντακτικό Σφάλμα. Τι να κάνω? Επεξεργασία της διαμόρφωσης; Όχι, αρκεί να χρησιμοποιήσετε τις μεθόδους getattr και setattr. Περνώντας ένα αντικείμενο COM και το κυριλλικό όνομα του χαρακτηριστικού σε αυτές τις συναρτήσεις, μπορείτε να λάβετε και να ορίσετε τιμές ανάλογα:

#coding=cp1251 catalog = getattr(V82.Catalogs, "PersonalAccounts")

Τα ακόλουθα είναι σημαντικά: τα ονόματα των λεπτομερειών, καθώς και οι παράμετροι των συναρτήσεων και των μεθόδων, πρέπει να μεταδοθούν στην κωδικοποίηση cp1251. Επομένως, για να αποφευχθεί η σύγχυση με τις κωδικοποιήσεις εκ των προτέρων, είναι λογικό να το δηλώσετε στην αρχή του αρχείου: #coding=cp1251. Στη συνέχεια, μπορείτε να περάσετε συμβολοσειρές χωρίς να ανησυχείτε για την κωδικοποίησή τους. Αλλά! Όλες οι συμβολοσειρές που λαμβάνονται από το 1C (αποτελέσματα συναρτήσεων κλήσης, ερωτήματα) θα είναι σε κωδικοποίηση UTF-8.

Ένα παράδειγμα κώδικα που εκτελεί ένα ερώτημα στο περιβάλλον 1C, επαναλαμβάνει το αποτέλεσμα και αποθηκεύει τη βάση δεδομένων στο SQLite:

#coding=cp1251 q = """ ΕΠΙΛΟΓΗ προσωπικών λογαριασμών. Κωδικός AS κωδικός, Προσωπικοί λογαριασμοί. Κτίριο. Διακανονισμός. Όνομα + ", " + Προσωπικοί λογαριασμοί. Σύντομη διεύθυνση AS, Προσωπικοί λογαριασμοί. Συνδρομητής. Όνομα AS fio, Προσωπικοί Λογαριασμοί. Διεύθυνση. Όνομα AS psu, EXPRESS (Χαρακτηριστικά των προσωπικών λογαριασμών Slice of the Last. Value AS Directory. Territorial Network Organizations). Όνομα AS tso, Personal Accounts. Building. Populated Point. Name AS np, Personal Accounts. Building. Street. Name Οδός AS, Προσωπικοί Λογαριασμοί. Κτίριο. Σπίτι AS σπίτι, Προσωπικός Λογαριασμός a.Κύριο δωμάτιο.Αριθμός δωματίου AS διαμέρισμα , PersonalAccounts.Division.Parent.Όνομα AS mro ΑΠΟ Κατάλογο.PersonalAccounts AS PersonalAccounts ΑΡΙΣΤΕΡΑ ΣΥΝΔΕΣΗΕνεργοί ΤύποιΕγγραφώνChar. εριστική = VALUE(Directory.Types of Characteristics.Territorial Network Organization)) AS ΧαρακτηριστικάL PersonalAccountsSliceΤελευταίο λογισμικό PersonalAccounts.Link = CharacteristicsPersonalAccountsSliceLast.Object """ query = V82.Qxeery query",(NewOject). ) CONN = db.connect() CONN.query(models.Abonent).delete() while selection.Next(): abonent = models.Abonent() abonent.account = selection.code.strip() abonent.code = επιλογή .code abonent.fio = επιλογή.fio abonent.address = selection.address abonent.psu = selection.psu abonent.tso = επιλογή. tso abonent.source = u"ASRN" abonent.np = επιλογή.np abonent.street = επιλογή .street abonent.house = επιλογή.σπίτι abonent.flat = επιλογή.flat abonent.mro = επιλογή.mro CONN.add(abonent) CONN.commit()

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

Όταν εργάζομαι με αιτήματα, ανακάλυψα τους ακόλουθους κανόνες.

Όταν επιλέγετε πεδία, αντιστοιχίστε τα ονόματα με λατινικά γράμματα· θα είναι πολύ πιο βολικό να έχετε πρόσβαση σε αυτά μέσω ενός επιλογέα (κουκκίδα), αντί για getattr().
- Επιλέξτε μόνο πρωτόγονους τύπους δεδομένων: συμβολοσειρές, αριθμούς, ημερομηνία και boolean. Μην επιλέγετε ποτέ συνδέσμους προς ένα αντικείμενο (έγγραφο, βιβλίο αναφοράς)! Σε αυτό το πλαίσιο, δεν χρειάζεστε απολύτως συνδέσμους και είναι ακόμη και επιβλαβείς, επειδή οποιαδήποτε κλήση σε ένα υποστήριγμα ή μια μέθοδο σύνδεσης θα οδηγήσει σε ένα αίτημα μέσω μιας σύνδεσης COM. Εάν αποκτήσετε πρόσβαση σε χαρακτηριστικά συνδέσμου σε βρόχο, θα είναι εξαιρετικά αργή.
- Εάν επιλέξετε ένα πεδίο τύπου Ημερομηνία, θα επιστραφεί ως αντικείμενο PyTime. Αυτός είναι ένας ειδικός τύπος δεδομένων για μετάδοση ημερομηνίας-ώρας σε σύνδεση COM. Δεν είναι τόσο βολικό να δουλεύεις μαζί του όσο με τη συνηθισμένη ώρα ημερομηνίας. Εάν μεταβιβάσετε αυτό το αντικείμενο στην int(), θα επιστρέψει μια χρονική σήμανση, από την οποία μπορείτε στη συνέχεια να λάβετε την ημερομηνία ώρα χρησιμοποιώντας τη μέθοδο fromtimestamp().

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

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

Σύνδεσμος = getattr(V82.Catalogs, "System Reports").FindByDescription("Ellen Reconciliation Report") nav_url = V82.GetURL(σύνδεσμος, "Report") name = V82.ExternalReports.Connect(nav_url) ExternalReport = V82.ExternalReport.x. Δημιουργία (όνομα) setattr(ExternalReport, "PersonalAccount", αναφορά) table_doc = ExternalReport.GetDoc() διαδρομή = V82.GetTempFileName("xls") table_doc.Write(διαδρομή, V82 .SpreadsheetDocumentFileType.XLS)αναφορά =μοντέλο.XLS) report .account = reference.Code.strip() report.type = u"act" report.document = open(path, "rb").read() CONN.add(report)

Το παραπάνω κομμάτι κάνει τα εξής: Η επεξεργασία που δημιουργεί το έγγραφο είναι συνδεδεμένη. Η επεξεργασία μπορεί να ενσωματωθεί στη διαμόρφωση, να αποθηκευτεί στο δίσκο ή σε μια βάση δεδομένων 1C (σε κάποιο κατάλογο). Εφόσον η επεξεργασία αλλάζει συχνά, για να μην ενημερώνεται η διαμόρφωση κάθε φορά, η επεξεργασία που αλλάζει πιο συχνά αποθηκεύεται στον κατάλογο "Αναφορές συστήματος", σε ένα χαρακτηριστικό "αποθήκευση τιμής" που ονομάζεται Αναφορά. Η επεξεργασία μπορεί να αρχικοποιηθεί ξεφορτώνοντάς την από τη βάση δεδομένων στο δίσκο και φορτώνοντάς την ή χρησιμοποιώντας τη μέθοδο GetURL(), στην οποία πρέπει να περάσετε έναν σύνδεσμο προς το στοιχείο καταλόγου και το όνομα του χαρακτηριστικού. Εκχωρούμε τις τιμές των λεπτομερειών στο λαμβανόμενο αντικείμενο επεξεργασίας, καλούμε την εξαγόμενη συνάρτηση GetDoc() και λαμβάνουμε ένα έγγραφο υπολογιστικού φύλλου που αποθηκεύεται σε ένα προσωρινό αρχείο Excel. Τα περιεχόμενα αυτού του αρχείου γράφονται στη βάση δεδομένων SQlite.

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

#coding=cp1251 acts = getattr(V82.Documents, "Act of Making Testimony") act = acts.CreateDocument() setattr(act, "Testimony", 1024.23) setattr(act, "Subscriber", "Ivanov") # Filling σε άλλες λεπτομέρειες... δράσε.Write()
Η εισαγωγή δεδομένων είναι πλέον αυτοματοποιημένη.

Έτσι, περιέγραψα μια μέθοδο που βασίζεται στη μεταφόρτωση και λήψη δεδομένων μέσω προγραμματισμού χρησιμοποιώντας μια σύνδεση COM. Αυτή η μέθοδος λειτουργεί με επιτυχία στον οργανισμό μου εδώ και σχεδόν ένα χρόνο. Η βάση δεδομένων, που σχηματίζεται από το 1C, εξυπηρετεί 3 συστήματα πληρωμών, απόκτηση Διαδικτύου (πληρωμή με κάρτες μέσω Διαδικτύου), καθώς και έναν προσωπικό λογαριασμό. Επιπλέον, συνδέονται με τη βάση δεδομένων διάφορα σενάριαγια αυτοματοποίηση της ρουτίνας.

Παρά τις αδυναμίες της μεθόδου (αργή ταχύτητα σύνδεσης COM), γενικά λειτουργεί σταθερά. Διαθέτουμε δεδομένα σε μορφή ανεξάρτητη από την πλατφόρμα (SQLite), τα οποία μπορούν να εργαστούν από οποιαδήποτε γλώσσα. Και το κύριο μέρος του κώδικα είναι γραμμένο σε Python, πράγμα που σημαίνει ότι είναι διαθέσιμα πολλά εργαλεία και τεχνικές που δεν μπορείτε καν να ονειρευτείτε σε 1C.

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

Εύχομαι σε όλους καλή τύχη και να θυμάστε ότι το 1C δεν είναι τόσο τρομακτικό όσο φαίνεται!

Μία από τις επιλογές για την ανταλλαγή δεδομένων μεταξύ βάσεων δεδομένων 1C είναι η ανταλλαγή μέσω σύνδεσης COM.

Χρησιμοποιώντας μια σύνδεση COM, μπορείτε να συνδεθείτε από μια βάση δεδομένων 1C σε μια άλλη και να διαβάσετε ή να γράψετε δεδομένα. Αυτή η μέθοδος μπορεί να χρησιμοποιηθεί τόσο σε εκδόσεις πελάτη-διακομιστή βάσεων δεδομένων όσο και σε βάσεις δεδομένων αρχείων. Σε αυτό το άρθρο θα δούμε παραδείγματα αυτού του τύπου σύνδεσης. Τα παραδείγματα χρησιμοποιούν την πλατφόρμα 8.2.

Μπορείτε να δημιουργήσετε δύο τύπους αντικειμένων COM για την εφαρμογή 1C. Αυτό V82.ΕφαρμογήΚαι V82.COMΣύνδεση. Σε περίπτωση που V82.ΕφαρμογήΚυκλοφορεί ένα σχεδόν πλήρες αντίγραφο της εφαρμογής 1C. σε περίπτωση χρήσης V82.COMΣύνδεσηΈνα μικρό τμήμα διακομιστή εκκινείται.
Η ταχύτητα λειτουργίας σε αυτήν την περίπτωση είναι υψηλότερη, αλλά ορισμένες λειτουργίες ενδέχεται να μην είναι διαθέσιμες. Ειδικότερα, η εργασία με φόρμες και κοινές μονάδες για τις οποίες δεν έχει οριστεί η ιδιότητα εργασίας με εξωτερικές συνδέσεις. Κυρίως πρέπει να χρησιμοποιήσετε V82.COMΣύνδεσηκαι μόνο σε περίπτωση έλλειψης λειτουργικότητας V82.Εφαρμογή. Η διαφορά στην ταχύτητα λειτουργίας μπορεί να είναι ιδιαίτερα αισθητή σε βάσεις δεδομένων μεγάλου όγκου.

Ας ξεκινήσουμε λοιπόν

  1. Ας δημιουργήσουμε ένα αντικείμενο COM
    • Για V82.ΕφαρμογήΣύνδεση = Νέο COMObject("V82.Application") ;
    • Για V82.COMΣύνδεσηΣύνδεση = Νέο COMObject("V82.COMConnector" );
  2. Ας δημιουργήσουμε μια συμβολοσειρά σύνδεσης
    • για την έκδοση διακομιστή της βάσης δεδομένων ConnectionString = "Srvr = " "ServerName" ";Ref = " "BaseName" ;
    • για την έκδοση αρχείου της βάσης δεδομένων ConnectionString = "File = " "PathKBase" "; Usr = Όνομα χρήστη; Pwd = Κωδικός πρόσβασης";
  3. Σύνδεση στη βάση δεδομένωνΠροσπάθεια σύνδεσης = Σύνδεση. Connect(ConnectionString) ; Exception Message = New MessageToUser; Μήνυμα. Κείμενο = + ErrorDescription() ; Μήνυμα. Να αναφέρουν() ; EndAttempt ;
  4. Αποσύνδεση από τη βάση δεδομένωνΣύνδεση = Απροσδιόριστη ;

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

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

Τώρα ας βάλουμε όλο τον κώδικα μαζί

Σύνδεση = Νέο COMObject("V82.Application") ; //Σύνδεση = Νέο COMObject("V82.COMConnector"); ConnectionString = "Srvr = " "Server1C" ";Ref = " "MyBase" "; Usr = Petya; Pwd = 123" ; //ConnectionString = "Αρχείο = ""С:\MyBase""; Usr = Petya; Pwd = 123";Προσπάθεια σύνδεσης = Σύνδεση. Connect(ConnectionString) ; Exception Message = New MessageToUser; Μήνυμα. Κείμενο = "Δεν ήταν δυνατή η σύνδεση στη βάση δεδομένων"+ DescriptionError() ; Μήνυμα. Να αναφέρουν() ; EndAttempt ; Σύνδεση = Απροσδιόριστη ;

Για τον τύπο σύνδεσης V82.Εφαρμογήη μέθοδος χρησιμοποιείται για το αντικείμενο COM που δημιουργήθηκε αρχικά και για V82.COMΣύνδεσημέθοδος εφαρμόζεται στη σύνδεση. περαιτέρω εργασίες με το αίτημα τυπικά μέσα 1C. στον κώδικα μοιάζει με αυτό:

Αίτημα = Σύνδεση. NewObject("Αίτηση") ; // Για V82.COMΣύνδεση Αίτημα = Σύνδεση. NewObject("Αίτηση") ; // Για V82.Εφαρμογή Αίτηση. Κείμενο = "ΕΠΙΛΟΓΗ | Θέσεις Οργανισμών Κώδικας, | Θέσεις Οργανισμών.Όνομα|ΑΠΟ | Κατάλογος. Θέσεις Οργανισμών AS Θέσεις Οργανισμών"; Αποτέλεσμα = Αίτημα. Τρέξιμο(); Δείγμα = Αποτέλεσμα. Choose() ; Επιλογή αντίο. Next() Loop EndLoop ;

Για την έκδοση 1C:Enterprise 8.3 όλα παραμένουν αμετάβλητα εκτός από το ότι κατά τη δημιουργία αντικειμένων COM πρέπει να χρησιμοποιείτε "V83.COMConnector"ή "V83.Application".

) Σωστά

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


Αυτό λέω, ότι θα ήταν ωραίο να καταλάβετε πόσο το χρειάζεστε χωρίς να διαβάσετε το άρθρο αξιολόγησης ή να το αξιολογήσετε όχι τόσο πρωτόγονα +/-. Όσο για το τι μου άρεσε, θα το διόρθωνα ως εξής: κέρδισε τόσα πολλά λόγω του γεγονότος ότι τα αστέρια ευθυγραμμίστηκαν και πολύς κόσμος μαζεύτηκε στον ιστότοπο και άρεσε σε πολλούς, καταλαβαίνετε ότι αυτό είναι θέμα τύχης γιατί μόλις φύγει το άρθρο αρχική σελίδατότε μπορεί ήδη να βρεθεί μόνο κατόπιν αιτήματος, και έτσι όλοι οι περαστικοί ψηφίζουν. Και, από όσο καταλαβαίνω, τα συνεχή σχόλια = προώθηση του άρθρου σας επιτρέπουν να το διατηρείτε στην κεντρική σελίδα.
Αυτός ακριβώς είναι ο λόγος που βάζουν καταστήματα σε δημόσιους δρόμους - τελικά, αυτό που είναι συχνά σημαντικό δεν είναι η ποιότητα και η συνάφεια των αγαθών, αλλά η δυνατότητα κυκλοφορίας του τόπου· οι άνθρωποι που περπατούν συχνά αγοράζουν κάτι που θα πετάξουν την επόμενη μέρα, απλώς για χάρη της διαδικασίας. Αυτή είναι μια ασθένεια που είναι γνωστή από καιρό σε όλους - ο εθισμός στα ψώνια. Ή απλά η αύξηση της ροής αυξάνει την πιθανότητα του σωστού αγοραστή.

Και τα πλεονεκτήματα και τα μειονεκτήματα... - αυτό είναι απλώς ένα είδος «ευχαριστώ» για τον χρόνο και τη δουλειά που αφιερώσατε


Εκείνοι. Το μείον μετράει και ως «ευχαριστώ»; Ήθελα να μάθω τη γνώμη σας για το αν πρέπει να χρησιμοποιείται σε τέτοιες περιπτώσεις και πόσο ενδιαφέρον πιστεύουν οι άλλοι; Πρέπει να το βάλετε όταν το άρθρο είναι επιβλαβές/κακό ή όταν είναι απλά άχρηστο/άδειο για εσάς;
Κατά τη γνώμη μου, το άρθρο μοιάζει με μια απλή αύξηση βαθμολογίας, επειδή:
1. Το πρόβλημα με τους τύπους που παρέθεσα αγνοήθηκε εντελώς από τον συγγραφέα, αν και δεν τεμπέλησε πολύ να γράψει ένα σωρό σχόλια.
2. Υπάρχει μια προφανής ανακρίβεια στο άρθρο: λέγεται ότι αυτός είναι ο μόνος τρόπος

V82 = Νέο COMObject("V82.ComConnector"); Κωδικός = AccountCOM.Code;


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

Αναφορά (Βάση. Κατάλογοι. Αντισυμβαλλόμενοι. Εύρεση κατά όνομα ("LLC"). Κωδικός);


και όλα καλά! Και επιλέγω τη σύνδεση V82.ComConnector
Είναι κάπως περίεργο που ο συγγραφέας δεν ενδιαφέρεται καθόλου που το άρθρο του περιέχει τα προβλήματα που επισημάνθηκαν, αλλά δεν αντιδρά με κανέναν τρόπο.
3. Ωστόσο, εξακολουθεί να υπάρχει πρόβλημα όταν εμφανίζεται το σφάλμα "Class is not exist".
4. Αλλά υπάρχει πρόβλημα όταν είναι εγκατεστημένο το 8.2 και μετά το 8.1 - δοκιμάστε να κάνετε ανταλλαγή μέσω OLE/COM με μια τυπική ανταλλαγή UT-BP!
5. Θα μπορούσατε να υποδείξετε την κύρια επεξεργασία στον ιστότοπο που σας επιτρέπει να συνδέεστε καθολικά μέσω OLE/COM για να μην χάνουν χρόνο οι αρχάριοι, γράφετε για αυτούς! Παρεμπιπτόντως, για κάποιο λόγο η φωτογραφία της είναι στην οθόνη σας, γιατί; Και ως αποτέλεσμα, 2 λέξεις επί της ουσίας, και άλλες 6 στα παρασκήνια.

Γενικά, δεν πετάω λάσπη, αλλά επισημαίνω συγκεκριμένα κενά, αλλά υπάρχει μηδενική αντίδραση. Εάν αυτή είναι η εμπειρία που μοιράζεστε, τότε είναι κατά κάποιο τρόπο λανθασμένη και ελλιπής.
Η άποψή μου είναι ότι αν ο συγγραφέας είχε την επιθυμία να συγκεντρώσει όλες τις δυσλειτουργίες, θα μπορούσε τουλάχιστον να ακούσει την εμπειρία άλλων ανθρώπων και να μην σχολιάσει απότομα. Αμέσως δημιουργείται μια κατάσταση όταν αυτός που το διάβασε ξέρει περισσότερα από τον συγγραφέα, του το λένε (κάποιες φορές λανθασμένα), κι αυτός αντεπιτίθεται. Ως αποτέλεσμα, όλες οι πληροφορίες δεν βρίσκονται στο άρθρο, αλλά στα σχόλια! Αστείος! Αυτό συμβαίνει συχνά, αλλά δεν χρειάζεται να εστιάσετε στο γεγονός ότι θέλατε το καλύτερο - εγώ δείχνω αυτό που είναι καλύτερο και άλλοι το δείχνουν! Συμπεριλάβετε αυτό στο άρθρο και θα αξίζει τον κόπο· δεν ενδιαφέρονται όλοι να διαβάσουν αυτήν την αψιμαχία.

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

Συνδεόμαστε μέσω COM στη βάση δεδομένων 1C

Για την υλοποίηση μιας σύνδεσης COM στο 1C, χρησιμοποιείται ένας ειδικός μηχανισμός που ονομάζεται COMConnector. Αυτό το αντικείμενο εγκαθίσταται μαζί με την πλατφόρμα και χρησιμοποιείται για επικοινωνία βάσεις πληροφοριών. Θα πρέπει να σημειωθεί ότι για τις εκδόσεις 8.2 και 8.3 χρησιμοποιούνται αντικείμενα με διαφορετικά ονόματα - "V82.COMConnector" και "V83.COMConnector", αντίστοιχα.

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

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

  1. Τι τύπος είναι - αρχείο ή πελάτης-διακομιστής.
  2. Που βρίσκεται;
  3. Τι όνομα και κωδικό πρόσβασης μπορείτε να χρησιμοποιήσετε για να συνδεθείτε;
  4. Ποια δεδομένα σας ενδιαφέρουν;

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

Connection ParametersFileIB = "File=""Path_to_database""; Usr=""User_name"";Pwd=""Password"""; Connection ParametersClientServerIB = "Srvr=""Όνομα_Διακομιστή""; Ref=""Όνομα_Βάσης_Δεδομένων""; Usr=""Όνομα_Χρήστη""; Pwd=""Κωδικός_Κωδικός""";

Η λειτουργία σύνδεσης είναι απλή και δεν θα πρέπει να δημιουργεί ερωτήσεις εάν όλες οι παράμετροι έχουν καθοριστεί σωστά. Για να επιταχύνετε τον εντοπισμό σφαλμάτων και την ανάλυση πιθανά σφάλματαείναι καλύτερο να περικλείσετε τη σύνδεση στην κατασκευή "Δοκιμάστε". Η συνάρτηση θα επιστρέψει μια τιμή του τύπου “COM object”, με την οποία θα εργαστείτε για να αποκτήσετε τα απαραίτητα δεδομένα.

Συνάρτηση &OnServer ConnectToBase() exportConnectionIB Παράμετροι = "File=""E:\1c database\ERP""; Usr=""Administrator"";Pwd=""1"""; V83COMCon= Νέο COMObject("V83.COMConnector"); Attempt Return V83COMCon.Connect(IB Connection Parameters); Αναφορά εξαίρεσης(ErrorDescription()); Επιστροφή Απροσδιόριστη. EndAttempt; EndFunction

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

Λαμβάνουμε δεδομένα από τη βάση δεδομένων 1C

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

Διαδικασία &OnServer TestCOMOnServer() Σύνδεση = ConnectToBase(); Αν TypeValue(Connection) Type("Undefined") Τότε RequestBPZO = Connection.NewObject("Request"); RequestBPZO.Text = "ΕΠΙΛΟΓΗ πρώτα 15 | DirectoryUser.Name AS Name |FROM | Directory.users AS DirectoryUser"; Select = RequestBPZO.Execute().select(); Ενώ Selection.next() βρόχος Report(Selection.Number); EndCycle; τέλος εαν; Τέλος Διαδικασίας >

Για παράδειγμα, για να λάβουμε πληροφορίες σχετικά με τους χρήστες ενός συγκεκριμένου τμήματος, θα ορίσουμε μια συνθήκη στο αίτημα μέσω παραμέτρων. Μια παράμετρος θα είναι απλού τύπου - συμβολοσειρά και η διαίρεση θα είναι ένας σύνδεσμος προς το στοιχείο καταλόγου "Επιχειρηματική δομή". Το αποτέλεσμα του ερωτήματος είναι ένας πίνακας με τα πεδία που αναφέρονται στον τύπο που υπάρχουν στη βάση δεδομένων στην οποία πραγματοποιήθηκε η σύνδεση COM. Εάν πρέπει να τα μετατρέψετε σε άλλους τύπους, χρησιμοποιήστε τις τυπικές λειτουργίες πλατφόρμας:

  • Γραμμή();
  • Αριθμός();
  • Ημερομηνία ().
RequestBPZO = Connection.NewObject("Request"); RequestBPZO.Text = "ΕΠΙΛΕΞΤΕ πρώτα 15 | DirectoryUser.Name ΩΣ Όνομα | FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department = &RequiredDepartment | Και DirectoryUser.Name όπως ""%"" + &RequiredName""+ ";""" Αίτημα BPZO.SetParameter("Απαιτούμενο Τμήμα", Σύνδεση. Κατάλογοι. Δομή επιχείρησης. Εύρεση με κωδικό ("00-000023")); RequestBPZO.SetParameter("RequiredName","Ekaterina"); Select = RequestBPZO.Execute().select(); Ενώ Selection.next() βρόχος Report(Selection.Name); EndCycle;

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

RequestBPZO = Connection.NewObject.("Request"); RequestBPZO.Text = "ΕΠΙΛΟΓΗ πρώτα 15 | DirectoryUser.Name AS Name | FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department B (&NecessaryDepartment) | Και DirectoryUser.Name όπως ""%"" + &NecessaryName" "; Array of Departments = Connection.NewObject("Array"); Array of Departments.Add(Connection.Directories.Enterprise Structure.Find By Code("00-000023")); Array of Departments.Add(Connection.Directories.Enterprise Structure.Find By Code("00-000038")); Array of Departments.Add(Connection.Directories.Enterprise Structure.Find By Code("00-000046")); Αίτημα BPZO.SetParameter("Required Department", Array of Departments); RequestBPZO.SetParameter("RequiredName","Ekaterina"); Select = RequestBPZO.Execute().select(); Ενώ Selection.next() βρόχος Report(Selection.Name); EndCycle;

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

StrIdent = String(Directories.Users.FindByCode("00-0000313").UniqueIdentifier()); Αν NOT ValueFilled(Connection.Directories.Users.GetLink(Connection.NewObject("UniqueIdentifier", StrIdent))) τότε NewUser = Connection.Directories.Users.CreateItem(); NewUser.Name = Directories.Users.FindByCode("00-0000313").Όνομα; NewUser.Individual = Directories.Users.FindByCode("00-0000313").Individual; NewUser.Write(); τέλος εαν;

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

Χημική ένωση..; VariableFunction = Σύνδεση..; κλήση συνάρτησης>όνομα γενικής μονάδας>κλήση διαδικασίας>όνομα γενικής μονάδας>

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