Platforma "1C: Enterprise" - kaj je pod pokrovom?

Pozdravljeni, Habr!
V tem članku bomo začeli zgodbo o tem, kako deluje v notranjosti platforma "1C:Enterprise 8" in katere tehnologije se uporabljajo pri njegovem razvoju.

Platforma "1C: Enterprise" - kaj je pod pokrovom?

Zakaj se nam zdi to zanimivo? Prvič, ker je platforma 1C:Enterprise 8 velika (več kot 10 milijonov vrstic kode) aplikacija v C++ (odjemalec, strežnik itd.), JavaScript (spletni odjemalec) in v zadnjem času In Java. Veliki projekti so lahko zanimivi vsaj zaradi svoje obsežnosti, saj se v takšnih projektih na polno pojavijo težave, ki so v majhni kodni bazi nevidne. Drugič, »1C:Enterprise« je ponovljiv izdelek v »škatlah« in na Habréju je zelo malo člankov o takšnem razvoju. Prav tako je vedno zanimivo vedeti, kakšno je življenje v drugih ekipah in podjetjih.

Pa začnimo. V tem članku bomo podali pregled nekaterih tehnologij, ki se uporabljajo v platformi, in orisali krajino, ne da bi se poglabljali v izvedbo. Dejansko bi za številne mehanizme podrobna zgodba zahtevala ločen članek, za nekatere pa celo knjigo!
Za začetek se je vredno odločiti o osnovnih stvareh - kaj je platforma 1C:Enterprise in iz katerih komponent je sestavljena. Odgovor na to vprašanje ni tako preprost, saj se izraz "platforma" (zaradi kratkosti jo bomo tako imenovali) nanaša na sredstvo za razvoj poslovnih aplikacij, izvajalnega okolja in skrbniških orodij. V grobem lahko ločimo naslednje komponente:

  • strežniška gruča
  • “tanek” odjemalec, ki se lahko poveže s strežnikom preko http in lastnega binarnega protokola
  • odjemalec za delo v dvonivojski arhitekturi z bazo podatkov, ki se nahaja na trdem disku ali v omrežni mapi
  • spletni odjemalec
  • skrbniška orodja za aplikacijski strežnik
  • razvojno okolje (znano kot konfigurator)
  • izvajalno okolje za iOS, Android in Windows Phone (mobilna platforma 1C)

Vsi ti deli, razen spletnega odjemalca, so napisani v C++. Poleg tega je nedavno objavljeno Konfigurator nove generacije, napisano v Javi.

Izvorne aplikacije

C++03 se uporablja za razvoj izvornih aplikacij. Za Windows se kot prevajalnik uporablja Microsoft Visual C++ 12 (profil, združljiv z Windows XP), za Linux in Android - gcc 4.8, za iOS - clang 5.0. Uporabljena standardna knjižnica je enaka za vse operacijske sisteme in prevajalnike - STLPort. Ta rešitev zmanjša verjetnost napak, specifičnih za izvedbo STL. Trenutno načrtujemo selitev na implementacijo STL, ki je priložena CLang, saj je bil STLPort ukinjen in ni združljiv z načinom, ki omogoča gcc C++11.
Osnova kode strežnika je 99% skupna, odjemalca - 95%. Še več, tudi mobilna platforma uporablja isto kodo C++ kot »velika«, čeprav je tam odstotek poenotenja nekoliko nižji.
Tako kot večina uporabnikov C++ ne trdimo, da uporabljamo 100 % zmogljivosti jezika in njegovih knjižnic. Tako praktično ne uporabljamo Boosta in ena od jezikovnih funkcij je dinamično prelivanje tipov. Hkrati aktivno uporabljamo:

  • STL (zlasti nizi, vsebniki in algoritmi)
  • večkratno dedovanje, vklj. dedovanje večkratne izvedbe
  • predloge
  • izjeme
  • pametni kazalci (izvedba po meri)

Z uporabo večkratnega dedovanja vmesnikov (popolnoma abstraktnih razredov) postane možen komponentni model, o katerem bomo govorili v nadaljevanju.

Komponente

Zaradi zagotavljanja modularnosti so vse funkcionalnosti razdeljene na komponente, ki so dinamične knjižnice (*.dll za Windows, *.so za Linux). Skupaj je več kot sto petdeset komponent, tukaj so opisi nekaterih izmed njih:

