Drei Säulen der Arbeit mit COM-Objekten. Das Arbeiten über eine COM-Verbindung ist einfacher als Sie denken

)Alles ist richtig

Gleichzeitig habe ich mehr als einmal erlebt, dass Veröffentlichungen, die nicht einmal 10 Punkte erreichten, einfach „durchstarteten“.
Warum ist das passiert? Anscheinend, weil sie offensichtlich jemandem gefallen haben.


Damit möchte ich sagen, dass es schön wäre, zu verstehen, wie sehr Sie es benötigen, ohne den Bewertungsartikel zu lesen, oder es nicht so primitiv +/- zu bewerten. Was mir gefallen hat, würde ich so korrigieren: Es hat so viel gewonnen, weil die Sterne aufeinander abgestimmt sind und sich viele Leute auf der Seite versammelt haben und vielen gefallen hat. Sie verstehen selbst, dass dies eine Frage des Zufalls ist, denn Sobald ein Artikel die Hauptseite verlässt, kann er nur noch auf Anfrage gefunden werden, und so stimmt jeder, der vorbeikommt, ab. Und soweit ich weiß, können Sie durch ständige Kommentare = Werbung für den Artikel ihn auf der Hauptseite behalten.
Genau aus diesem Grund platzieren sie Geschäfte auf öffentlichen Straßen – schließlich kommt es oft nicht auf die Qualität und Relevanz der Waren an, sondern auf die Befahrbarkeit des Ortes. Oftmals kaufen die Menschen etwas, das sie am nächsten Tag einfach wegwerfen im Interesse des Prozesses. Dies ist eine Krankheit, die seit langem jedem bekannt ist – die Kaufsucht. Oder einfach die Erhöhung des Zustroms erhöht die Wahrscheinlichkeit, den richtigen Käufer zu finden.

Und die Vor- und Nachteile... – das ist nur eine Art „Dankeschön“ für die aufgewendete Zeit und Arbeit


Diese. Zählt ein Minus auch als „Dankeschön“? Ich wollte wissen, was Sie davon halten, ob es in solchen Fällen eingesetzt werden sollte und wie interessant andere denken? Sollten Sie es angeben, wenn der Artikel schädlich/schlecht ist oder wenn er für Sie einfach nutzlos/leer ist?
Meiner Meinung nach sieht der Artikel wie eine einfache Bewertungserhöhung aus, denn:
1. Das Problem mit den von mir zitierten Typen wurde vom Autor völlig ignoriert, obwohl er nicht zu faul war, eine Menge Kommentare zu schreiben.
2. Der Artikel enthält eine offensichtliche Ungenauigkeit: Es heißt, dies sei der einzige Weg

V82 = Neues COMObject("V82.ComConnector"); Code = AccountCOM.Code;


aber ich kann es leicht mit einer Verarbeitung wie dieser machen:

Report(Base. Verzeichnisse. Gegenparteien. Nach Namen suchen("LLC"). Code);


und alles ist gut! Und ich wähle die Verbindung V82.ComConnector
Es ist irgendwie seltsam, dass es dem Autor völlig egal ist, dass sein Artikel die aufgezeigten Probleme enthält, er aber in keiner Weise reagiert.
3. Es besteht jedoch immer noch ein Problem, wenn die Fehlermeldung „Klasse existiert nicht“ angezeigt wird
4. Es gibt jedoch ein Problem, wenn 8.2 installiert wird und dann 8.1 installiert wird – versuchen Sie es mit einem Standard-UT-BP-Austausch über OLE/COM!
5. Könnten Sie die Hauptverarbeitung auf der Website angeben, die Ihnen eine universelle Verbindung über OLE/COM ermöglicht, damit Anfänger keine Zeit verschwenden, Sie schreiben für sie! Übrigens, aus irgendeinem Grund ist ihr Bild auf Ihrem Display zu sehen, warum? Und als Ergebnis zwei Worte zum Sachverhalt und sechs weitere hinter den Kulissen.

Im Allgemeinen werfe ich keinen Schlamm, sondern weise auf bestimmte Lücken hin, aber es gibt keine Reaktion. Wenn dies die Erfahrung ist, die Sie teilen, dann ist sie irgendwie falsch und unvollständig.
Mein Punkt ist, dass der Autor, wenn er den Wunsch hätte, alle Pannen zu sammeln, sich zumindest die Erfahrungen anderer Leute anhören und nicht nach Kommentaren schnappen könnte. Es entsteht sofort eine Situation, in der derjenige, der es liest, mehr weiß als der Autor, man sagt es ihm (manchmal falsch) und er wehrt sich ebenfalls. Daher stehen alle Informationen nicht im Artikel, sondern in den Kommentaren! Lustig! Das passiert oft, aber Sie müssen sich nicht darauf konzentrieren, dass Sie das Beste wollten – ich zeige, was am besten ist, und andere zeigen es! Fügen Sie dies in den Artikel ein und es wird sich lohnen; nicht jeder ist daran interessiert, dieses Gefecht zu lesen.

Eine der Möglichkeiten zum Datenaustausch zwischen 1C-Datenbanken ist der Austausch über eine COM-Verbindung.

