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

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

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

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

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

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

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

ConnectionParametersFileIB = "File=""Path_to_base""; Usr=""User_name"";Pwd=""Κωδικός πρόσβασης"""; ConnectionParametersClientServerIB = "Srvr=""Όνομα_Διακομιστή""; Ref=""Όνομα_Βάσης""; Usr=""Όνομα_Χρήστη""; Pwd=""Κωδικός_Κωδικός""";

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

Συνάρτηση &AtServer ConnectToBase() εξαγωγή ConnectionParametersIB = "File=""E:\base 1c\ERP""; Usr=""Administrator"";Pwd=""1"""; V83COMCon= Νέο COMObject("V83.COMConnector"); Προσπάθεια επιστροφής V83COMCon.Connect(ConnectionParametersIB); Αναφορά εξαίρεσης(ErrorDescription()); Επιστροφή Απροσδιόριστο? Τέλος απόπειρας; EndFunctions

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

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

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

Διαδικασία &OnServer TestCOMOnServer() Σύνδεση = ConnectToBase(); Αν TypeValue(Connection) Type("Undefined") Τότε QueryBPO = Connection.NewObject("Query"); Ερώτημα BPZO.Text = "ΕΠΙΛΕΞΤΕ τα πρώτα 15 | Κατάλογος χρηστών. Όνομα ΩΣ Όνομα | ΑΠΟ | Κατάλογος χρήστη ΩΣ Κατάλογος χρηστών"; Selection = QueryBPO.Run().select(); Ενώ Sample.next() βρόχος Report(Selection.Number); EndCycle; Τέλος εαν; Τέλος Διαδικασίας >

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

  • Γραμμή();
  • Αριθμός();
  • Η ημερομηνία().
RequestBPO = Connection.NewObject("Request"); QueryBPO.Text = "ΕΠΙΛΟΓΗ πρώτα 15 | User Directory.Name AS Name |FROM | Directory.Users AS User Directory I WHERE | User Directory.Department = &DesiredDepartment | Και UserDirectory.Name όπως ""%"" + &DesiredName+ ""%" "" ; BPZO Request.SetParameter("Desired Department", Connection.Directories.Enterprise Structure.FindByCode("00-000023")); RequestBPO.SetParameter("RequiredName","Ekaterina"); Selection = QueryBPO.Run().select(); Ενώ Selection.next() βρόχος Report(Selection.Name); EndCycle;

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

RequestBPO = Connection.NewObject.("Request"); QueryBPO.Text = "ΕΠΙΛΟΓΗ πρώτα 15 | User Directory.Name AS Name | FROM | Directory.Users AS User Directory I WHERE | User Directory.Department In (&DesiredDepartment) | Και UserDirectory.Name όπως ""%"" + &DesiredName+ "" %" ""; Subdivisions Array = Connection.NewObject("Array"); Τμήματα array.Add(Connection.Catalogs.EnterpriseStructure.FindByCode("00-000023")); Τμήματα array.Add(Connection.Catalogs.EnterpriseStructure.FindByCode("00-000038")); Τμήματα array.Add(Connection.Catalogs.EnterpriseStructure.FindByCode("00-000046")); Ερώτημα BPZO.SetParameter("Desired Subdivision", Array of Subdivisions); RequestBPO.SetParameter("RequiredName","Ekaterina"); Selection = QueryBPO.Run().select(); Ενώ Selection.next() βρόχος Report(Selection.Name); EndCycle;

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

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

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

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

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

) Σωστά

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


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

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


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

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


αλλά το κάνω ήρεμα με τη βοήθεια της επεξεργασίας ως εξής:

Notify(Base.Directories.Counterparties.FindBy Name("LLC").Code);


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

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

Γεια Khabravchans!

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

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


Ως γλώσσα που θα ενσωματωθεί με το 1C, επέλεξα την Python. Είναι πολύ κατάλληλο για αυτοματοποίηση διαδικασιών. Αυτό διευκολύνεται από τη μινιμαλιστική σύνταξη (ο κώδικας πληκτρολογείται πολύ γρήγορα), η πλούσια τυπική βιβλιοθήκη (λιγότερη ανάγκη για ενότητες τρίτων), η 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 Connector, εκκινείται μια ελαφριά έκδοση της εφαρμογής 1C, στην οποία δεν υπάρχουν διαθέσιμες φόρμες, καθώς και λειτουργίες και μέθοδοι που σχετίζονται με τη διεπαφή και οπτικά εφέ. Η ίδια η εφαρμογή ξεκινά στη λειτουργία "Εξωτερική σύνδεση". Η προετοιμασία των καθολικών μεταβλητών (για παράδειγμα, ο προσδιορισμός του τρέχοντος χρήστη και των ρυθμίσεών του) πρέπει να εκτελεστεί στη μονάδα εξωτερικής σύνδεσης 1C. Εάν σε λειτουργία εξωτερικής σύνδεσης καλείται μια συνάρτηση στον κώδικα που δεν είναι διαθέσιμη σε αυτήν τη λειτουργία, θα δημιουργηθεί μια εξαίρεση (η οποία θα περάσει στο σενάριο python μας). Οι κλήσεις σε μη ασφαλείς λειτουργίες πρέπει να πλαισιώνονται με κατασκευές της φόρμας

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

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

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

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