backend
Vsebuje mehanizem metapodatkov platforme

accnt
Objekti, ki jih razvijalci aplikacij uporabljajo za izdelavo računovodskih evidenc (kontni načrti in računovodski registri)

bsl
Vgrajen mehanizem za izvajanje jezikov

nuke
Izvedba dodeljevalnika pomnilnika po meri

dbeng8
Mehanizem podatkovne zbirke datotek. Preprost motor baze podatkov datotečnega strežnika, ki temelji na ISAM, ki vključuje tudi preprost procesor SQL

wbase
Vsebuje osnovne razrede in funkcije za implementacijo uporabniškega vmesnika Windows - okenski razredi, GDI dostop itd.

Razdelitev na več komponent je koristna z več vidikov:

  • Ločevanje spodbuja boljše oblikovanje, zlasti boljšo izolacijo kode
  • Iz nabora komponent lahko fleksibilno sestavite različne možnosti dostave:
    • Na primer, namestitev tankega odjemalca bo vsebovala wbase, vendar ne bo imela zaledja
    • ampak na strežniku wbase, nasprotno, ne bo
    • obe možnosti bosta seveda vsebovali nuke in bsl

Vse komponente, potrebne za to možnost zagona, se naložijo ob zagonu programa. To je še posebej potrebno za registracijo razredov SCOM, o katerih bomo razpravljali spodaj.

SCOM

Za dekompozicijo na nižji ravni se uporablja sistem SCOM, knjižnica, po ideologiji podobna ATL. Za tiste, ki še niste delali z ATL, na kratko navajamo glavne zmožnosti in funkcije.
Za posebej zasnovan razred SCOM:

  • Zagotavlja tovarniške metode, ki vam omogočajo, da ustvarite razred iz druge komponente, pri čemer poznate samo njeno ime (brez razkritja izvedbe)
  • Zagotavlja infrastrukturo pametnega kazalca za štetje referenc. Življenjske dobe razreda SCOM ni treba spremljati ročno
  • Omogoča vam, da ugotovite, ali objekt implementira določen vmesnik, in samodejno pretvori kazalec na predmet v kazalec na vmesnik
  • Ustvarite storitveni objekt, ki je vedno dostopen prek metode get_service itd.

Na primer, lahko opišete razred za branje JSON (na primer JSONStreamReader) v komponenti json.dll.
Razrede in primerke je mogoče ustvariti iz drugih komponent; registrirati jih je treba v napravi SCOM:

SCOM_CLASS_ENTRY(JSONStreamReader)

Ta makro bo opisal poseben razred statičnega snemalnika, katerega konstruktor bo poklican, ko bo komponenta naložena v pomnilnik.
Po tem lahko ustvarite njegov primerek v drugi komponenti:

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

Za podporo storitvam SCOM ponuja dodatno, precej zapleteno infrastrukturo. Osrednji del tega je koncept procesa SCOM, ki služi kot vsebnik za izvajanje storitev (tj. igra vlogo lokatorja storitev), vsebuje pa tudi vezavo na lokalizirane vire. Proces SCOM je vezan na nit OS. Zahvaljujoč temu lahko znotraj aplikacije prejemate storitve, kot so:

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

Še več, s preklapljanjem logičnih (SCOM) procesov, vezanih na nit, lahko dobite aplikacije, ki so praktično neodvisne z vidika informacijskega prostora, tečejo znotraj iste niti. Tako deluje naš tanki odjemalec z bazo podatkov datotek - znotraj enega procesa OS sta dva procesa SCOM, eden je povezan z odjemalcem, drugi pa s strežnikom. Ta pristop nam omogoča poenotenje pisanja kode, ki bo delovala tako v lokalni datotečni bazi podatkov kot v »pravi« različici odjemalec-strežnik. Cena takšne enotnosti je visoka, a praksa kaže, da se splača.

Na podlagi modela komponente SCOM sta implementirana tako poslovna logika kot vmesniški del 1C: Enterprise.

Uporabniški vmesnik

Mimogrede, o vmesnikih. Ne uporabljamo standardnih kontrolnikov sistema Windows; naši nadzori so implementirani neposredno v vmesniku Windows API. Za različico Linuxa je bila izdelana plast, ki deluje prek knjižnice wxWidgets.
Knjižnica kontrolnikov ni odvisna od drugih delov 1C:Enterprise in jo uporabljamo v več drugih majhnih notranjih pripomočkih.

