Hello, Habr!
V tem članku bomo začeli govoriti o tem, kako je znotraj in katere tehnologije se uporabljajo pri njeni razvoj.

Zakaj menimo, da je to zanimivo? Prvič, ker je platforma '1C:Podjetje 8' velika (več kot 10 milijonov vrstic kode) aplikacija v C++ (odjemalec, strežnik itd.), JavaScript (spletni odjemalec), in, od nedavnega, tudi . Veliki projekti so zanimivi že zaradi njihove velikosti, saj se vprašanja, ki ostanejo neopažena v manjših kodnih osnovah, pri takšnih projektih pojavijo v polni meri. Drugič, '1C:Podjetje' je repliciran, 'škatelni' izdelek, o takih razvoju na Habrju pa je zelo malo člankov. In vedno je zanimivo izvedeti, kako živijo v drugih ekipah in podjetjih.
Torej, začnimo. V tem članku bomo dali pregled nekaterih tehnologij, ki se uporabljajo v platformi, in orisali pokrajino, brez globokega potapljanja v realizacijo. Kajti za mnoge mehanizme bi podroben opis zahteval ločen članek, za nekatere pa celo celotno knjigo!
Najprej je treba določiti osnovne stvari - kaj je platforma '1C:Podjetje' in kateri sestavni deli jo sestavljajo. Odgovor na to vprašanje ni tako preprost, saj pod pojmom 'Platforma' (za krajšo bomo tako imenovali) razumemo tako orodje za razvoj poslovnih aplikacij, kot tudi okolje za izvajanje in sredstva za upravljanje. Novi deljivci so:
- klaster strežnikov
- 'tanki' odjemalec, sposoben povezovanja s strežnikom preko http in lastnega binarnega protokola
- odjemalec za delo v dvojnem arhitekturi s podatkovno bazo, shranjeno na trdem disku ali omrežni map
- spletni odjemalec
- sredstva za upravljanje strežnika aplikacij
- razvojno okolje (znano kot Konfigurator)
- izvedbeno okolje za iOS, Android in Windows Phone (mobilna platforma 1C)
Vse te komponente, razen spletnega odjemalca, so napisane v C++. Poleg tega je nedavno napovedano , napisan v Javi.
Nativen aplikacij
Za razvoj nativnih aplikacij se uporablja C++03. V operacijskem sistemu Windows kot prevajalnik uporabljamo Microsoft Visual C++ 12 (profil združljiv s Windows XP), pod Linuxom in Androidom pa gcc 4.8, za iOS pa clang 5.0. Standardna knjižnica, ki se uporablja, je enotna za vse operacijske sisteme in prevajalnike — STLPort. To rešitev omogoča zmanjšanje verjetnosti napak, specifičnih za implementacijo STL. Trenutno načrtujemo prehod na implementacijo STL, ki jo dobimo s CLang, ker je STLPort prenehal z razvojem in ni združljiv s podporo C++11 v gcc.
Kodna baza strežnika je pri tem skupna 99%, odjemalska pa približno 95%. Poleg tega celo mobilna platforma uporablja enako C++ kodo kot 'velika', čeprav je tam odstotek unifikacije nekoliko nižji.
Kot večina uporabnikov C++ ne trdimo, da izkoriščamo 100% zmogljivosti jezika in njegovih knjižnic. Tako praktično ne uporabljamo Boost, od zmožnosti jezika pa samo dinamično preusmerjanje tipov. Kljub temu aktivno uporabljamo:
- STL (zlasti nizi, kontejnerji in algoritmi)
- večkratno dedovanje, vključno z večkratnim dedovanjem implementacij
- predloge
- izjem
- pametni kazalci (lastna implementacija)
Z uporabo večkratnega dedovanja vmesnikov (popolnoma abstraktne razrede) je možno doseči komponentno model, o katerem bomo govorili naprej.
Komponente
Za zagotavljanje modularnosti je celotna funkcionalnost razdeljena na komponente, ki predstavljajo dinamične knjižnice (*.dll pod Windows, *.so pod Linux). Skupaj je več kot sto komponent, opisana bomo nekatere izmed njih:
backend
Vsebuje 'motor' metapodatkov platforme
accnt
Objekti, ki jih uporabniški razvijalci uporabljajo za gradnjo knjigovodstva (računovodski načrti in registri računovodstva)
bsl
Motor za izvajanje vgrajenega jezika
nuke
Lastna implementacija allocatorja pomnilnika
dbeng8
Motor za datotečno bazo. Preprosta datotečno-strežniška baza podatkov, temelječa na ISAM, ki vključuje tudi preprost SQL procesor.
wbase
Vsebuje osnovne razrede in funkcije za implementacijo uporabniškega vmesnika Windows — okenske razrede, dostop do GDI itd.
Razdelitev na več komponent je koristna z več vidikov:
- Razdelitev spodbuja boljše načrtovanje, zlasti boljšo izolacijo kode.
- Iz nabora komponentov lahko prilagodljivo sestavljate različne možnosti dobave:
- Na primer, namestitev tanke stranke bo vsebovala wbase, vendar ne bo imela backend-a
- medtem ko na strežniku wbase, nasprotno, ne bo
- oba različna primera bosta seveda vsebovala nuke in bsl
Vse potrebne komponente za to različico zagon programa se naložijo ob zagonu. To je potrebno predvsem za registracijo SCOM razredov, o katerih bomo govorili kasneje.
SCOM
Za dekompozicijo na nižji ravni se uporablja sistem SCOM — ideološko podoben ATL knjižnici. Za tiste, ki z ATL niso delali, na kratko naštejemo glavne možnosti in značilnosti.
Za posebej oblikovan razred SCOM:
- Nudi tovarniške metode, ki omogočajo ustvarjanje razreda iz druge komponente, poznavajoč le njeno ime (brez razkrivanja implementacije)
- Nudi infrastrukturo pametnih kazalcev s števcem referenc. Za čas življenja SCOM razreda ni potrebno ročno skrbeti
- Omogoča ugotavljanje, ali predmet implementira določen vmesnik, in samodejno pretvori kazalec na predmet v kazalec na vmesnik
- Ustvariti objekt-storitev, ki je vedno dostopen prek metode get_service itd.
Na primer, lahko v komponenti json.dll opišete razred za branje JSON (na primer, JSONStreamReader).
Razrede, primerke je mogoče ustvariti iz drugih komponent, potrebno je registrirati v SCOM napravi:
SCOM_CLASS_ENTRY(JSONStreamReader)
Ta makro bo opisal poseben statični razred-regenerator, katerega konstruktor bo poklican ob nalaganju komponente v pomnilnik.
Po tem lahko ustvarite njegov primer v drugi komponenti:
IJSONStreamReaderPtr jsonReader = create_instance(SCOM_CLSIDOF(JSONStreamReader));
Za podporo storitvam SCOM nudi dodatno, precej zapleteno infrastrukturo. Osrednji element je pojem SCOM procesa, ki služi kot vsebnik za zagnane storitve (tj. opravlja funkcijo Service Locator), hkrati pa vsebuje povezavo do lokaliziranih virov. SCOM proces se poveže s tok OS. Tako lahko znotraj aplikacije enostavno pridobite storitve:
SCOM_Process* process = core::current_process();
if (process)
return get_service(process);
Bolj, ko preklapljamo logične (SCOM) procese, povezane s tokom, lahko dobimo skoraj neodvisne aplikacije z vidika informacijskega prostora, ki delujejo v okviru enega toka. Tako deluje naš tanka stranka, ki deluje s podatkovno bazo — znotraj enega procesa OS sta dva SCOM-procesa, en je povezan s stranko, drugi pa s strežnikom. Tak pristop omogoča enotno pisanje kode, ki bo delovala tako na lokalni podatkovni bazi kot tudi v "pravi" različici odjemalec-strežnik. Cena za to enotnost so dodatni stroški, vendar praksa kaže, da so vredni truda.
Na podlagi komponentnega modela SCOM sta uresničena tako poslovna logika kot tudi vmesniška komponenta 1C: Podjetja.
Uporabniški vmesnik
Mimogrede, o vmesnikih. Ne uporabljamo standardnih kontrol Windows, naši elementi upravljanja so realizirani neposredno na Windows API. Za različico Linux je bila izdelana plast, ki deluje preko knjižnice wxWidgets.
Knjižnica elementov upravljanja ni odvisna od drugih delov "1C: Podjetja" in jo uporabljamo tudi v nekaj manjših notranjih orodjih.
Sčasoma se je videz kontrol 1C: Podjetja spreminjal, vendar so se pomembne spremembe načel zgodile le enkrat, leta 2009, s prihodom različice 8.2 in pojavom "upravljanih obrazcev". Poleg spremembe videza se je temeljno spremenil princip sestavljanja obrazca — prešlo se je od pozicioniranja elementov v vsakem pikselu k tokovnemu sestavljanju elementov. Poleg tega v novem modelu elementi upravljanja ne delujejo neposredno z domenami objektov, ampak s posebnimi DTO ().
Te spremembe so omogočile ustvarjanje spletnega odjemalca "1C: Podjetja", ki ponavlja C++ logiko kontrol na JavaScriptu. Trudimo se ohranjati funkcionalno ekvivalentnost med tankimi in spletnimi odjemalci. V primerih, ko to ni mogoče, na primer zaradi omejitev, dostopnih iz JavaScript API (na primer, zmožnost dela z datotekami je zelo omejena), pogosto implementiramo potrebno funkcionalnost preko razširitev brskalnikov, 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 mobilnih aplikacij na platformi 1C. Na mobilnih napravah je risanje kontrolnikov izvedeno z uporabo „nativnih“ tehnologij operacijskega sistema, vendar se za logiko sestave obrazca in odziv vmesnika uporablja enaka koda kot na veliki platformi „1C:Pred podjetje“.

