Platforma "1C: Enterprise" - što je ispod haube?

Hej Habr!
U ovom ćemo članku započeti priču o tome kako funkcionira unutra platforma "1C:Enterprise 8" i koje se tehnologije koriste u njegovom razvoju.

Platforma "1C: Enterprise" - što je ispod haube?

Zašto mislimo da je ovo zanimljivo? Prvo, zato što je platforma 1C:Enterprise 8 velika (više od 10 milijuna linija koda) aplikacija u C++ (klijent, poslužitelj, itd.), JavaScript (web klijent) i, odnedavno, i Java. Veliki projekti mogu biti zanimljivi barem zbog svojih razmjera, jer problemi koji su nevidljivi u maloj bazi kodova u takvim projektima izbijaju punom snagom. Drugo, "1C:Enterprise" je proizvod koji se može replikovati, "u kutiji" i na Habréu postoji vrlo malo članaka o takvim razvojima. Također je uvijek zanimljivo znati kakav je život u drugim timovima i kompanijama.

Pa krenimo. U ovom ćemo članku dati pregled nekih tehnologija koje se koriste u platformi i ocrtati krajolik, bez dubljeg poniranja u implementaciju. Dapače, za mnoge bi mehanizme detaljna priča zahtijevala poseban članak, a za neke i cijelu knjigu!
Za početak je vrijedno odlučiti o osnovnim stvarima - što je platforma 1C:Enterprise i od kojih se komponenti sastoji. Odgovor na ovo pitanje nije tako jednostavan, jer se pojam „Platforma“ (radi sažetosti, tako ćemo je zvati) odnosi na sredstvo za razvoj poslovnih aplikacija, runtime okruženje i alate za administraciju. Ugrubo se mogu razlikovati sljedeće komponente:

  • klaster poslužitelja
  • “tanki” klijent sposoban za spajanje na poslužitelj putem http-a i vlastitog binarnog protokola
  • klijent za rad u dvoslojnoj arhitekturi s bazom podataka smještenom na tvrdom disku ili mrežnoj mapi
  • web klijent
  • alati za administraciju poslužitelja aplikacija
  • razvojno okruženje (poznato kao konfigurator)
  • runtime okruženje za iOS, Android i Windows Phone (mobilna platforma 1C)

Svi ovi dijelovi, s izuzetkom web klijenta, napisani su u C++. Dodatno, tu je i nedavno najavljeno Konfigurator nove generacije, napisano u Javi.

Izvorne aplikacije

C++03 se koristi za razvoj izvornih aplikacija. Za Windows se kao kompajler koristi Microsoft Visual C++ 12 (profil kompatibilan sa sustavom Windows XP), a za Linux i Android - gcc 4.8, za iOS - clang 5.0. Standardna biblioteka koja se koristi je ista za sve operacijske sustave i prevoditelje - STLPort. Ovo rješenje smanjuje vjerojatnost pogrešaka specifičnih za STL implementaciju. Trenutačno planiramo migrirati na STL implementaciju isporučenu s CLangom, jer je STLPort ukinut i nije kompatibilan s gcc-ovim C++11 omogućenim načinom rada.
Baza koda poslužitelja je 99% uobičajena, klijentova - 95%. Štoviše, čak i mobilna platforma koristi isti C++ kod kao i ona “velika”, iako je tu postotak unifikacije nešto manji.
Kao većina korisnika C++-a, ne tvrdimo da koristimo 100% mogućnosti jezika i njegovih biblioteka. Dakle, praktički ne koristimo Boost, a jedna od značajki jezika je dinamičko prevođenje tipa. Istovremeno, aktivno koristimo:

  • STL (točnije nizovi, spremnici i algoritmi)
  • višestruko nasljeđivanje, uklj. nasljeđivanje višestruke implementacije
  • Uzorci
  • iznimke
  • pametni pokazivači (prilagođena implementacija)

Korištenjem višestrukog nasljeđivanja sučelja (potpuno apstraktnih klasa) postaje moguć komponentni model, o čemu će biti riječi u nastavku.

Komponente