V letih razvoja 1C:Enterprise se je videz kontrolnikov spremenil, resna sprememba načel pa se je zgodila le enkrat, leta 2009, z izdajo različice 8.2 in pojavom "upravljanih obrazcev". Poleg spremembe videza se je načelo postavitve obrazca bistveno spremenilo - prišlo je do zavrnitve pozicioniranja elementov po pikslovih v korist pretočne postavitve elementov. Poleg tega v novem modelu kontrolniki ne delujejo neposredno z domenskimi objekti, temveč s posebnimi DTO (Objekti prenosa podatkov).
Te spremembe so omogočile ustvarjanje spletnega odjemalca 1C:Enterprise, ki posnema logiko C++ kontrolnikov JavaScript. Trudimo se vzdrževati funkcionalno enakovrednost med tankimi in spletnimi odjemalci. V primerih, ko to ni mogoče, na primer zaradi omejitev razpoložljivega JavaScript API-ja (na primer zmožnost dela z datotekami je zelo omejena), pogosto izvajamo potrebno funkcionalnost z uporabo razširitev brskalnika, napisanih v C++. Trenutno podpiramo Internet Explorer in Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows in Linux) in Safari (MacOS).

Poleg tega se tehnologija upravljanih obrazcev uporablja za ustvarjanje vmesnika za mobilne aplikacije na platformi 1C. Na mobilnih napravah se upodabljanje kontrolnikov izvaja z uporabo tehnologij, ki so izvirne iz operacijskega sistema, vendar se za logiko postavitve obrazca in odziv vmesnika uporablja ista koda kot v "veliki" platformi 1C:Enterprise.

Platforma "1C: Enterprise" - kaj je pod pokrovom?
Vmesnik 1C na OS Linux

Platforma "1C: Enterprise" - kaj je pod pokrovom?
1C vmesnik na mobilni napravi

1C vmesnik na drugih platformah Platforma "1C: Enterprise" - kaj je pod pokrovom?
1C vmesnik na Windows OS

Platforma "1C: Enterprise" - kaj je pod pokrovom?
Vmesnik 1C - spletni odjemalec

Odprtokodno

Čeprav ne uporabljamo standardnih knjižnic za razvijalce C++ pod Windows (MFC, kontrole iz WinAPI), ne pišemo vseh komponent sami. Knjižnica je bila že omenjena wxWidgets, uporabljamo pa tudi:

  • cURL za delo s HTTP in FTP.
  • OpenSSL za delo s kriptografijo in vzpostavljanje TLS povezav
  • libxml2 in libxslt za razčlenjevanje XML
  • libetpan za delo s poštnimi protokoli (POP3, SMTP, IMAP)
  • mimetično za razčlenitev e-poštnih sporočil
  • sqllite za shranjevanje uporabniških dnevnikov
  • ICU za internacionalizacijo

Seznam se nadaljuje.
Poleg tega uporabljamo zelo spremenjeno različico Google Test и Google Mock pri razvoju enotnih testov.
Knjižnice so zahtevale prilagoditev, da bi bile združljive z organizacijskim modelom komponente SCOM.
Zaradi razširjenosti 1C je platforma odličen preizkus moči za knjižnice, ki se v njej uporabljajo. Različni uporabniki in scenariji hitro razkrijejo napake tudi v najbolj redko uporabljenih delih kode. Sami jih popravljamo in jih poskušamo vrniti avtorjem knjižnice. Izkušnje interakcije se izkažejo za zelo različne.
Razvijalci cURL и libetpan se hitro odzove na zahteve po vleku, vendar popravek, na primer, v OpenSSL Nikoli nam ga ni uspelo vrniti.

Zaključek

V članku smo se dotaknili več glavnih vidikov razvoja platforme 1C: Enterprise. V omejenem obsegu članka smo se dotaknili le nekaterih po našem mnenju zanimivih vidikov.
Najdete lahko splošen opis različnih mehanizmov platforme tukaj.
Katere teme bi vas zanimale v prihodnjih člankih?

Kako je implementirana mobilna platforma 1C?
Opis notranje strukture spletnega odjemalca?
Ali pa vas morda zanima postopek izbire funkcij za nove izdaje, razvoj in testiranje?

Zapiši v komentar!

Vir: www.habr.com

Dodaj komentar