Über eine COM-Verbindung können Sie eine Verbindung von einer 1C-Datenbank zu einer anderen herstellen und Daten lesen oder schreiben. Diese Methode kann sowohl in Client-Server-Versionen von Datenbanken als auch in Dateidatenbanken verwendet werden. In diesem Artikel betrachten wir Beispiele für diese Art der Verbindung. Die Beispiele verwenden Plattform 8.2.

Sie können zwei Arten von COM-Objekten für die 1C-Anwendung erstellen. Das V82.Anwendung Und V82.COMConnector. Im Falle von V82.Anwendung Eine fast vollständige Kopie der 1C-Anwendung wird gestartet. im Falle einer Verwendung V82.COMConnector Ein kleiner Serverteil wird gestartet.
Die Betriebsgeschwindigkeit ist in diesem Fall höher, einige Funktionen sind jedoch möglicherweise nicht verfügbar. Insbesondere das Arbeiten mit Formularen und allgemeinen Modulen, für die die Eigenschaft, mit externen Verbindungen zu arbeiten, nicht festgelegt ist. Meistens sollten Sie verwenden V82.COMConnector und nur bei mangelnder Funktionalität V82.Anwendung. Der Unterschied in der Betriebsgeschwindigkeit kann sich besonders bei Datenbanken mit großen Volumina bemerkbar machen.

Also lasst uns anfangen

  1. Lassen Sie uns ein COM-Objekt erstellen
    • Für V82.Anwendung Connection = New COMObject("V82.Application" );
    • Für V82.COMConnector Connection = New COMObject("V82.COMConnector" );
  2. Lassen Sie uns eine Verbindungszeichenfolge erstellen
    • für die Serverversion der Datenbank ConnectionString = "Srvr = " "ServerName" ";Ref = " "BaseName" ;
    • für die Dateiversion der Datenbank ConnectionString = "File = " "PathKBase" "; Usr = Benutzername; Pwd = Passwort";
  3. Verbindung zur Datenbank herstellen Verbindungsversuch = Verbindung. Connect(ConnectionString) ; Ausnahmemeldung = New MessageToUser; Nachricht. Text = + ErrorDescription() ; Nachricht. Etwas melden() ; EndAttempt ;
  4. Verbindung zur Datenbank wird getrennt Verbindung = Undefiniert;

    Für Objekt V82.Anwendung Es ist notwendig, die Verbindung zu beenden, da sonst eine unvollständige Sitzung bestehen bleibt, die dann manuell gelöscht werden muss. Im Falle von V82.COMConnector Die Verbindung wird automatisch unterbrochen, wenn der Vorgang, mit dem die Verbindung hergestellt wurde, abgeschlossen ist. Und es gibt noch einen kleinen Punkt.

    Für den Benutzer, unter dem die Verbindung hergestellt wird, muss in seinen Einstellungen das Kontrollkästchen „Bestätigung beim Beenden des Programms anfordern“ deaktiviert werden.

Lassen Sie uns nun den gesamten Code zusammenstellen

Connection = New COMObject("V82.Application" ); //Connection = New COMObject("V82.COMConnector"); ConnectionString = "Srvr = " "Server1C" ";Ref = " "MyBase" "; Usr = Petya; Pwd = 123" ; //ConnectionString = "File = ""C:\MyBase""; Usr = Petya; Pwd = 123"; Verbindungsversuch = Verbindung. Connect(ConnectionString) ; Ausnahmemeldung = New MessageToUser; Nachricht. Text = "Verbindung mit der Datenbank fehlgeschlagen"+ DescriptionError() ; Nachricht. Etwas melden() ; EndAttempt ; Verbindung = Undefiniert;

Für Verbindungstyp V82.Anwendung Die Methode wird für das ursprünglich erstellte COM-Objekt und für verwendet V82.COMConnector Die Methode wird auf die Verbindung angewendet. Anschließend wird die Anfrage mit Standard-1C-Tools bearbeitet. im Code sieht es so aus:

Anfrage = Verbindung. NewObject("Request" ); // Für V82.COMConnector Anfrage = Verbindung. NewObject("Request" ); // Für V82.Anwendung Anfrage. Text = „AUSWÄHLEN | Positionen des Organisationskodex, | Positionen von Organizations.Name|VON | Verzeichnis. Positionen von Organisationen AS Positionen von Organisationen; Ergebnis = Abfrage. Laufen(); Probe = Ergebnis. Wählen() ; Tschüss-Auswahl. Next() Schleife EndLoop ;

Für Version 1C:Enterprise 8.3 bleibt alles unverändert, außer dass Sie beim Erstellen von COM-Objekten verwenden müssen „V83.COMConnector“ oder „V83.Anwendung“.

Drucken (Strg+P)

Eine der Möglichkeiten zum Datenaustausch zwischen 1C-Datenbanken ist der Austausch über eine COM-Verbindung. Über eine COM-Verbindung können Sie eine Verbindung von einer 1C-Datenbank zu einer anderen herstellen und Daten lesen oder schreiben. Diese Methode kann sowohl in Client-Server-Versionen von Datenbanken als auch in Dateidatenbanken verwendet werden. In diesem Artikel werden diese Arten von Verbindungen auf Plattform 8.3 erläutert

com-Verbindung