Vmesnik 1C na operacijskem sistemu Linux

Vmesnik 1C na mobilni napravi
Vmesnik 1C na drugih platformah 
Vmesnik 1C na operacijskem sistemu Windows

Vmesnik 1C — spletni odjemalec
Odprtokodni
Čeprav ne uporabljamo standardnih knjižnic, značilnih za C++, za Windows (MFC, kontrole iz WinAPI), vsi sestavni deli niso napisana sami. Že smo omenili knjižnico , poleg tega pa uporabljamo:
- za delo z HTTP in FTP.
- za delo s kriptografijo in vzpostavitev TLS povezav
- za obdelavo XML
- za delo s poštnimi protokoli (POP3, SMTP, IMAP)
- za obdelavo sporočil e-pošte
- za shranjevanje dnevnikov dela uporabnikov
- za internacionalizacijo
Seznam se lahko nadaljuje.
Poleg tega uporabljamo močno prilagojeno različico in pri razvoju enotnih testov.
Knjižnice so zahtevale prilagoditev za združljivost s SCOM-modelom organizacije komponent.
Razširjenost 1C naredi platformo odlično preizkušnjo trdnosti za uporabljene knjižnice. Raznolikost uporabnikov in scenarijev hitro odkrije napake, tudi v redko uporabljenih delih kode. Te napake popravimo pri sebi in se trudimo, da jih vrnemo avtorjem knjižnic. Izkušnje interakcije so zelo različne.
Razvijalci in ob hitro odzivajo na pull-requests, a patch, na primer, v nam do danes ni uspelo vrniti.
Zaključek
V članku smo obravnavali nekaj osnovnih vidikov razvoja platforme „1C: Pred podjetje“. V omejenem obsegu članka smo se dotaknili samo nekaterih zanimivih, po našem mnenju, vidikov.
Splošen opis različnih mehanizmov platforme si lahko ogledate .
Katere teme bi vas zanimale v naslednjih člankih?
Kako je реализована mobilna platforma 1C?
Opis notranje strukture spletnega odjemalca?
Ali pa vas morda zanima postopek izbire funkcij za nove različice, razvoj in testiranje?
Pišite v komentarjih!
Izvor: habr.com
