Plattform "1C: Enterprise" - wat ass ënnert der Hood?

Hey Habr!
An dësem Artikel fänken mir d'Geschicht un wéi et dobannen funktionnéiert Plattform "1C:Enterprise 8" a wéi eng Technologien a senger Entwécklung benotzt ginn.

Plattform "1C: Enterprise" - wat ass ënnert der Hood?

Firwat mengen mir dat interessant ass? Éischtens, well d'1C: Enterprise 8 Plattform ass eng grouss (méi wéi 10 Millioune Zeilen Code) Applikatioun am C ++ (Client, Server, etc.), JavaScript (Web Client), an, viru kuerzem, An Java. Grouss Projete kënnen op d'mannst wéinst hirer Skala interessant sinn, well Themen déi an enger klenger Codebasis onsichtbar sinn an esou Projeten a voller Kraaft entstoen. Zweetens, "1C: Enterprise" ass e replizéiert, "boxed" Produkt, an et gi ganz wéineg Artikelen iwwer esou Entwécklungen op Habré. Et ass och ëmmer interessant ze wëssen wéi d'Liewen an aneren Teams a Firmen ass.

Also loosst eis ufänken. An dësem Artikel wäerte mir en Iwwerbléck iwwer e puer vun den Technologien ginn, déi an der Plattform benotzt ginn an d'Landschaft skizzéieren, ouni déif an d'Ëmsetzung ze tauchen. Tatsächlech, fir vill Mechanismen, brauch eng detailléiert Geschicht en separaten Artikel, a fir e puer, e ganzt Buch!
Fir unzefänken ass et derwäert iwwer d'Basis Saachen ze entscheeden - wat d'1C:Enterprise Plattform ass a wéi eng Komponenten et besteet. D'Äntwert op dës Fro ass net sou einfach, well de Begrëff "Plattform" (fir Kuerzegkeet wäerte mir et esou nennen) bezitt sech op e Mëttel fir Geschäftsapplikatiounen z'entwéckelen, e Runtime Ëmfeld an Administratiounsinstrumenter. Déi folgend Komponente kënnen ongeféier ënnerscheeden:

  • Server Cluster
  • "dënnen" Client fäeg fir mam Server iwwer http a säin eegene binäre Protokoll ze verbannen
  • Client fir an enger Zwee-Tierarchitektur ze schaffen mat enger Datebank op enger Festplack oder Netzwierkverwaltung
  • Web Client
  • Applikatioun Server Administratioun Tools
  • Entwécklungsëmfeld (bekannt als Configurator)
  • Runtime Ëmfeld fir iOS, Android a Windows Phone (mobil Plattform 1C)

All dës Deeler, mat Ausnam vum Web Client, sinn an C ++ geschriwwen. Zousätzlech gëtt et déi kierzlech ugekënnegt Nei Generatioun Konfigurator, op Java geschriwwen.

Native Apps

C ++ 03 gëtt benotzt fir gebierteg Uwendungen z'entwéckelen. Fir Windows gëtt Microsoft Visual C++ 12 (e Profil kompatibel mat Windows XP) als Compiler benotzt, a fir Linux an Android - gcc 4.8, fir iOS - clang 5.0. D'Standardbibliothéik benotzt ass d'selwecht fir all Betribssystemer a Compileren - STLPort. Dës Léisung reduzéiert d'Wahrscheinlechkeet vun STL Implementatioun-spezifesch Feeler. Mir plangen de Moment op d'STL Implementatioun ze migréieren, déi mat CLang verschéckt gëtt, well STLPort gestoppt gouf an inkompatibel ass mam gcc's C++11 aktivéierte Modus.
D'Codebasis vum Server ass 99% heefeg, dem Client - 95%. Ausserdeem benotzt och déi mobil Plattform dee selwechte C ++ Code wéi de "grousse", obwuel de Prozentsaz vun der Unifikatioun do e bësse méi niddereg ass.
Wéi déi meescht C++ Benotzer, behaapte mir net 100% vun de Fäegkeeten vun der Sprooch a senge Bibliothéiken ze benotzen. Also, mir benotze praktesch kee Boost, an eng vun de Sproochefeatures ass dynamesch Typ Casting. Zur selwechter Zäit benotze mir aktiv:

  • STL (speziell Strings, Container an Algorithmen)
  • Multiple Ierfschaft, inkl. Multiple Implementatioun Ierfschaft
  • Skeletter
  • Ausnamen
  • Smart Pointer (personaliséiert Ëmsetzung)

Andeems Dir Multiple Ierfschaft vun Interfaces benotzt (komplett abstrakt Klassen), gëtt e Komponentmodell méiglech, deen hei drënner diskutéiert gëtt.

Komponenten

Fir d'Modularitéit ze garantéieren, gëtt all Funktionalitéit a Komponenten opgedeelt, déi dynamesch Bibliothéike sinn (*.dll fir Windows, *.so fir Linux). Et gi méi wéi honnert a fofzeg Komponenten am Ganzen; hei sinn d'Beschreiwunge vun e puer vun hinnen:

Backend
Enthält de Plattform Metadatenmotor