Sie können zwei Arten von COM-Objekten für die 1C-Anwendung erstellen. Das sind alte Verbindungen V83.Anwendung und Com-Verbindungen V83.COMConnector . Im Falle von V83.Anwendung Eine fast vollständige Kopie der 1C-Anwendung wird gestartet. Im Falle einer Verwendung V83.COMConnector Ein kleiner Serverteil wird gestartet. Die Betriebsgeschwindigkeit ist in diesem Fall höher, einige Funktionen sind jedoch möglicherweise nicht verfügbar. Insbesondere das Arbeiten mit Formularen und allgemeinen Modulen, für die die Eigenschaft, mit externen Verbindungen zu arbeiten, nicht festgelegt ist. Meistens sollten Sie verwenden V83.COMConnector und nur bei mangelnder Funktionalität V83.Anwendung. Der Unterschied in der Betriebsgeschwindigkeit kann sich besonders bei Datenbanken mit großen Volumina bemerkbar machen. Für Plattform 8.2 verwendet V82.Application oder V82.COMConnector

Stellen Sie eine OLE-Verbindung her

Connection = New COMObject(“V83.Application” );

Stellen Sie eine COM-Verbindung her

Connection = New COMObject(“V83.COMConnector” );

Verbindungszeichenfolge

//Für die Client-Server-Option
Verbindungszeichenfolge= „Srvr = „“ServerName“ „;Ref = „ „BaseName“ ;
//Für Dateimodusoption:
Verbindungszeichenfolge= „Datei =“„PathKBase“ „; Usr = Benutzername; Pwd = Passwort“;
Versuchen
Verbindung = Verbindung . Verbinden(ConnectionString) ;
Ausnahme
Message = New MessageToUser;
Nachricht . Text = „Verbindung zur Datenbank konnte nicht hergestellt werden“ + BeschreibungFehler(); Nachricht . Etwas melden();
EndAttempt ;

Trennung

Verbindung = Undefiniert;
Für Objekt V83.Anwendung Es ist notwendig, die Verbindung zu beenden, da sonst eine unvollständige Sitzung bestehen bleibt, die dann manuell gelöscht werden muss. Im Falle von V83.COMConnector Die Verbindung wird automatisch unterbrochen, wenn der Vorgang, mit dem die Verbindung hergestellt wurde, abgeschlossen ist. Und es gibt noch einen kleinen Punkt. Für den Benutzer, unter dem die Verbindung hergestellt wird, muss in seinen Einstellungen das Kontrollkästchen „Bestätigung beim Beenden des Programms anfordern“ deaktiviert werden.

NewObject()-Methode

Um ein neues Objekt zu erstellen, können Sie beispielsweise die Methode NewObject() verwenden:

Für V83.COMConnector

AnfrageCOM = Verbindung. NeuesObjekt( "Anfrage ") ;
TableCOM = Verbindung. NeuesObjekt( „Wertetabelle“) ;
ArrayCOM = Verbindung. NewObject(“Array” );

ViewCOM =Connection.NewObject

Für V83.Anwendung