Με βάση τα σημεία που αναφέρονται παραπάνω, αποφασίστηκε να αλλάξει η αρχή της αλληλεπίδρασης, χωρίζοντάς την σε 2 μέρη - το πρώτο εξαρτάται από την πλατφόρμα (Windows), εκφορτώνοντας δεδομένα 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 και δημιουργούμε και πραγματοποιούμε μέσω προγραμματισμού το έγγραφο «Πράξη λήψης μαρτυριών». Θα δώσω τον κωδικό παρακάτω.

Η εργασία με αντικείμενα COM στην Python είναι λίγο ασυνήθιστη. Πρώτον, η "πυθωνικότητα" του κώδικα χάνεται - οι κανόνες για την ονομασία μεταβλητών και συναρτήσεων στο 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, TableValues ​​κ.λπ. Είναι σημαντικό να σημειωθεί ότι όταν εργάζεστε μέσω μιας σύνδεσης 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 = ... .... AccountsWrite.Write()

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

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

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

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

#coding=cp1251 q = """ SELECT PersonalAccounts.Code AS code, PersonalAccounts.Building.Location.Name + ", " + PersonalAccounts.ShortAddress AS address, PersonalAccounts.Subscriber.Name AS fio, PersonalAccounts,PersonalAccounts.AS. EXPRESS(CharacteristicsPersonalAccountsSliceLast.Value AS Directory.Territorial GridOrganizations).Name AS tso, PersonalAccounts.Building.Settlement.Name AS np,PersonalAccounts.Building.StreetAsccountAscounters. Ντύσιμο. Το παιδί. Όνομα ως mro από ένα βιβλίο αναφοράς. Λίγα στοιχεία ως αφήγηση του προσώπου της αριστερής σύνδεσης των εγγραφών. Χαρακτηριστικά της σηματοδότησης. Τα ακόλουθα (, vidcharacteristics = αξία (βιβλίο αναφοράς. Vidcharacteristic. Territorial -shaped -based επιτήρηση. = V82.NewObject( "Query", q) selection = query.Execute().Choose() CONN = db.connect() CONN.query(models.Abonent).delete() while selection.Next(): abonent = models.Abonent() abonent.account = selection.code.strip() abonent.code = selection.code abonent.fio = selection.fio abonent.address = selection.address abonent.psu = selection.psu abonent.tso = επιλογή.tso abonent.πηγή = u"ASRN" abonent.np = επιλογή.np abonent.street = selection.street abonent.house = επιλογή.σπίτι abonent.flat = επιλογή.flat abonent.mro = επιλογή.mro CONN.add(abonent) CONN.commit()

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

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

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

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

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

Link = getattr(V82.Catalogs, "SystemReports").FindByDescription("Elen's Verification Act") nav_url = V82.GetURL(link, "Report") name = V82.ExternalReports.Connect(nav_url) ExternalReport = V82.ExternalReports. (όνομα) setattr(ExternalReport, "PersonalAccount", αναφορά) table_doc = ExternalReport.GetDoc() path = V82.GetTempFileName("xls") table_doc.Write(path, V82 .SpreadsheetDocumentFileType report.XLS) αναφορά =αναφορά .account = reference.Code.strip() report.type = u"act" report.document = open(path, "rb").read() CONN.add(report)

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

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

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

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

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

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

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

Εκτύπωση (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" );

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

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

Διακοπή της σύνδεσης

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

Μέθοδος NewObject().

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

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

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

WidCOM = Connection.NewObject

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

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

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

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

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

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

Στοιχείο Enum = Connection.Directories.Directory1.FindByCode(1).Attribute1;

PossibleValues ​​= EnumElement.Metadata().EnumValues;

EnumElementNumber = PossibleValues.Index(PossibleValues.Find(Connection.XMLString(EnumElement)));

Αν EnumItemNumber = 0 Τότε Αναφορά( "EnumValue1");

ElseIf EnumItemNumber = 1 ΕπειταΑναφορά ("EnumValue2");

Τέλος εαν;

Λήψη αντικειμένου μέσω COM με ID

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

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

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

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

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

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

Μία από τις επιλογές για την ανταλλαγή δεδομένων μεταξύ βάσεων δεδομένων 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; Μήνυμα. Κείμενο = + Περιγραφή Σφάλματα() ; Μήνυμα. Να αναφέρουν() ; EndTry ;
  4. Αποσύνδεση από τη βάσηΣύνδεση = Απροσδιόριστη;

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

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

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

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

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

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

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