In diesem Artikel werde ich über die meiner Meinung nach einfachste Möglichkeit sprechen, Anwendungen von Drittanbietern in 1C-Konfigurationen zu integrieren. Der Artikel ist vor allem für Entwickler von Interesse, die über
.Net Core ,
PHP und
Python schreiben.
Es gibt viele Möglichkeiten, sich in 1C zu integrieren. Ein ausgezeichneter
Artikel von
1C selbst widmet sich sogar diesem
Thema . Insbesondere werden Sie daraus lernen, dass 1C die Mechanismen von Webdiensten unterstützt, was bedeutet, dass wir unseren eigenen Dienst auf der 1C-Seite und folglich unsere eigene ORM-Bibliothek auf der Clientanwendungsseite implementieren können. Eine dieser Bibliotheken wird später besprochen.
Beschreibung der Technik allgemein
Auf der Seite von 1C
Alles beginnt mit der Tatsache, dass die Erweiterung „Brom“ zur 1C-Konfiguration hinzugefügt wird und ein neuer Webdienst hinzugefügt wird. Die Erweiterung ist frei verfügbar und lizenziert (MIT). Die Erweiterung selbst ist nicht an ein bestimmtes Datenmodell gebunden und kann daher in jeder Konfiguration mit Unterstützung für den Kompatibilitätsmodus 8.3.10 oder höher installiert werden.
Nach der Installation der Erweiterung müssen Sie die Rechte der Benutzer konfigurieren, die Zugriff auf die Webdienstmethoden haben, und die Konfiguration auf dem Webserver veröffentlichen, damit auf den hinzugefügten Dienst über das http (s) -Protokoll zugegriffen werden kann. Auf der 1C-Seite ist nichts mehr erforderlich.
Auf der Client-Seite
Auf der Clientseite ist das Brom-Paket verbunden, z. B. für .Net Core kann dies mit dem folgenden Befehl erfolgen:
Install-Package Brom -Version 1.0.1-beta08
Oder für Python:
pip install brome
Nach der Installation des Pakets reicht es aus, ein Clientobjekt zu erstellen, über das die Interaktion mit der Remote-1C-Konfiguration ausgeführt wird. Im Folgenden werde ich den Code in C # angeben, aber in PHP und Python ist er ähnlich. So können Sie einen Client mit einem Befehl erstellen:
dynamic = new (@" = http://mydomain.com/publication_name; = 1c_user_name; = 1c_user_pass ");
Im Konstruktor reicht es aus, die Adresse der veröffentlichten 1C-Konfiguration und die Daten des Benutzers anzugeben, dem wir Zugriffsrechte für die Erweiterung erteilt haben. Sobald der Client erstellt ist, können wir mit dem interessantesten fortfahren.
Aufruf von Prozeduren und Funktionen 1C
Über den erstellten Brom-Client können wir die in 1C definierten Prozeduren und Funktionen aufrufen. In diesem Fall müssen die aufgerufenen Methoden serverseitig sein und entweder im globalen Kontext oder in Servermodulen (allgemeine Module oder Manager-Module) enthalten sein. So sieht beispielsweise der Funktionsaufruf des globalen Kontexts „Number Prescription“ aus:
string = .(2547, " = fr_FR");
Der zweite Parameter ist eine Formatzeichenfolge, die die Lokalisierung angibt (Französisch). Parameter werden in natürlicher Form übertragen und erfordern keine zusätzliche Konvertierung oder Verpackung.
Und so sieht der Aufruf der Funktion Nach Code suchen des Verzeichnisverwaltungsmoduls aus:
var = ...(840);
Hier haben wir die Funktion über das Modulmanagerverzeichnis "Währungen" aufgerufen. Das Ergebnis des Aufrufs ist ein Objekt vom Typ „DirectoryReference. Jetzt kann die resultierende Verknüpfung zum Objekt als Parameter an eine andere Funktion übergeben werden:
var = ..(, DateTime.Today);
Dieses Mal haben wir uns dem allgemeinen Modul „Mit Währungen arbeiten“ zugewandt und dessen Methode „Kurswährungen abrufen“ wiederhergestellt.
Die Bibliothek unterstützt das Arbeiten mit komplexen Datentypen, sodass Methoden aufgerufen werden können, die Eingaben oder Rückgaben annehmen: Links, Arrays, Strukturen, Wertetabellen, Wertebäume, Systemaufzählungen usw. Einige Klassen sind speziell in der Clientbibliothek implementiert, um die Arbeit mit 1C zu vereinfachen.
Der Umfang der Remote-Methoden kann flexibel konfiguriert werden, indem sie in den Einstellungen angegeben werden. Wenn Sie beispielsweise den Bereich "Verzeichnisse. *. Nach Code suchen" angeben, ist in allen Konfigurationsverzeichnissen nur die Methode "Nach Code suchen" verfügbar. So können Sie klar angeben, welche Methoden eine integrierte Anwendung verwenden kann.
Arbeite mit Links
Verweise auf Objekte ermöglichen nicht nur das Übertragen des Zeigers auf das 1C-Objekt, sondern auch das Empfangen von Daten des Objekts selbst. Das Arbeiten mit Links auf der Clientseite ist so einfach wie in 1C. Zum Beispiel:
var = ...("00-000018", new Date(2017, 1, 1)); var = .; var = .; var = ..; foreach (var in .) { Console.WriteLine((., .)); }
Hier haben wir über das Manager-Modul einen Link zum Dokument gefunden und die Werte der Dokumentfelder und deren tabellarischen Abschnitt „Produkte“ abgerufen. Nach dem ersten Zugriff auf das Objektfeld werden alle Daten vom 1C-Server heruntergeladen und auf dem Client gespeichert, bis der Link vom Garbage Collector gelöscht wird.
Eine Verknüpfung zum Objekt kann auch auf der Clientseite ohne Zugriff auf den Server hergestellt werden. Kennen Sie dazu einfach die eindeutige Kennung des Objekts:
var = ...(new Guid("5a32b6ab-4661-11e9-912a-38d547755ef7"));
Sie können auch nur Links zu vordefinierten Sammlungsobjekten erhalten:
var = ...18_118;
Objekte bearbeiten
Mit einem Link zum Objekt können wir die Daten des Objekts bearbeiten. Erstellen Sie dazu einfach einen Objektkontext:
var = .(); . = DateTime.Today; . = "00-000055"; ..(); var = ..() . = ...("000000104"); . = 3; .(.);
In diesem Beispiel haben wir den Kontext des Dokuments über einen Link zum Dokument erstellt, einige Felder ausgefüllt, dem tabellarischen Abschnitt „Produkte“ eine Zeile hinzugefügt und das Dokument im Buchungsmodus aufgezeichnet.
Wenn Sie ein neues Objekt erstellen müssen, ist dies auch möglich:
Hier haben wir eine neue Gruppe im Verzeichnis „Nomenklatur“ erstellt, dann ein Verzeichniselement erstellt und es in die erstellte Gruppe eingefügt.
Probenahme
Wie bei jedem anständigen ORM können Sie mit dem Brom-Client Beispiele aus verschiedenen 1C-Objektsammlungen erstellen. Eine Auswahl ist eine Sammlung von Verweisen auf Sammlungsobjekte, die eine Reihe von Auswahlbedingungen erfüllen. Um eine Auswahl zu erstellen, erstellen Sie einfach das Objekt „Selector“:
var = ...(""); var = ...(); . (", , , ."). ("", false). ("", , .). (""). ("", .); foreach (var in ) { Console.WriteLine(": {0}; : {1}, : {2}; : {3}", ., ., ., .. ); }
In diesem Beispiel haben wir ein Beispiel erhalten, das Elemente des Verzeichnisses "Nomenklatur" enthält, die hierarchisch in der Gruppe "Möbel" aufgeführt sind. Wir haben darauf hingewiesen, dass zusätzlich zu den Links selbst die Daten einiger Felder geladen werden müssen. Aus diesem Grund werden die Daten dieser Felder mit einer einzigen Anforderung geladen, und der Zugriff auf sie führt nicht zu zusätzlichen Serveraufrufen.
Abfrageausführung
Meistens werden die in einer Sammlung gespeicherten Daten nicht mehr ausreichend, und wir müssen die Daten durch eine komplexe Abfrage generieren lassen. Um Anforderungen zu erfüllen, wird in der Clientbibliothek eine spezielle Klasse "Anforderung" bereitgestellt. Die Arbeit mit Anforderungen auf der Client-Seite ist der Arbeit auf der 1C-Seite sehr ähnlich:
var = .(@" . , . , . . . = & "); .("", "-0001"); var = .(); foreach (var in ) { Console.WriteLine((., .)); }
Hier haben wir eine einfache Abfrage mit einem Parameter erstellt, der Daten aus dem Verzeichnis "Nomenklatur" auswählt. Als Parameter haben wir den String-Artikel des Elements übergeben. Im allgemeinen Fall kann der Parameterwert auch Verknüpfungen, Systemaufzählungen und sogar Arrays sein. Als Ergebnis der Abfrage haben wir die "Wertetabelle" zurückgegeben, diese Klasse ist auf der Clientseite implementiert. In diesem Beispiel haben wir die Felder der Tabellenzeilen mithilfe einer Schleife abgeleitet.
Auf der 1C-Seite werden alle Anforderungen über den Abfrage-Generator ausgeführt, sodass Sie nicht nur eine vorgefertigte Anforderung als Text angeben können, sondern auch eine Anforderungsvorlage mit Markup für den Builder:
var = .(@" 5 . , . , . { .*} ..( {(&)}, { ().*, ().*} ) { .} { .*, .*} ");
In diesem Beispiel haben wir eine standardisierte Anforderung angegeben, deren Einstellungen bei Bedarf auf der Clientseite dynamisch geändert werden können. Aus diesem Grund können Felder, Auswahlen und Sortierungen im Hauptteil des Hauptprogrammcodes und nicht im Hauptteil der Anforderung angegeben werden.
Die Run-Methode akzeptiert den optionalen Parameter "Typ des Crawls der Ergebnisse". Wenn Sie den Crawl-Typ "Nach Gruppierung" oder "Nach Gruppierung mit einer Hierarchie" angeben, gibt die Methode anstelle einer Wertetabelle einen Wertebaum zurück.
Anstelle der Run-Methode können Sie auch die Run Package-Methode aufrufen (um mehrere Anforderungen gleichzeitig auszuführen). In diesem Fall wird abhängig von der Art der Durchquerung ein Array von Tabellen oder ein Array von Bäumen zurückgegeben.
Ausführung von Code-Snippets
In einigen exotischen Fällen müssen Sie möglicherweise einen bestimmten Code direkt auf der 1C-Seite ausführen. Zu diesem Zweck stellt der Brom-Client die Methode "Ausführen" bereit. Die Methode verwendet Eingabetext mit ausführbarem Code und einem optionalen Parameter, der im Code in der Variablen "Parameter" verfügbar ist:
var = .(@" = 0; = + ; ; ", new double[] { 45, 67, 12.56, 11.9 });
In diesem Beispiel haben wir einen Code ausgeführt, der die Zahlen in einem Array summiert. Das Array selbst wurde als Parameter übergeben und in die Variable "Parameter" eingefügt. Das Ergebnis der Berechnung wurde in die Variable "Ergebnis" eingefügt. Wenn eine Variable mit diesem Namen in den ausführbaren Code eingetragen ist, wird ihr Wert zum Zeitpunkt der Ausführung als Ergebnis der Funktion "Ausführen" zurückgegeben.
Die Fähigkeit, Codefragmente auszuführen, wird durch eine separate Zugriffsrolle in der Erweiterung geregelt. Es wird empfohlen, diese Rolle nur zu Testzwecken zu aktivieren und sie im Arbeitsentwurf als zu deaktivieren Dies ist eine offensichtliche Sicherheitslücke.
Vorteile Nachteile der Technik
Die Vorteile der beschriebenen Methodik sollten sicherlich Folgendes umfassen:
- Plattformübergreifend . Alle Interaktionen basieren auf den SOAP- und HTTP-Protokollen, und ihre Implementierung erfolgt auf allen gängigen Entwicklungsplattformen.
- Die Einfachheit des Codes . Der Code auf der Clientanwendungsseite ist fast identisch mit dem Code auf der 1C-Seite.
- Eingebaute Serialisierungsmechanismen . Wir müssen keine Daten packen und entpacken, um sie mit 1C auszutauschen.
- Unterstützung für die Arbeit mit Links . Wir haben einfachen Zugang zu 1C-Objekten über Links;
- Unterstützung für 1C-spezifische Datentypen . Wir können mit 1C-Tabellen, Bäumen, Strukturen und anderen komplexen Strukturen austauschen.
- Zugriff auf den Anwendungskontext . Wir haben nicht nur Zugriff auf die Datenbankdaten, sondern können auch auf der 1C-Seite definierte Methoden aufrufen und auf den Sitzungsstatus zugreifen.
Die Nachteile dieser Technik sind auch verfügbar:
- Niedrige Datenrate . Da das SOAP-Protokoll auf XML-Serialisierung basiert, erfordert die Übertragung großer Datenmengen Zeit für den Austausch von überschüssigem Datenverkehr sowie für das Packen und Entpacken der Daten. Die Kommunikation über eine COM-Verbindung erscheint in diesem Zusammenhang vorzuziehen.
- Ein praktischer Client ist nicht auf allen Plattformen verfügbar . Wenn Sie kein .Net Core-, PHP- oder Python-Programmierer sind, müssen Sie den Brom-Client mithilfe von SOAP-Mechanismen selbst implementieren, was im Allgemeinen zeitaufwändig ist.
- Einschränkungen der Abfragesprache 1C . Da die gesamte Arbeit mit der Datenbank über den 1C-Abfragemechanismus erfolgt, gibt es einige Einschränkungen. Beispielsweise können Sie die klassische Paginierung von Daten nicht implementieren, weil In der Abfragesprache 1C gibt es keine Mechanismen zum Paging.
Vergleich mit OData
Aus dem oben genannten
Artikel von 1C können Sie herausfinden, dass in 1C: Der Zugriff von Unternehmen auf Daten mithilfe des standardisierten OData-Protokolls implementiert wird. Aus diesem Grund wäre es dumm, ihn auch nicht zu erwähnen.
Hier ist eine kurze Vergleichstabelle:
Es ist ersichtlich, dass diese Verfahren ihre Vor- und Nachteile haben und im allgemeinen Fall nicht austauschbar sind.
Fazit
Ich hoffe, dieser Übersichtsartikel wird Ihnen in Zukunft helfen, schnell und einfach Portale, persönliche Konten und Dienste zu erstellen, die eng in Buchhaltungssysteme integriert sind, die auf 1C: Enterprise basieren. Detaillierte Informationen zu den Bromkomponenten finden Sie in der offiziellen Dokumentation. Hier finden Sie nur eine kurze Übersicht über die Hauptmerkmale.