AnfrageOLE = Verbindung. NewObject(“ Anfrage ") ;
TableOLE = Verbindung. NeuesObjekt(„Wertetabelle“) ;
ArrayOLE = Connection.NewObject(„Array“);
ViewCOM =Connection.NewObject(„UniqueIdentifier“, StringUID);

AnfrageCOM . Text ="WÄHLEN
| Positionen des Organisationskodex,
| Positionen von Organizations.Name
|VON | Verzeichnis.Positionen von Organisationen
„Wie man Organisationen positioniert“;

Ergebnis = RequestCOM. Laufen();
Probe = Ergebnis. Wählen () ;
Tschüss-Auswahl. Nächste()Zyklus
EndCycle ;
Sie können auch Konfigurationsobjektmanager verwenden:
DirectoryCOM = Verbindung. Verzeichnisse. Verzeichnisname;
DocumentCOM = Verbindung. Dokumentation. Dokumentname;
RegisterCOM = Verbindung. Informationsregister. RegisterName ;

Empfangen und Vergleichen der Aufzählung über COM-Verbindung

Um die Werte der in der Konfiguration definierten Aufzählungselemente zu vergleichen, ist es notwendig, diese Elemente in einen der primitiven Typen umzuwandeln, deren Vergleich einfach ist. Solche Typen können entweder ein numerischer Typ oder ein Zeichenfolgentyp sein. Sie können den Wert eines Aufzählungselements wie folgt in einen numerischen Typ konvertieren:

Enum-Element = Connection.Directories.Directory1.FindByCode(1).Props1;

MöglicheWerte = Enum Element.Metadata().Enum Values;

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

Wenn EnumerationItemNumber = 0, dann Report( „Enumerationswert1“);

ElseIfEnumerationItemNumber = 1 Dann Report("EnumerationValue2");

endIf;

Abrufen eines Objekts über COM anhand der Kennung

Über Konfigurationsobjektmanager erhalten wir ein COM-Objekt, zum Beispiel:
DocumentCOM = Verbindung. Dokumentation. Dokumentname;

Dann erhalten wir eine eindeutige Kennungszeichenfolge:

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

Kennung = Neues U uniqueIdentifier(StringUID);
MIT linkByIdentifier = Documents[DocumentName].GetLink(Identifier);

Wenn Sie ein COM-Objekt nach Dokument und Kennung suchen müssen, müssen Sie wie folgt schreiben:

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

Hallo Khabrachans!

In diesem Artikel möchte ich darüber sprechen, wie die Integration mit der 1C-Plattform in meiner Organisation etabliert wird. Was mich dazu veranlasst hat, war das nahezu völlige Fehlen technischer Informationen zu diesem Thema. Wenn Sie verschiedene Artikel und Berichte zum Thema der Verbindung von 1C mit einem beliebigen Informationssystem lesen, werden Sie immer wieder davon überzeugt, dass sie alle Marketing-, Demonstrations- und niemals technischer Natur sind und das Problem und den Kern seiner Lösung widerspiegeln.

Ich warne Sie, dass diese Methode in keiner Weise den Anspruch erhebt, universell zu sein. Da es selbst viele 1C-Konfigurationen und noch mehr Informationssysteme, Sprachen und Plattformen gibt, ist die Zahl der möglichen Kombinationen enorm. Mein Ziel ist es, eine mögliche Lösung aufzuzeigen.


Ich habe Python als Sprache ausgewählt, die in 1C integriert wird. Es eignet sich sehr gut für die Prozessautomatisierung. Dies wird durch den Minimalismus der Syntax (Code wird sehr schnell eingegeben), eine umfangreiche Standardbibliothek (weniger Bedarf an Modulen von Drittanbietern) und die plattformübergreifende Funktion erleichtert – mit hoher Wahrscheinlichkeit wird in Linix OS geschriebener Code unter Windows erfolgreich funktionieren .

Zunächst werde ich die Daten skizzieren, mit denen wir arbeiten werden. Die Organisation ist ein Energievertriebsunternehmen in der fernöstlichen Region – sie bedient rund 400.000 Abonnenten, die 1C-Datenbank basiert auf einer benutzerdefinierten Konfiguration. Für jeden Teilnehmer werden seine Zahlungen, Gebühren, verbrauchten Dienste und Berechnungsschemata, Zähler, Ablesungen und viele andere Daten gespeichert.

Es war einmal eine Organisation, die ein Programm in Delphi geschrieben hatte und MSSQL/Firebird als Datenbank verwendete. In jenen glorreichen Zeiten konnten Sie in jeder Sprache eine Verbindung zur Datenbank herstellen und viele Aktionen ausführen – Debitor-Abonnenten auswählen, erhaltene Zahlungen buchen, Instrumentenablesungen aufzeichnen. Es ist nicht verwunderlich, dass die Sammlung von Skripten, die die Routine automatisieren, ständig wächst. Programmierer könnten jede Aktion ausführen, ohne das Programm selbst zu öffnen.

Leider endete mit der Umstellung auf 1C das Freebie – eine direkte Verbindung zur Datenbank war nicht mehr möglich. Im Allgemeinen ist die 1C-Plattform selbst unteilbar und eignet sich nicht gut für die Integration mit anderen Systemen. Sie ist, wie man sagt, eine Sache für sich. Wenn Sie Daten in 1C laden, sollten Sie bedenken, dass das Extrahieren von dort nicht so einfach sein wird. Angesichts der Tatsache, dass die Organisation jedoch Zahlungssysteme und ein persönliches Konto implementieren musste, musste eine Lösung gefunden werden.

Die Hauptaufgaben, vor denen ich stand, bestanden darin, schnell Daten zu einem bestimmten persönlichen Konto abzurufen – vollständiger Name, Adresse, Messgeräte, Instrumentenwerte, Zahlungen, Gebühren. Plus die Erstellung von Dokumenten – Abgleichsbericht, Zahlungsbeleg. Es besteht also keine Möglichkeit einer direkten Verbindung zur Datenbank – jeder, der sich eine 1C-Datenbank auf einem SQL-Server angesehen hat, hat gesehen, dass es schwierig ist, die Masse an Tabellen wie aaa1, aaa2 zu verstehen. Aber Abfragen mit solchen Tabellen- und Feldnamen zu erstellen, ist einfach unrealistisch. Darüber hinaus sind viele 1C-Tabellen (insbesondere die wichtigsten, wie z. B. ein Ausschnitt der neuesten Informationen, Bilanzen und Umdrehungen) virtuell und über verschiedene physische Tabellen verteilt, die durch mehrere Verknüpfungen gesammelt werden. Diese Methode ist nicht geeignet.

Die 1C-Plattform bietet die Möglichkeit, über eine COM-Verbindung eine Verbindung herzustellen. Wie bei vielen Windows-Programmen werden bei der Installation von 1C zwei COM-Objekte im System registriert – Automation Server und COM Connector. Mit beiden Objekten kann mit einer Sprache gearbeitet werden, die die COM-Technologie unterstützt.

Das Automation Server-Objekt ist eine 1C-Anwendung, die sich kaum von einer regulären Client-Anwendung unterscheidet. Der Unterschied besteht darin, dass es zusätzlich möglich ist, eine Anwendungsinstanz programmgesteuert zu steuern. Beim Arbeiten mit einem COM Connector-Objekt wird eine vereinfachte Version der 1C-Anwendung gestartet, in der Formulare sowie Funktionen und Methoden im Zusammenhang mit der Schnittstelle und visuellen Effekten nicht verfügbar sind. Die Anwendung selbst startet im Modus „Externe Verbindung“. Die Initialisierung globaler Variablen (z. B. Ermittlung des aktuellen Benutzers und seiner Einstellungen) muss im externen 1C-Verbindungsmodul durchgeführt werden. Wenn der Code im externen Verbindungsmodus eine Funktion aufruft, die in diesem Modus nicht verfügbar ist, wird eine Ausnahme ausgelöst (die an unser Python-Skript übergeben wird). Aufrufe unsicherer Funktionen sollten mit Konstrukten der Form umrahmt werden

#If NOT an OuterJoin Then Warning("Hello!"); #EndIf

Da es sich bei der Arbeit mit COM-Objekten um eine reine Windows-Technologie handelt, ist es nicht verwunderlich, dass sie nicht in der Standard-Python-Distribution enthalten ist. Sie müssen eine Erweiterung installieren – eine Reihe von Modulen, die alle notwendigen Funktionen für die Programmierung unter Windows in Python bereitstellen. Es kann als vorgefertigtes EXE-Installationsprogramm heruntergeladen werden. Die Erweiterung selbst bietet Zugriff auf die Registrierung, Dienste, ODBC, COM-Objekte usw. Alternativ können Sie sofort die ActiveState-Python-Distribution installieren, die standardmäßig mit einer Win32-Erweiterung geliefert wird.

Ich experimentierte einige Zeit mit einer COM-Verbindung bei der Entwicklung von Webanwendungen, insbesondere einem persönlichen Konto. Folgende Nachteile wurden festgestellt:

Die COM-Verbindung ist langsam. Geringe Leistung ist ein bekannter Nachteil der COM-Technologie.
- Der Verbindungsaufbau mit 1C kann je nach Konfiguration 1 bis 8 Sekunden dauern (in meinem Fall 6 Sekunden). Es versteht sich von selbst, dass der Verbindungsaufbau für jede Anfrage dazu führt, dass das Laden jeder Seite 8 Sekunden dauert.
- Da Webanwendungen in Python als unabhängige Server arbeiten, kann der vorherige Punkt kompensiert werden, indem die Verbindung in einer globalen Variablen gespeichert und im Fehlerfall wiederhergestellt wird. Ehrlich gesagt habe ich noch nicht darüber nachgedacht, wie ich in PHP eine Verbindung aufrechterhalten kann.
- Die plattformübergreifende Funktionalität der Webanwendung geht verloren.

Basierend auf den oben aufgeführten Punkten wurde beschlossen, das Interaktionsprinzip zu ändern und es in zwei Teile zu unterteilen: den ersten plattformabhängigen (fensterbasierten) Hochladen von 1C-Daten in ein beliebiges geeignetes Format und den zweiten plattformunabhängigen Teil. im Prinzip in der Lage, mit Daten zu arbeiten, ohne etwas über 1C zu wissen.

Die Aktionsstrategie ist wie folgt: Das Python-Skript stellt eine Verbindung zu 1C her, führt die erforderlichen Abfragen aus und lädt die Daten in die SQLite-Datenbank hoch. Sie können über Python, PHP und Java eine Verbindung zu dieser Datenbank herstellen. Die meisten unserer Projekte arbeiten in Python, und da ich es nicht ertragen kann, reine SQL-Abfragen von Hand zu schreiben, erfolgt die gesamte Arbeit mit der SQLite-Datenbank über das SQLAlchemy ORM. Es war lediglich erforderlich, die Datenbankdatenstruktur in einem deklarativen Stil zu beschreiben:

From sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, Numeric, DateTime, Unicode, Boolean, LargeBinary, ForeignKey Base = declarative_base() class Abonent(Base): __tablename__ = "abonents" id = Column(Integer, Primary_key= True) Konto = Column(Unicode(32), index=True) Code = Column(Unicode(32)) Adresse = Column(Unicode(512)) fio = Column(Unicode(256)) Quelle = 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 = Column(Unicode(256)) class Payment(Base): __tablename__ = "zahlungen" # und so weiter ...

Jetzt müssen Sie dieses Modul nur noch in ein beliebiges Python-Projekt importieren und können mit den Daten arbeiten.

Ich sehe Ihre Frage voraus: „Warum SQLite“? Der Hauptgrund ist, dass die Datenbank schreibgeschützt ist, sodass uns Probleme beim Schreiben in SQLite keine Sorgen bereiten sollten. Zweitens ist das Format dieses DBMS praktisch – es ist einfacher anzuzeigen (es gibt viele kostenlose Dienstprogramme, einschließlich einer Supererweiterung für FireFox). Drittens war es in einigen Fällen notwendig, Abonnenten von Maschinen aus zu erreichen, die keine Verbindung zum MySQL-Server hatten. In diesem Fall reicht es aus, die SQLite-Datenbankdatei zu kopieren, und dieser Computer hat Zugriff auf alle Informationen.

Das Entladen erfolgt einmal täglich nachts. Die Eingabe von Daten in 1C kann auf die gleiche Weise automatisiert werden. Beispielsweise ist es erforderlich, die von Abonnenten auf der Website des persönlichen Kontos hinterlassenen Messwerte aufzuzeichnen. In diesem Fall stellen wir erneut eine Verbindung zu 1C her und erstellen und veröffentlichen programmgesteuert das Dokument „Act of Readings“. Ich werde den Code unten bereitstellen.

Die Arbeit mit COM-Objekten in Python ist etwas ungewöhnlich. Erstens geht die „Pythonizität“ des Codes verloren – die Regeln für die Benennung von Variablen und Funktionen in 1C entsprechen, gelinde gesagt, nicht dem Zen von Python. Zweitens weiß jeder, dass 1C-Objekte oft mit kyrillischen Zeichen benannt werden, was bei der Entwicklung in Python zu Problemen führt ... aber sie können gelöst werden. Ich schlage vor, dass Sie sich den Code ansehen:

Import pythoncom import 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)