accnt
Objekter déi Applikatioun Entwéckler benotze fir Comptabilitéitsrecords ze bauen (Charts vu Konten a Comptabilitéitsregistre)

bsl
Embedded Sproochausféierungsmotor

Nuke
Benotzerdefinéiert Ëmsetzung vun Erënnerung allocator

dbng 8
Datei Datebank Engine. Eng einfach Dateiserver Datebankmotor baséiert op ISAM, deen och en einfachen SQL Prozessor enthält

wbase
Enthält d'Basisklassen a Funktiounen fir d'Ëmsetzung vun der Windows User Interface - Fënsterklassen, GDI Zougang, etc.

Divisioun a verschidde Komponenten ass nëtzlech aus verschiddene Siicht:

  • Trennung fördert e besseren Design, besonnesch besser Code Isolatioun
  • Vun engem Set vu Komponenten kënnt Dir flexibel verschidde Liwweroptiounen zesummestellen:
    • Zum Beispill wäert eng dënn Client Installatioun wbase enthalen, awer kee Backend hunn
    • mee op der wbase Server, am Géigendeel, et wäert net sinn
    • souwuel Optiounen wäert natierlech enthalen nuke an bsl

All Komponente fir dës Startoptioun erfuerderlech sinn gelueden wann de Programm ufänkt. Dëst ass besonnesch noutwendeg fir SCOM Klassen z'registréieren, déi hei ënnen diskutéiert ginn.

SCOM

Fir Zersetzung op engem nidderegen Niveau gëtt de SCOM System benotzt, eng Bibliothéik ähnlech an der Ideologie wéi ATL. Fir déi, déi net mat ATL geschafft hunn, lëschte mir kuerz d'Haaptfäegkeeten a Funktiounen.
Fir eng speziell entworf SCOM Klass:

  • Bitt Fabrécksmethoden déi Iech erlaben eng Klass vun enger anerer Komponent ze kreéieren déi nëmmen säin Numm kennt (ouni d'Ëmsetzung ze weisen)
  • Bitt eng Referenz-zielen Smart Pointer Infrastruktur. SCOM Klass Liewensdauer muss net manuell iwwerwaacht ginn
  • Erlaabt Iech erauszefannen ob en Objet e spezifeschen Interface implementéiert an automatesch e Pointer op den Objet an e Pointer op den Interface konvertéieren
  • Erstellt e Serviceobjekt deen ëmmer zougänglech ass duerch d'get_service Method, etc.

Zum Beispill kënnt Dir eng Klass beschreiwen fir JSON ze liesen (zum Beispill JSONStreamReader) an der json.dll Komponent.
Klassen an Instanzen kënnen aus anere Komponenten erstallt ginn; Si mussen an der SCOM Maschinn registréiert ginn:

SCOM_CLASS_ENTRY(JSONStreamReader)

Dëse Makro wäert eng speziell statesch Recorder Klass beschreiwen, de Konstruktor vun deem genannt gëtt wann de Komponent an d'Erënnerung gelueden ass.
Duerno kënnt Dir eng Instanz dovun an engem anere Komponent erstellen:

IJSONStreamReaderPtr jsonReader = create_instance<IJSONStreamReader>(SCOM_CLSIDOF(JSONStreamReader));

Fir Servicer z'ënnerstëtzen, bitt SCOM eng zousätzlech, zimlech komplex Infrastruktur. Zentral dovun ass d'Konzept vun engem SCOM Prozess, deen als Container déngt fir Servicer ze lafen (dh spillt d'Roll vum Service Locator), an enthält och eng Bindung zu lokaliséierte Ressourcen. De SCOM-Prozess ass mam OS Thread gebonnen. Dank dësem, bannent der Applikatioun kënnt Dir Servicer wéi dës kréien:

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

Ausserdeem, andeems Dir logesch (SCOM) Prozesser verbonne mat engem Fuedem wiesselt, kënnt Dir Uwendungen kréien déi praktesch onofhängeg sinn aus der Siicht vum Informatiounsraum, déi am selwechte Fuedem lafen. Dëst ass wéi eisen dënnen Client mat enger Dateidatenbank funktionnéiert - an engem OS Prozess ginn et zwee SCOM Prozesser, een ass mam Client assoziéiert an deen zweete mam Server. Dës Approche erlaabt eis d'Schreiwen vum Code ze vereenegen, deen souwuel op der lokaler Dateidatenbank an an der "richter" Client-Server Versioun funktionnéiert. De Präis fir esou Uniformitéit ass iwwerhead, awer d'Praxis weist datt et derwäert ass.

Baséierend op dem SCOM Komponent Modell, souwuel d'Geschäftslogik wéi och den Interface Deel vun 1C: Enterprise sinn ëmgesat.

Benotzer Interface

Iwwregens, iwwer Schnëttplazen. Mir benotzen keng Standard Windows Kontrollen; eis Kontrollen ginn direkt op der Windows API implementéiert. Fir d'Linux Versioun ass eng Schicht gemaach ginn déi duerch d'wxWidgets Bibliothéik funktionnéiert.
D'Bibliothéik vu Kontrollen hänkt net vun aneren Deeler vun 1C:Enterprise of a gëtt vun eis a verschiddenen anere klengen internen Utilities benotzt.

Iwwer d'Jore vun der Entwécklung vun 1C:Enterprise huet d'Erscheinung vu Kontrollen geännert, awer e seriöse Ännerung vun de Prinzipien ass nëmmen eemol geschitt, am Joer 2009, mat der Verëffentlechung vun der Versioun 8.2 an dem Advent vun "verwalte Formen". Zousätzlech fir d'Erscheinung z'änneren, huet de Prinzip vum Formlayout grondsätzlech geännert - et war eng Oflehnung vun der Pixel-fir-Pixel Positionéierung vun Elementer zugonschte vun der Flow-Layout vun Elementer. Zousätzlech, am neie Modell funktionnéieren d'Kontrollen net direkt mat Domainobjekter, mee mat speziellen DTOs (Daten Transfert Objete).
Dës Ännerungen hunn et méiglech gemaach en 1C: Enterprise Web Client ze kreéieren deen d'C++ Logik vu JavaScript Kontrollen replizéiert. Mir probéieren eng funktionell Äquivalenz tëscht dënnen a Web Clienten ze halen. A Fäll wou dëst net méiglech ass, zum Beispill wéinst Aschränkungen vun der verfügbaren JavaScript API (zum Beispill d'Fäegkeet fir mat Dateien ze schaffen ass ganz limitéiert), implementéiere mir dacks déi néideg Funktionalitéit mat Browserextensiounen, déi an C++ geschriwwe sinn. Mir ënnerstëtzen de Moment Internet Explorer a Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows a Linux) a Safari (MacOS).

