Platfoarm "1C: Enterprise" - wat is ûnder de motorkap?

Hoi Habr!
Yn dit artikel sille wy it ferhaal begjinne oer hoe't it binnen wurket platfoarm "1C: Enterprise 8" en hokker technologyen wurde brûkt yn syn ûntwikkeling.

Platfoarm "1C: Enterprise" - wat is ûnder de motorkap?

Wêrom tinke wy dat dit ynteressant is? As earste, om't it 1C: Enterprise 8-platfoarm in grutte (mear as 10 miljoen rigels koade) applikaasje is yn C ++ (kliïnt, tsjinner, ensfh.), JavaScript (webkliïnt), en, mear resint, En Java. Grutte projekten kinne op syn minst fanwege har skaal ynteressant wêze, om't problemen dy't yn in lytse koadebasis ûnsichtber binne yn sokke projekten yn folle krêft ûntsteane. Twads, "1C: Enterprise" is in replicable, "boxed" produkt, en der binne hiel pear artikels oer sokke ûntwikkelingen op Habré. It is ek altyd nijsgjirrich om te witten hoe't it libben is yn oare teams en bedriuwen.

Dus litte wy begjinne. Yn dit artikel sille wy in oersjoch jaan fan guon fan 'e technologyen dy't wurde brûkt yn it platfoarm en it lânskip sketse, sûnder djip yn' e ymplemintaasje te dûken. Yndie, foar in protte meganismen soe in detaillearre ferhaal in apart artikel fereaskje, en foar guon, in hiel boek!
Om te begjinnen, is it de muoite wurdich om te besluten oer de basis dingen - wat it 1C: Enterprise platfoarm is en hokker komponinten it bestiet út. It antwurd op dizze fraach is net sa ienfâldich, om't de term "Platform" (foar koarteheid, sille wy it sa neame) ferwiist nei in middel foar it ûntwikkeljen fan saaklike applikaasjes, in runtime-omjouwing en administraasje-ark. De folgjende komponinten kinne rûchwei ûnderskieden wurde:

  • tsjinner kluster
  • "tinne" client by steat om te ferbinen mei de tsjinner fia http en syn eigen binêre protokol
  • client foar wurkjen yn in twa-tier arsjitektuer mei in database leit op in hurde skiif of netwurk map
  • web client
  • applikaasje tsjinner administraasje ark
  • ûntwikkelingsomjouwing (bekend as Configurator)
  • runtime-omjouwing foar iOS, Android en Windows Phone (mobyl platfoarm 1C)

Al dizze dielen, mei útsûndering fan 'e webklient, binne skreaun yn C ++. Dêrneist is der de koartlyn oankundige Nije generaasje konfigurator, skreaun yn Java.

Native apps

C ++ 03 wurdt brûkt om native applikaasjes te ûntwikkeljen. Foar Windows wurdt Microsoft Visual C++ 12 (in profyl kompatibel mei Windows XP) brûkt as kompiler, en foar Linux en Android - gcc 4.8, foar iOS - clang 5.0. De standert bibleteek brûkt is itselde foar alle bestjoeringssystemen en gearstallers - STLPort. Dizze oplossing ferleget de kâns op STL ymplemintaasje-spesifike flaters. Wy binne op it stuit fan plan om te migrearjen nei de STL-ymplemintaasje dy't ferstjoerd wurdt mei CLang, om't STLPort is staakt en ynkompatibel is mei gcc's C++11-ynskeakele modus.
De koadebasis fan de tsjinner is 99% gewoan, de kliïnt - 95%. Boppedat, sels de mobile platfoarm brûkt deselde C ++ koade as de "grutte", hoewol't it persintaazje fan ienwurding dêr is wat leger.
Lykas de measte C++-brûkers, beweare wy net dat wy 100% fan 'e mooglikheden fan 'e taal en har bibleteken brûke. Dat, wy brûke Boost praktysk net, en ien fan 'e taalfunksjes is dynamyske type casting. Tagelyk brûke wy aktyf:

  • STL (spesifyk snaren, konteners en algoritmen)
  • meardere erfenis, ynkl. meardere ymplemintaasje erfskip
  • templates
  • útsûnderingen
  • smart pointers (oanpaste ymplemintaasje)

Troch it brûken fan meardere erfskip fan ynterfaces (folslein abstrakte klassen), wurdt in komponint model mooglik, dat sil wurde besprutsen hjirûnder.

Komponinten

Om modulariteit te garandearjen, is alle funksjonaliteit ferdield yn komponinten, dy't dynamyske biblioteken binne (*.dll foar Windows, *.so foar Linux). D'r binne yn totaal mear as hûndertfyftich komponinten; hjir binne beskriuwingen fan guon fan har:

backend
Befettet de platfoarmmetadatamotor

