Die Plattform „1C:Enterprise“ – was steckt dahinter?

Hallo, Habra!
In diesem Artikel beginnen wir mit der Beschreibung, wie die Plattform aufgebaut ist „1C:Enterprise 8“ und welche Technologien bei ihrer Entwicklung verwendet werden.

Die Plattform „1C:Enterprise“ – was steckt dahinter?

Warum halten wir das fĂŒr interessant? Erstens, weil die Plattform „1C:Enterprise 8“ eine große (ĂŒber 10 Millionen Zeilen Code) Anwendung in C++ (Client, Server usw.), JavaScript (Web-Client) und seit Kurzem auch Java. Große Projekte sind interessant, auch wegen ihrer GrĂ¶ĂŸe, denn Probleme, die in kleinen Codebasen unauffĂ€llig sind, treten in solchen Projekten deutlich hervor. Zweitens ist „1C:Enterprise“ ein reproduzierbares, „Box“-Produkt, und es gibt nicht viele Artikel ĂŒber solche Entwicklungen auf dem Habr. Und außerdem ist es immer interessant zu erfahren, wie es in anderen Teams und Firmen lĂ€uft.

Also, fangen wir an. In diesem Artikel geben wir einen Überblick ĂŒber einige Technologien, die in der Plattform verwendet werden, und skizzieren die Landschaft, ohne tief in die Implementierung einzutauchen. Denn fĂŒr viele Mechanismen wĂŒrde eine detaillierte Beschreibung einen eigenen Artikel erfordern, und fĂŒr einige sogar ein ganzes Buch!
ZunĂ€chst sollten wir uns mit den grundlegenden Dingen befassen – was ist die Plattform „1C:Enterprise“ und aus welchen Komponenten besteht sie? Die Antwort auf diese Frage ist nicht so einfach, denn mit dem Begriff „Plattform“ (aus GrĂŒnden der KĂŒrze werden wir sie so nennen) bezeichnet man sowohl die Entwicklungsumgebung fĂŒr GeschĂ€ftsanwendungen als auch die AusfĂŒhrungsumgebung und die Administrationsmittel. Man kann grob folgende Teile unterscheiden:

  • Servercluster
  • „DĂŒnner“ Client, der sich ĂŒber HTTP und ein eigenes binĂ€res Protokoll mit dem Server verbinden kann
  • Client fĂŒr die Arbeit in einer zwei- schichtigen Architektur mit einer auf der Festplatte oder im Netzwerkordner gespeicherten Datenbank
  • Web-Client
  • Administrationsmittel fĂŒr den Anwendungsserver
  • Entwicklungsumgebung (bekannt als Konfigurator)
  • AusfĂŒhrungsumgebung fĂŒr iOS, Android und Windows Phone (mobile Plattform 1C)

Alle diese Teile, mit Ausnahme des Web-Clients, sind in C++ geschrieben. DarĂŒber hinaus gibt es einen neu angekĂŒndigten Konfigurator der neuen Generation, der in Java geschrieben ist.

Native Anwendungen

FĂŒr die Entwicklung nativer Anwendungen wird C++03 verwendet. Unter Windows wird Microsoft Visual C++ 12 (Profil kompatibel mit Windows XP) als Compiler eingesetzt, wĂ€hrend unter Linux und Android gcc 4.8 und fĂŒr iOS clang 5.0 verwendet wird. Die Standardbibliothek ist fĂŒr alle Betriebssysteme und Compiler einheitlich – STLPort. Diese Lösung verringert die Wahrscheinlichkeit von fehlerhaften Implementierungen, die spezifisch fĂŒr STL sind. Derzeit planen wir den Übergang zur STL-Implementierung, die mit CLang geliefert wird, da STLPort seine Entwicklung eingestellt hat und nicht mit dem aktivierten C++11-UnterstĂŒtzungsmodus in gcc kompatibel ist.
Der Code-Bestand des Servers betrĂ€gt dabei 99 % und des Clients 95 %. DarĂŒber hinaus verwendet sogar die mobile Plattform denselben C++-Code wie die "große", obwohl der Grad der Vereinheitlichung dort etwas geringer ist.
Wie die meisten C++-Benutzer beanspruchen wir nicht, 100 % der Funktionen der Sprache und ihrer Bibliotheken zu nutzen. So verwenden wir praktisch kein Boost, und von den Spracheigenschaften nutzen wir die dynamische Typumwandlung nicht. Dabei setzen wir aktiv Folgendes ein:

  • STL (insbesondere Strings, Container und Algorithmen)
  • mehrfache Vererbung, einschließlich mehrfacher Vererbung von Implementierungen
  • Templates
  • Ausnahmen
  • intelligente Zeiger (eigene Implementierung)