Zousätzlech gëtt verwaltet Formen Technologie benotzt fir en Interface fir mobil Uwendungen op der 1C Plattform ze kreéieren. Op mobilen Apparater gëtt d'Rendering vu Kontrollen ëmgesat mat Technologien gebierteg vum Betribssystem, awer fir d'Form Layoutlogik an d'Interface Äntwert gëtt dee selwechte Code benotzt wéi an der "grouss" 1C:Enterprise Plattform.

Plattform "1C: Enterprise" - wat ass ënnert der Hood?
1C Interface op Linux OS

Plattform "1C: Enterprise" - wat ass ënnert der Hood?
1C Interface op engem mobilen Apparat

1C Interface op aner Plattformen Plattform "1C: Enterprise" - wat ass ënnert der Hood?
1C Interface op Windows OS

Plattform "1C: Enterprise" - wat ass ënnert der Hood?
Interface 1C - Web Client

Open Source

Obwuel mir net Standard Bibliothéiken fir C ++ Entwéckler ënner Windows benotzen (MFC, Kontrollen vun WinAPI), mir schreiwen net all Komponente selwer. D'Bibliothéik gouf schonn ernimmt wxWidgets, a mir benotzen och:

  • esouvill fir mat HTTP an FTP ze schaffen.
  • OpenSSL fir mat Kryptografie ze schaffen an TLS Verbindungen opzebauen
  • libxml2 an libxslt fir XML Parsing
  • libetpan fir mat Mailprotokollen ze schaffen (POP3, SMTP, IMAP)
  • mimesch fir E-Mail Messagen ze analyséieren
  • sqllite fir Benotzer Logbicher ze späicheren
  • ICU fir Internationaliséierung

D'Lëscht geet weider.
Zousätzlech benotze mir eng héich modifizéiert Versioun Google Test и Google Mock bei der Entwécklung vun Eenheetstester.
D'Bibliothéiken erfuerderen Upassung fir kompatibel mat dem SCOM Komponentorganisatiounsmodell ze sinn.
D'Prévalenz vun 1C mécht d'Plattform en exzellente Kraafttest fir d'Bibliothéiken, déi an der benotzt ginn. Eng Vielfalt vu Benotzer an Szenarie verroden séier Feeler an och an de meescht selten benotzte Codeberäicher. Mir korrigéiere se selwer a probéieren se un d'Bibliothéiksautoren zeréck ze ginn. D'Erfahrung vun der Interaktioun stellt sech ganz anescht aus.
Entwéckler esouvill и libetpan reagéiert séier op Pull-Ufroen, awer de Patch, zum Beispill, an OpenSSL Mir hunn et ni fäerdeg bruecht et zréck ze ginn.

Konklusioun

Am Artikel hu mir e puer Haaptaspekter vun der Entwécklung vun der 1C: Enterprise Plattform beréiert. Am limitéierten Ëmfang vum Artikel hu mir nëmmen e puer interessant, eiser Meenung no, Aspekter beréiert.
Eng allgemeng Beschreiwung vun de verschiddene Plattform Mechanismen kann fonnt ginn hei.
Wéi eng Themen interesséieren Iech an zukünfteg Artikelen?

Wéi gëtt d'1C mobil Plattform ëmgesat?
Beschreiwung vun der interner Struktur vum Web Client?
Oder vläicht sidd Dir interesséiert am Prozess fir Features fir nei Verëffentlechungen ze wielen, z'entwéckelen an ze testen?

Schreift an de Kommentaren!

Source: will.com

Setzt e Commentaire