acnt
Objekten dy't applikaasje-ûntwikkelders brûke om boekhâldingsregisters te bouwen (rekkenkaarten en boekhâldingsregisters)

bsl
Ynbêde taalútfiermotor

nuke
Oanpaste ymplemintaasje fan ûnthâld allocator

dbn8
Bestânsdatabasemotor. In ienfâldige triemserverdatabasemotor basearre op ISAM, dy't ek in ienfâldige SQL-prosessor omfettet

wbase
Befettet de basisklassen en funksjes foar it ymplementearjen fan de Windows-brûkersynterface - finsterklassen, GDI-tagong, ensfh.

Ferdieling yn meardere komponinten is nuttich út ferskate stânpunten:

  • Skieding befoarderet better ûntwerp, benammen bettere koade-isolaasje
  • Ut in set fan komponinten kinne jo fleksibel ferskate leveringsopsjes gearstalle:
    • Bygelyks, in tinne client ynstallaasje sil befetsje wbase, mar sil gjin backend
    • mar op 'e wbase-tsjinner, krekt oarsom, it sil net wêze
    • beide opsjes sille fansels befetsje nuke en bsl

Alle komponinten dy't nedich binne foar dizze startopsje wurde laden as it programma begjint. Dit is benammen nedich foar it registrearjen fan SCOM-klassen, dy't hjirûnder sille wurde besprutsen.

SCOM

Foar ûntbining op in leger nivo wurdt it SCOM-systeem brûkt, in bibleteek dy't yn ideology ferlykber is mei ATL. Foar dyjingen dy't net wurke hawwe mei ATL, listje wy koart de wichtichste mooglikheden en funksjes.
Foar in spesjaal ûntwurpen SCOM-klasse:

  • Biedt fabryksmetoaden wêrmei jo in klasse kinne meitsje fan in oare komponint, allinich de namme te witten (sûnder de ymplemintaasje te iepenbierjen)
  • Biedt in referinsje-telt smart pointer ynfrastruktuer. SCOM-klasselibben hoecht net mei de hân te wurde kontrolearre
  • Stelt jo yn steat om út te finen oft in objekt in spesifike ynterface ymplemintearret en automatysk in oanwizer nei it foarwerp konvertearje nei in oanwizer nei de ynterface
  • Meitsje in tsjinstobjekt dat altyd tagonklik is fia de get_service metoade, ensfh.

Jo kinne bygelyks in klasse beskriuwe foar it lêzen fan JSON (bygelyks JSONStreamReader) yn 'e json.dll-komponint.
Klassen en eksimplaren kinne wurde makke fan oare komponinten; se moatte wurde registrearre yn 'e SCOM-masine:

SCOM_CLASS_ENTRY(JSONStreamReader)

Dizze makro sil beskriuwe in spesjale statyske recorder klasse, de constructor fan dat wurdt neamd as de komponint wurdt laden yn it ûnthâld.
Hjirnei kinne jo in eksimplaar fan meitsje yn in oare komponint:

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

Om tsjinsten te stypjen biedt SCOM in ekstra, frij komplekse ynfrastruktuer. Sintraal dêryn stiet it konsept fan in SCOM-proses, dat tsjinnet as in kontener foar it útfieren fan tsjinsten (dat wol sizze, spilet de rol fan Service Locator), en befettet ek in bining oan lokale boarnen. It SCOM-proses is bûn oan 'e OS-thread. Hjirmei kinne jo binnen de applikaasje tsjinsten krije lykas dit:

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

Boppedat kinne jo, troch logyske (SCOM) prosessen te wikseljen ferbûn oan in thread, applikaasjes krije dy't praktysk ûnôfhinklik binne fanút it eachpunt fan 'e ynformaasjeromte, rinne binnen deselde thread. Dit is hoe't ús tinne client wurket mei in triemdatabase - binnen ien OS-proses binne d'r twa SCOM-prosessen, ien assosjearre mei de klant, en de twadde mei de tsjinner. Dizze oanpak lit ús it skriuwen fan koade ferienigje dy't sawol sil wurkje op 'e lokale triemdatabase as yn' e "echte" client-tsjinner ferzje. De priis foar sa'n uniformiteit is overhead, mar de praktyk lit sjen dat it it wurdich is.

Op grûn fan it SCOM-komponintmodel wurde sawol de saaklike logika as it ynterfacediel fan 1C: Enterprise ymplementearre.

Brûkersynterface

Trouwens, oer ynterfaces. Wy brûke gjin standert Windows-kontrôles; ús kontrôles wurde direkt ymplementearre op 'e Windows API. Foar de Linux-ferzje is in laach makke dy't wurket fia de wxWidgets-bibleteek.
De bibleteek fan kontrôles is net ôfhinklik fan oare dielen fan 1C: Enterprise en wurdt brûkt troch ús yn ferskate oare lytse ynterne nutsbedriuwen.