Durch die Verwendung mehrerer Vererbung von Schnittstellen (vollstĂ€ndig abstrakte Klassen) wird ein komponentenbasierter Ansatz möglich, ĂŒber den spĂ€ter gesprochen wird.

Komponenten

Um ModularitÀt zu gewÀhrleisten, wird die gesamte FunktionalitÀt in Komponenten unterteilt, die dynamische Bibliotheken reprÀsentieren (*.dll unter Windows, *.so unter Linux). Insgesamt gibt es mehr als 150 Komponenten; hier sind einige davon beschrieben:

backend
EnthÀlt die "Engine" der Metadaten der Plattform

accnt
Objekte, die von Anwendungsentwicklern zur Erstellung der Buchhaltung (KontenplÀne und Buchhaltungsregister) verwendet werden

bsl
Engine zur AusfĂŒhrung der eingebetteten Sprache

nuke
Eigene Implementierung eines Speicher-Allocators

dbeng8
Engine einer Dateibasierten Datenbank. Eine einfache Datei-Server-Datenbankmaschine, die auf ISAM basiert und auch einen einfachen SQL-Prozessor enthÀlt

wbase
EnthĂ€lt grundlegende Klassen und Funktionen zur Implementierung von BenutzeroberflĂ€chen in Windows – Fensterklassen, Zugriff auf GDI usw.

Die Aufteilung in mehrere Komponenten ist aus mehreren Blickwinkeln vorteilhaft:

  • Die Aufteilung fördert ein besseres Design, insbesondere eine bessere Isolation des Codes.
  • Aus der Komponentensammlung können verschiedene Lieferoptionen flexibel zusammengestellt werden:
    • Zum Beispiel enthĂ€lt die Installation des Thin Clients wbase, aber keinen Backend
    • wĂ€hrend auf dem Server wbase hingegen nicht vorhanden sein wird
    • Beide Varianten werden natĂŒrlich nuke und bsl enthalten

Alle benötigten Komponenten fĂŒr diese Startoption werden beim Programmstart geladen. Dies ist insbesondere notwendig fĂŒr die Registrierung von SCOM-Klassen, ĂŒber die wir spĂ€ter sprechen werden.

SCOM

FĂŒr eine niedrigere Dekomposition wird das SCOM-System verwendet - Ă€hnlich in der Ideologie wie die ATL-Bibliothek. FĂŒr diejenigen, die nicht mit ATL gearbeitet haben, hier eine kurze AufzĂ€hlung der Hauptfunktionen und -merkmale.
FĂŒr eine speziell gestaltete SCOM-Klasse:

  • Stellt Fabrikmethoden bereit, die es ermöglichen, eine Klasse aus einer anderen Komponente zu erstellen, nur indem man ihren Namen kennt (ohne die Implementierung preiszugeben)
  • Bietet eine Infrastruktur fĂŒr intelligente Zeiger mit ReferenzzĂ€hlung. Die Lebensdauer der SCOM-Klasse muss nicht manuell ĂŒberwacht werden
  • Ermöglicht zu erkennen, ob ein Objekt ein bestimmtes Interface implementiert und automatisch den Zeiger auf das Objekt in einen Zeiger auf das Interface zu konvertieren
  • Ein Dienstobjekt zu erstellen, das immer ĂŒber die Methode get_service verfĂŒgbar ist, usw.

Zum Beispiel kann in der Komponente json.dll eine Klasse fĂŒr das Lesen von JSON (zum Beispiel JSONStreamReader) beschrieben werden.
Klassen, Instanzen können aus anderen Komponenten erstellt werden, mĂŒssen jedoch in der SCOM-Maschine registriert werden:

SCOM_CLASS_ENTRY(JSONStreamReader)

Dieses Makro beschreibt eine spezielle statische Registrierklasse, dessen Konstruktor beim Laden der Komponente in den Speicher aufgerufen wird.
Danach kann eine Instanz in einer anderen Komponente erstellt werden:

IJSONStreamReaderPtr jsonReader = create_instance(SCOM_CLSIDOF(JSONStreamReader));

FĂŒr die UnterstĂŒtzung von Diensten bietet SCOM eine zusĂ€tzliche, recht komplexe Infrastruktur. Zentral darin ist das Konzept des SCOM-Prozesses, der als Container fĂŒr gestartete Dienste dient (also die Rolle des Service Locators erfĂŒllt) und auch Bindungen an lokalisiert Ressourcen enthĂ€lt. Der SCOM-Prozess wird an den OS-Thread gebunden. Dadurch können innerhalb der Anwendung die Dienste folgendermaßen abgerufen werden:

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

DarĂŒber hinaus ermöglicht das Umschalten von logischen (SCOM) Prozessen, die mit dem Stream verbunden sind, nahezu unabhĂ€ngige Anwendungsumgebungen im Hinblick auf den Informationsraum, die innerhalb eines einzigen Streams ausgefĂŒhrt werden. So funktioniert unser schlanker Client, der mit einer Dateidatenbank arbeitet – innerhalb eines Prozesses des Betriebssystems gibt es zwei SCOM-Prozesse, einer ist mit dem Client verbunden, der andere mit dem Server. Dieser Ansatz ermöglicht die Vereinheitlichung des Codes, der sowohl mit der lokalen Dateidatenbank als auch in der "echten" Client-Server-Variante funktioniert. Der Preis fĂŒr diese Einheitlichkeit sind zusĂ€tzliche Kosten, aber die Praxis zeigt, dass sie gerechtfertigt sind.

Auf der Grundlage des Komponentenmodells SCOM sind sowohl die GeschÀftslogik als auch der BenutzeroberflÀchenbereich von 1C:Unternehmen umgesetzt.

BenutzeroberflÀche

Übrigens, was die Schnittstellen angeht. Wir verwenden keine Standardsteuerelemente von Windows; unsere Steuerelemente sind direkt auf der Windows-API implementiert. FĂŒr die Linux-Version wurde eine Schicht entwickelt, die ĂŒber die Bibliothek wxWidgets funktioniert.
Die Steuerungselementbibliothek ist unabhÀngig von anderen Teilen von "1C:Unternehmen" und wird von uns auch in mehreren kleinen internen Dienstprogrammen verwendet.

Im Laufe der Entwicklung von 1C:Unternehmen hat sich das Aussehen der Steuerelemente verĂ€ndert, aber eine wesentliche Änderung der Prinzipien gab es nur einmal, im Jahr 2009, mit der Veröffentlichung von Version 8.2 und der EinfĂŒhrung "verwalteter Formen". Neben dem geĂ€nderten Aussehen hat sich das Grundprinzip der Formsetzung grundlegend geĂ€ndert – es gab einen Verzicht auf die pixelgenaue Positionierung der Elemente zugunsten einer Flow-Anordnung. DarĂŒber hinaus arbeiten in diesem neuen Modell die Steuerelemente nicht direkt mit DomĂ€nenobjekten, sondern mit speziellen DTO (Data Transfer Objects).
Diese Änderungen ermöglichten die Erstellung eines Web-Clients fĂŒr "1C:Unternehmen", der die C++-Logik der Steuerelemente in JavaScript nachahmt. Wir bemĂŒhen uns, die funktionale Äquivalenz zwischen dem schlanken Client und dem Web-Client aufrechtzuerhalten. Wenn dies aufgrund von EinschrĂ€nkungen des ĂŒber JavaScript-API verfĂŒgbaren Zugriffs (zum Beispiel sind die Möglichkeiten zur Arbeit mit Dateien sehr eingeschrĂ€nkt) nicht möglich ist, implementieren wir oft die notwendige FunktionalitĂ€t mithilfe von Browsererweiterungen, die in C++ geschrieben sind. Derzeit unterstĂŒtzen wir Internet Explorer und Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows und Linux) und Safari (MacOS).

