Hallo, Habra!
In diesem Artikel beginnen wir mit der Beschreibung, wie die Plattform aufgebaut ist und welche Technologien bei ihrer Entwicklung verwendet werden.

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 . 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 , 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 ().
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.

1C-Schnittstelle unter Linux

1C-Schnittstelle auf einem mobilen GerÀt
1C-Schnittstelle auf anderen Plattformen 
1C-Schnittstelle unter Windows

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 , und wir verwenden auch:
- fĂŒr die Arbeit mit HTTP und FTP.
- fĂŒr die Arbeit mit Kryptographie und die Einrichtung von TLS-Verbindungen
- fĂŒr das Parsen von XML
- fĂŒr die Arbeit mit E-Mail-Protokollen (POP3, SMTP, IMAP)
- fĂŒr das Parsen von E-Mail-Nachrichten
- fĂŒr die Speicherung von Benutzerprotokollen
- fĂŒr die Internationalisierung
Die Liste kann weiterhin fortgesetzt werden.
DarĂŒber hinaus verwenden wir stark modifizierte Versionen von und 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 und respondieren schnell auf Pull-Requests, aber den Patch zum Beispiel in 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 .
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