Yn 'e rin fan' e jierren fan ûntwikkeling fan 1C: Enterprise is it uterlik fan kontrôles feroare, mar in serieuze feroaring yn prinsipes barde mar ien kear, yn 2009, mei de frijlitting fan ferzje 8.2 en de komst fan "beheare foarmen". Neist it feroarjen fan it uterlik is it prinsipe fan foarmyndieling fûneminteel feroare - d'r is in ôfwizing west fan pixel-by-pixel-posisjonearring fan eleminten yn it foardiel fan flow-layout fan eleminten. Derneist wurkje yn it nije model kontrôles net direkt mei domeinobjekten, mar mei spesjale DTO's (Data Transfer Objekten).
Dizze wizigingen makken it mooglik om in 1C: Enterprise-webklient te meitsjen dy't de C ++-logika fan JavaScript-kontrôles replikearret. Wy besykje funksjonele lykweardigens te behâlden tusken tinne en webkliïnten. Yn gefallen dêr't dit net mooglik is, bygelyks troch beheiningen fan de beskikbere JavaSkript API (bygelyks, de mooglikheid om te wurkjen mei triemmen is tige beheind), wy faak útfiere de nedige funksjonaliteit mei help fan browser tafoegings skreaun yn C++. Wy stypje op it stuit Internet Explorer en Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows en Linux) en Safari (MacOS).

Derneist wurdt technology foar beheare formulieren brûkt om in ynterface te meitsjen foar mobile applikaasjes op it 1C-platfoarm. Op mobile apparaten wurdt de werjefte fan kontrôles ymplementearre mei technologyen dy't lânseigen binne op it bestjoeringssysteem, mar foar de foarmjouwing logika en ynterface-antwurd wurdt deselde koade brûkt as yn it "grutte" 1C: Enterprise platfoarm.

Platfoarm "1C: Enterprise" - wat is ûnder de motorkap?
1C ynterface op Linux OS

Platfoarm "1C: Enterprise" - wat is ûnder de motorkap?
1C ynterface op in mobyl apparaat

1C ynterface op oare platfoarms Platfoarm "1C: Enterprise" - wat is ûnder de motorkap?
1C ynterface op Windows OS

Platfoarm "1C: Enterprise" - wat is ûnder de motorkap?
Ynterface 1C - web client

Iepen Boarne

Hoewol wy gjin standertbiblioteken brûke foar C++-ûntwikkelders ûnder Windows (MFC, kontrôles fan WinAPI), skriuwe wy net alle komponinten sels. De biblioteek is al neamd wxWidgets, en wy brûke ek:

  • cURL foar wurkjen mei HTTP en FTP.
  • OpenSSL foar wurkjen mei kryptografy en it oprjochtsjen fan TLS-ferbiningen
  • libxml2 en libxslt foar XML-parsing
  • libetpan foar wurkjen mei e-postprotokollen (POP3, SMTP, IMAP)
  • mimetysk om e-postberjochten te parsearjen
  • sqllite foar it bewarjen fan brûkerslogboeken
  • ICU foar ynternasjonalisearring

De list giet troch.
Derneist brûke wy in heul wizige ferzje Google Test и Google Mock by it ûntwikkeljen fan ienheidstests.
De biblioteken hawwe oanpassing nedich om kompatibel te wêzen mei it organisaasjemodel fan SCOM-komponint.
De prevalens fan 1C makket it platfoarm in poerbêste test fan sterkte foar de biblioteken dy't dêryn brûkt wurde. In ferskaat oan brûkers en senario's ûntbleatet fluch flaters yn sels de meast selden brûkte gebieten fan koade. Wy korrigearje se sels en besykje se werom te jaan oan de biblioteekskriuwers. De ûnderfining fan ynteraksje blykt hiel oars te wêzen.
Developers cURL и libetpan reagearje fluch op pull-fersiken, mar de patch, bygelyks, yn OpenSSL Wy hawwe noait slagge om it werom te jaan.

konklúzje

Yn it artikel hawwe wy ferskate haadaspekten oanrekke fan 'e ûntwikkeling fan it 1C: Enterprise-platfoarm. Yn 'e beheinde omfang fan it artikel hawwe wy allinich wat nijsgjirrige, nei ús miening, aspekten oanrekke.
In algemiene beskriuwing fan 'e ferskate platfoarmmeganismen kin fûn wurde hjir.
Hokker ûnderwerpen soene jo ynteressearje yn takomstige artikels?

Hoe wurdt it 1C mobile platfoarm ymplementearre?
Beskriuwing fan de ynterne struktuer fan de web client?
Of miskien binne jo ynteressearre yn it proses fan it selektearjen fan funksjes foar nije releases, ûntwikkeljen en testen?

Skriuw yn 'e kommentaren!

Boarne: www.habr.com

Add a comment