Kako bi se osigurala modularnost, sva je funkcionalnost podijeljena na komponente, koje su dinamičke biblioteke (*.dll za Windows, *.so za Linux). Ukupno ima više od stotinu i pedeset komponenti; evo opisa nekih od njih:

pozadina
Sadrži mehanizam metapodataka platforme

račun
Objekti koje programeri aplikacija koriste za izgradnju računovodstvenih evidencija (kontni planovi i računovodstveni registri)

bsl
Ugrađeni motor za izvršavanje jezika

nuke
Prilagođena implementacija alokatora memorije

dbeng8
Motor baze podataka datoteka. Jednostavan motor baze podataka poslužitelja datoteka temeljen na ISAM-u, koji također uključuje jednostavan SQL procesor

wbase
Sadrži osnovne klase i funkcije za implementaciju Windows korisničkog sučelja - klase prozora, GDI pristup, itd.

Podjela na više komponenti korisna je s nekoliko gledišta:

  • Razdvajanje promiče bolji dizajn, posebice bolju izolaciju koda
  • Iz skupa komponenti možete fleksibilno sastaviti različite mogućnosti isporuke:
    • Na primjer, instalacija tankog klijenta sadržavat će wbase, ali neće imati pozadinu
    • ali na wbase poslužitelju, naprotiv, neće biti
    • obje opcije će naravno sadržavati nuke i bsl

Sve komponente potrebne za ovu opciju pokretanja učitavaju se kada se program pokrene. Ovo je posebno potrebno za registraciju SCOM klasa, o čemu će biti riječi u nastavku.

SCOM

Za dekompoziciju na nižoj razini koristi se SCOM sustav, knjižnica po ideologiji slična ATL-u. Za one koji nisu radili s ATL-om, ukratko navodimo glavne mogućnosti i značajke.
Za posebno dizajniranu SCOM klasu:

  • Pruža tvorničke metode koje vam omogućuju stvaranje klase iz druge komponente znajući samo njezin naziv (bez otkrivanja implementacije)
  • Pruža infrastrukturu pametnog pokazivača za brojanje referenci. Životni vijek klase SCOM nije potrebno nadzirati ručno
  • Omogućuje vam da saznate implementira li objekt određeno sučelje i automatski pretvara pokazivač na objekt u pokazivač na sučelje
  • Napravite uslužni objekt koji je uvijek dostupan putem metode get_service itd.

Na primjer, možete opisati klasu za čitanje JSON-a (na primjer, JSONStreamReader) u komponenti json.dll.
Klase i instance mogu se kreirati iz drugih komponenti; potrebno ih je registrirati u SCOM stroju:

SCOM_CLASS_ENTRY(JSONStreamReader)

Ovaj makro će opisati posebnu klasu statičkog snimača, čiji će konstruktor biti pozvan kada se komponenta učita u memoriju.
Nakon ovoga, možete stvoriti njegovu instancu u drugoj komponenti:

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

Kao podršku uslugama, SCOM nudi dodatnu, prilično složenu infrastrukturu. Središnje mjesto u njemu je koncept SCOM procesa, koji služi kao spremnik za pokretanje usluga (tj. igra ulogu lokatora usluga), a također sadrži vezanje na lokalizirane resurse. SCOM proces vezan je za OS nit. Zahvaljujući tome, unutar aplikacije možete primati usluge poput ovih:

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

Štoviše, prebacivanjem logičkih (SCOM) procesa vezanih za nit, možete dobiti aplikacije koje su praktički neovisne sa stajališta informacijskog prostora, a koje se izvode unutar iste niti. Ovako naš tanki klijent radi s bazom podataka datoteka - unutar jednog OS procesa postoje dva SCOM procesa, jedan povezan s klijentom, a drugi s poslužiteljem. Ovaj nam pristup omogućuje objedinjavanje pisanja koda koji će raditi i na lokalnoj bazi podataka datoteka i u "pravoj" verziji klijent-poslužitelj. Cijena takve uniformnosti je prevelika, ali praksa pokazuje da se isplati.

Na temelju modela komponente SCOM, implementirana je poslovna logika i dio sučelja 1C: Enterprise.

Korisničko sučelje

Usput, o sučeljima. Ne koristimo standardne Windows kontrole; naše kontrole su implementirane izravno na Windows API. Za verziju Linuxa napravljen je sloj koji radi preko wxWidgets biblioteke.
Biblioteka kontrola ne ovisi o drugim dijelovima 1C:Enterprise i koristimo je u nekoliko drugih malih internih uslužnih programa.

Tijekom godina razvoja 1C:Enterprise, izgled kontrola se promijenio, ali ozbiljna promjena u principima dogodila se samo jednom, 2009. godine, izdavanjem verzije 8.2 i pojavom "upravljanih obrazaca". Osim promjene izgleda, temeljno se promijenio princip rasporeda forme - odbačeno je pozicioniranje elemenata po pikselima u korist protočnog rasporeda elemenata. Osim toga, u novom modelu kontrole ne rade izravno s objektima domene, već s posebnim DTO-ovima (Objekti prijenosa podataka).
Ove promjene omogućile su stvaranje 1C:Enterprise web klijenta koji replicira C++ logiku JavaScript kontrola. Trudimo se održati funkcionalnu jednakost između tankih i web klijenata. U slučajevima kada to nije moguće, primjerice zbog ograničenja dostupnog JavaScript API-ja (na primjer, mogućnost rada s datotekama vrlo je ograničena), često implementiramo potrebnu funkcionalnost pomoću ekstenzija preglednika napisanih u C++. Trenutno podržavamo Internet Explorer i Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows i Linux) i Safari (MacOS).

Osim toga, tehnologija upravljanih obrazaca koristi se za izradu sučelja za mobilne aplikacije na 1C platformi. Na mobilnim uređajima, renderiranje kontrola implementirano je korištenjem tehnologija izvornih za operativni sustav, ali za logiku izgleda obrasca i odgovor sučelja koristi se isti kod kao u "velikoj" platformi 1C:Enterprise.

Platforma "1C: Enterprise" - što je ispod haube?
1C sučelje na Linux OS-u

Platforma "1C: Enterprise" - što je ispod haube?
1C sučelje na mobilnom uređaju

1C sučelje na drugim platformama Platforma "1C: Enterprise" - što je ispod haube?
1C sučelje na Windows OS-u

Platforma "1C: Enterprise" - što je ispod haube?
Sučelje 1C - web klijent

Otvoreni izvor

Iako ne koristimo standardne biblioteke za C++ programere pod Windowsima (MFC, kontrole iz WinAPI-ja), ne pišemo sve komponente sami. Knjižnica je već spomenuta wxWidgeti, a koristimo i:

Popis se nastavlja.
Osim toga, koristimo vrlo modificiranu verziju Google Test и Google Mock prilikom razvoja jediničnih testova.
Knjižnice su zahtijevale prilagodbu kako bi bile kompatibilne s organizacijskim modelom komponente SCOM.
Prevalencija 1C čini platformu izvrsnim testom snage za knjižnice koje se u njoj koriste. Različiti korisnici i scenariji brzo otkrivaju pogreške čak i u najrjeđe korištenim područjima koda. Sami ih ispravljamo i pokušavamo ih vratiti autorima knjižnice. Iskustvo interakcije pokazalo se vrlo različitim.
Developeri sklupčati и libetpan brzo odgovoriti na zahtjeve za povlačenjem, ali zakrpa, na primjer, u OpenSSL Nikada ga nismo uspjeli vratiti.

Zaključak

U članku smo se dotakli nekoliko glavnih aspekata razvoja platforme 1C: Enterprise. U ograničenom opsegu članka dotakli smo se samo nekih zanimljivih, po našem mišljenju, aspekata.
Može se pronaći opći opis različitih mehanizama platforme ovdje.
Koje bi vas teme zanimale u budućim člancima?

Kako se implementira mobilna platforma 1C?
Opis unutarnje strukture web klijenta?
Ili vas možda zanima proces odabira značajki za nova izdanja, razvoj i testiranje?

Napišite u komentarima!

Izvor: www.habr.com

Dodajte komentar