Wie aus dem Code ersichtlich ist, wird der Client für die Arbeit mit 1C initialisiert. Ein COM-Objekt wird durch den Namen „V82.COMConnector“ definiert. Bitte beachten Sie, dass dieser Name für die Plattform V8.2 gültig ist. Wenn Sie Version 8.1 haben, lautet der Name „V81.COMConnector“.

Wir rufen die Connect()-Methode auf dem initialisierten Client auf und übergeben ihm die Verbindungszeichenfolge. Die Zeichenfolge besteht aus Servername, Datenbank, Benutzer und Passwort. Das resultierende V82-Objekt speichert die Verbindung zur 1C-Anwendung. Es gibt keine Disconnect()-Methode oder ähnliches. Um die Verbindung zur Datenbank zu trennen, löschen Sie einfach das Objekt mit der Funktion del() aus dem Speicher oder weisen Sie es der Variablen None zu.

Mit einem Objekt können Sie auf alle Felder und Methoden des globalen 1C-Kontexts zugreifen und mit universellen Objekten wie TabularDocument, ValueTable usw. arbeiten. Es ist wichtig zu beachten, dass 1C beim Arbeiten über eine COM-Verbindung im Modus „Externe Verbindung“ arbeitet. Es erlaubt keine interaktiven Funktionen wie Popup-Dialoge, Benachrichtigungen und vor allem Formulare. Ich bin mir sicher, dass Sie mehr als einmal die Konfigurationsentwickler verfluchen werden, die die wichtigste Funktionalität der Button1Press()-Prozedur in das Dokumentformularmodul einschließen.

Lassen Sie uns über eine so wichtige Sache wie kyrillische Attribute sprechen. Trotz der Tatsache, dass 1C eine zweisprachige Umgebung ist und es für jede russische Methode ein englischsprachiges Analogon gibt, müssen Sie früher oder später auf das kyrillische Attribut zurückgreifen. Wenn dies keine Probleme in PHP- oder VBSCript-Sprachen verursacht,

Set Con = CreateObject("v81.COMConnector") Set v8 =Con.Connect("Connection string") Set AccountsManager = v8.Documents.Accounts.... Set AccountsRecord= AccountsManager.CreateItem() AccountsRecord.Account = ... . .... AccountsRecord.Write()

Dann stürzt der Python-Code einfach mit einem Syntaxfehler ab. Was zu tun? Konfiguration bearbeiten? Nein, es reicht aus, die Methoden getattr und setattr zu verwenden. Durch die Übergabe eines COM-Objekts und des kyrillischen Namens des Attributs an diese Funktionen können Sie Werte entsprechend abrufen und festlegen:

#coding=cp1251 Catalog = getattr(V82.Catalogs, „PersonalAccounts“)

Wichtig ist: Die Namen von Details sowie Parameter von Funktionen und Methoden müssen in der cp1251-Kodierung übertragen werden. Um Verwechslungen mit Kodierungen vorab zu vermeiden, ist es daher sinnvoll, diese am Anfang der Datei zu deklarieren: #coding=cp1251. Anschließend können Sie Zeichenfolgen übergeben, ohne sich Gedanken über deren Kodierung machen zu müssen. Aber! Alle von 1C empfangenen Zeichenfolgen (Ergebnisse von Funktionsaufrufen, Abfragen) liegen in UTF-8-Kodierung vor.

Ein Beispiel für Code, der eine Abfrage in der 1C-Umgebung ausführt, das Ergebnis durchläuft und die Datenbank in SQLite speichert:

#coding=cp1251 q = """ SELECT Persönliche Konten. Code AS-Code, Persönliche Konten. Gebäude. Siedlung. Name + ", " + Persönliche Konten. Kurzadresse AS-Adresse, Persönliche Konten. Abonnent. Name AS fio, Persönliche Konten. Abteilung. Name AS psu, Persönliche Konten street, Personal Accounts. Building. House AS personal S, Couple.MainRoom.RoomNumber AS flat , PersonalAccounts.Division.Parent.Name AS mro FROM Directory.PersonalAccounts AS PersonalAccounts LEFT CONNECTION RegisterInformation.CharacteristicsPersonalAccounts.SliceLast(, TypeCharacteristics = VALUE(Directory. Arten von Merkmalen. Geographisch Netzwerkorganisation)) AS-Merkmale Persönlicher Account-Slice der neuesten Software Persönliche Accounts Link = Merkmale des persönlichen Account-Slice der neuesten. 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 = Auswahl. abonent.source = u"ASRN" abonent.np = Auswahl. np abonent.street = Selection.street abonent.house = Selection.house abonent.flat = Selection.flat abonent.mro = Selection.mro CONN.add(abonent) CONN.commit()

Hier ist CONN die Verbindungssitzung mit der SQLite-Datenbank. Ein Abfrageobjekt wird erstellt und sein Text wird ausgefüllt. Wie oben erwähnt, muss der Anforderungstext in cp1251 stehen, für den die Codierung zuerst deklariert wird. Nach der Ausführung der Anfrage werden alle Abonnenten in der Datenbank gelöscht, um keine Duplikate hinzuzufügen, dann werden sie in einer Schleife hinzugefügt und es folgt der endgültige Commit.

Bei der Arbeit mit Anfragen habe ich die folgenden Regeln entdeckt.

Wenn Sie Felder auswählen, weisen Sie ihnen Namen in lateinischen Buchstaben zu; es ist viel bequemer, über einen Selektor (Punkt) auf sie zuzugreifen, anstatt über getattr().
- Wählen Sie nur primitive Datentypen: Zeichenfolgen, Zahlen, Datum und Boolescher Wert. Wählen Sie niemals Links zu einem Objekt (Dokument, Nachschlagewerk) aus! In diesem Zusammenhang benötigen Sie absolut keine Links und sind sogar schädlich, da jeder Aufruf einer Link-Requisite oder -Methode zu einer Anfrage über eine COM-Verbindung führt. Wenn Sie in einer Schleife auf Linkattribute zugreifen, ist dies extrem langsam.
- Wenn Sie ein Feld vom Typ Datum auswählen, wird es als PyTime-Objekt zurückgegeben. Dies ist ein spezieller Datentyp zur Übertragung von Datum und Uhrzeit in einer COM-Verbindung. Es ist nicht so bequem, damit zu arbeiten wie mit der üblichen Datums- und Uhrzeitangabe. Wenn Sie dieses Objekt an int() übergeben, gibt es einen Zeitstempel zurück, aus dem Sie dann mit der Methode fromtimestamp() die Datums- und Uhrzeitangabe ermitteln können.

Schauen wir uns nun an, wie gedruckte Dokumente entstehen. Tatsache ist, dass dem Verbraucher die Möglichkeit gegeben werden muss, vorgefertigte Dokumente herunterzuladen, beispielsweise einen Zahlungsbeleg oder einen Abgleichsbericht. Diese Dokumente werden in 1C gemäß den festgelegten Anforderungen generiert; ihre Implementierung in Python wird viel Zeit in Anspruch nehmen. Daher ist es besser, Dokumente in 1C zu generieren und im Excel-Format zu speichern.

Somit wird das Abgleichsberichtsdokument durch eine spezielle externe Verarbeitung generiert. Für diejenigen, die mit der 1C-Terminologie nicht vertraut sind: Processing ist ein eigenständiges Programm mit einem eigenen Modul, Formularen und Vorlagen, das für die Ausführung in der 1C-Umgebung entwickelt wurde. Es ist notwendig, die Verarbeitung zu initialisieren, ihre Details einzugeben und eine Funktion aufzurufen, die uns ein Tabellenkalkulationsdokument zurückgibt, das zur Anzeige in 1C bestimmt ist. Dieses Dokument muss im Excel-Format gespeichert und auf den Server kopiert oder in der Datenbank erfasst werden.

Link = getattr(V82.Catalogs, "System Reports").FindByDescription("Ellen Reconciliation Report") nav_url = V82.GetURL(link, "Report") name = V82.ExternalReports.Connect(nav_url) ExternalReport = V82.ExternalReports. Create (name) setattr(ExternalReport, „PersonalAccount“, reference) table_doc = ExternalReport.GetDoc() path = V82.GetTempFileName(“xls“) table_doc.Write(path, V82 .SpreadsheetDocumentFileType.XLS) report = models.Report() report .account = reference.Code.strip() report.type = u"act" report.document = open(path, "rb").read() CONN.add(report)

Das obige Fragment bewirkt Folgendes: Die Verarbeitung, die das Dokument generiert, ist verbunden. Die Verarbeitung kann in die Konfiguration integriert, auf der Festplatte oder in einer 1C-Datenbank (in einem Verzeichnis) gespeichert werden. Da sich die Verarbeitung häufig ändert, wird die sich am häufigsten ändernde Verarbeitung im Verzeichnis „Systemberichte“ in einem „Wertspeicher“-Attribut namens „Bericht“ gespeichert, um die Konfiguration nicht jedes Mal zu aktualisieren. Die Verarbeitung kann initialisiert werden, indem Sie sie aus der Datenbank auf die Festplatte entladen und laden oder indem Sie die GetURL()-Methode verwenden, an die Sie einen Link zum Verzeichniselement und den Namen des Attributs übergeben müssen. Wir weisen die Werte der Details dem empfangenen Verarbeitungsobjekt zu, rufen die exportierte Funktion GetDoc() auf und erhalten ein Tabellendokument, das in einer temporären Excel-Datei gespeichert wird. Der Inhalt dieser Datei wird in die SQLite-Datenbank geschrieben.

Als letztes muss noch die programmatische Eingabe von Daten in 1C berücksichtigt werden. Nehmen wir an, dass Sie Aussagen von Abonnenten eingeben müssen. Dazu reicht es aus, das Dokument „Akt der Zeugenaussage“ zu erstellen und durchzuführen:

#coding=cp1251 Acts = getattr(V82.Documents, „Act of Taking Testimony“) act = Acts.CreateDocument() setattr(act, „Testimony“, 1024.23) setattr(act, „Subscriber“, „Ivanov“) # Füllen in anderen Details .. act.Write()
Die Dateneingabe erfolgt jetzt automatisiert.

Deshalb habe ich eine Methode skizziert, die auf dem programmgesteuerten Hoch- und Herunterladen von Daten über eine COM-Verbindung basiert. Diese Methode wird in meiner Organisation seit fast einem Jahr erfolgreich eingesetzt. Die aus 1C gebildete Datenbank bedient 3 Zahlungssysteme, Internet Acquiring (Zahlung mit Karten über das Internet) sowie ein persönliches Konto. Darüber hinaus sind verschiedene Skripte mit der Datenbank verbunden, um die Routine zu automatisieren.

Trotz der Mängel der Methode (langsame COM-Verbindungsgeschwindigkeit) funktioniert sie im Allgemeinen stabil. Wir verfügen über Daten in plattformunabhängiger Form (SQLite), mit denen aus jeder Sprache gearbeitet werden kann. Und der Großteil des Codes ist in Python geschrieben, was bedeutet, dass viele Tools und Techniken zur Verfügung stehen, von denen man in 1C nicht einmal träumen kann.

Dies ist eine der möglichen Möglichkeiten, mit 1C zu interagieren. Ich bin mir sicher, dass es nicht neu ist und wahrscheinlich schon von jemandem getestet und optimiert wurde. Ich habe jedoch versucht, so viele Einzelheiten des Prozesses wie möglich darzustellen, um Sie vor den Fallstricken zu bewahren, auf die ich selbst getreten bin.

Ich wünsche Ihnen allen viel Glück und denken Sie daran, dass 1C nicht so gruselig ist, wie es dargestellt wird!

Für den Informationsaustausch zwischen zwei Informationsdatenbanken ohne überflüssige Uploads und den Austausch von Dateien gibt es nichts Besseres als eine COM-Verbindung. Und dem kann man kaum widersprechen, denn die Verwendung dieser Art von Verbindung ist recht einfach und stabil. Aber in diesem Mechanismus gibt es einen Engpass und eine unangenehme Stelle. Wir sprechen über die Zeit, die benötigt wird, um eine Verbindung mit einer anderen Basis herzustellen. In manchen Fällen kann es recht große Werte erreichen, d.h. sehr lang sein.

Was ist los?

Im Moment der Verbindung über eine COM-Verbindung lädt die verbundene Datenbank die Konfiguration der Datenbank, zu der wir eine Verbindung herstellen, vollständig. Bei dem Versuch, beispielsweise eine Verbindung zur Enterprise Accounting-Datenbank herzustellen, hätte die Wartezeit recht lange gedauert, da das Konfigurationsvolumen Hunderte von Megabyte beträgt. Es wird deutlich, dass für einen schnelleren Betrieb alle Verbindungen zwischengespeichert und gepflegt werden müssen.

Leistungsanalyse

Stellen wir uns die Frage, ob es überhaupt notwendig ist, Verbindungen zwischenzuspeichern und ob dies Früchte trägt, wenn der Benutzer intensiv mit einer COM-Verbindung arbeitet. Lassen Sie uns die Verbindungszeit zu einer 20-kB-Konfiguration messen.

Wir sehen, dass die Verbindung zu einer kleinen Basis 3,5 Sekunden dauerte. Bei der Verbindung zu einer größeren Datenbank erhöht sich die Zeit um ein Vielfaches.

Beim Speichern einer aufrechterhaltenen Verbindung nehmen diese Aktionen mehrere Größenordnungen weniger Zeit in Anspruch.

Wie können wir unsere COM-Verbindung aktiv halten?

Das Problem besteht darin, dass die 1C-Plattform keine Standardtools zum Speichern von COM-Verbindungen in der Informationssicherheit bereitstellt. Es macht keinen Sinn, die Verbindung in Verzeichnissen und Dokumenten zu speichern, da sie sich oft ändern kann. Die erfolgversprechendste Möglichkeit besteht darin, die Verbindung im Sitzungsparameter zu speichern. Aber auch hier ist nicht alles so glatt. Schließlich gibt es keinen einzigen geeigneten Datentyp zum Speichern einer COM-Verbindung.

Diese Argumente führen dazu, dass die Speicherung in einer Variablen nur auf dem Client möglich ist. Betrachten wir die Option für ein verwaltetes Formular. Es ist notwendig, eine Variable im Formular mit der &OnClient-Direktive zu initialisieren, in der wir die Verbindungswerte speichern. Dementsprechend können Sie diese Verbindung auch nur auf dem Client aufrufen, da Sie kein COM-Objekt vom Client zum Server übertragen können. Bei regulären Formen gibt es keine Trennung zwischen Server und Client und dieser Mechanismus wird noch einfacher. Vergessen Sie nicht, die Verbindung zu schließen, bevor Sie das von Ihnen verwendete Formular schließen, um Speicherverluste zu vermeiden.

Statt Ausgabe

Obwohl dieses Schema einige Leistungsprobleme löst, ist es alles andere als ideal. Jedes Formular, bei dem eine COM-Verbindung unterstützt werden muss, erstellt eine neue Sitzung in der Empfänger-Infobase und erfordert dementsprechend eine größere Anzahl von Lizenzen. Einer der Hauptnachteile ist auch der Ausschluss der Unterstützung für die Verbindung zum Server

Im nächsten Artikel wird eine fortgeschrittenere Methode betrachtet, die diese Probleme beseitigt (Verbindung über Webdienste).



Verwandte Veröffentlichungen