DarĂŒber hinaus wird die Technologie der gesteuerten Formate zur Erstellung von BenutzeroberflĂ€chen fĂŒr mobile Anwendungen auf der 1C-Plattform verwendet. Auf mobilen GerĂ€ten erfolgt die Zeichnung der Steuerelemente mit „nativ“ fĂŒr das Betriebssystem verwendeten Technologien, jedoch wird der gleiche Code, der auch auf der „großen“ Plattform „1C:Unternehmen“ verwendet wird, fĂŒr die Logik der Formanordnung und die Reaktion der BenutzeroberflĂ€che genutzt.

Die Plattform „1C:Enterprise“ – was steckt dahinter?
1C-Schnittstelle unter Linux

Die Plattform „1C:Enterprise“ – was steckt dahinter?
1C-Schnittstelle auf einem mobilen GerÀt

1C-Schnittstelle auf anderen Plattformen Die Plattform „1C:Enterprise“ – was steckt dahinter?
1C-Schnittstelle unter Windows

Die Plattform „1C:Enterprise“ – was steckt dahinter?
1C-Schnittstelle – Web-Client

Open Source

Obwohl wir keine fĂŒr C++-Entwickler typischen Bibliotheken unter Windows (MFC, Steuerelemente aus WinAPI) verwenden, schreiben wir nicht alle Komponenten selbst. Die Bibliothek wurde bereits erwĂ€hnt wxWidgets, und wir verwenden auch:

  • cURL fĂŒr die Arbeit mit HTTP und FTP.
  • OpenSSL fĂŒr die Arbeit mit Kryptographie und die Einrichtung von TLS-Verbindungen
  • libxml2 und libxslt fĂŒr das Parsen von XML
  • libetpan fĂŒr die Arbeit mit E-Mail-Protokollen (POP3, SMTP, IMAP)
  • mimetic fĂŒr das Parsen von E-Mail-Nachrichten
  • sqllite fĂŒr die Speicherung von Benutzerprotokollen
  • ICU fĂŒr die Internationalisierung

Die Liste kann weiterhin fortgesetzt werden.
DarĂŒber hinaus verwenden wir stark modifizierte Versionen von Google Test und Google Mock bei der Entwicklung von Unit-Tests.
Die Bibliotheken mussten angepasst werden, um mit der SCOM-Modellorganisation der Komponenten kompatibel zu sein.
Die Verbreitung von 1C macht die Plattform zu einem großartigen Test fĂŒr die darin verwendeten Bibliotheken. Die Vielfalt der Benutzer und Szenarien bringt Fehler schnell ans Licht, selbst in den am wenigsten genutzten Codeabschnitten. Wir beheben sie bei uns und versuchen, sie den Bibliotheksautoren zurĂŒckzugeben. Die Erfahrungen sind sehr unterschiedlich.
Entwickler cURL und libetpan respondieren schnell auf Pull-Requests, aber den Patch zum Beispiel in OpenSSL konnten wir nicht zurĂŒckgeben.

Fazit

In dem Artikel haben wir einige grundlegende Aspekte der Entwicklung der Plattform „1C: Unternehmen“ angesprochen. Im Rahmen des Artikels haben wir nur einige interessante, unserer Meinung nach, Aspekte angesprochen.
Eine allgemeine Beschreibung der verschiedenen Mechanismen der Plattform kann angesehen werden hier.
Welche Themen wĂ€ren fĂŒr Sie in den nĂ€chsten Artikeln interessant?

Wie ist die mobile Plattform 1C implementiert?
Beschreibung der internen Struktur des Web-Clients?
Oder interessiert Sie vielleicht der Prozess der Auswahl von Funktionen fĂŒr neue Releases, Entwicklung und Tests?

Hinterlassen Sie Ihre Kommentare!

Quelle: habr.com

ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server đŸ”„ ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster