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

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

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

Zašto mislimo da je ovo zanimljivo? Prvo, zato što je platforma 1C:Enterprise 8 velika (više od 10 miliona linija koda) aplikacija u C++ (klijent, server, itd.), JavaScript (web klijent) i, odnedavno, i Java. Veliki projekti mogu biti interesantni barem zbog svog obima, jer se problemi koji su nevidljivi u maloj bazi koda pojavljuju u punoj snazi ​​u takvim projektima. Drugo, “1C:Enterprise” je proizvod koji se može replicirati, “upakovan” i vrlo je malo članaka o takvim razvojima na Habréu. Također je uvijek zanimljivo znati kako se živi u drugim timovima i kompanijama.

Pa počnimo. U ovom članku dat ćemo pregled nekih tehnologija koje se koriste u platformi i ocrtaćemo krajolik, bez dubljeg uranjanja u implementaciju. Zaista, za mnoge mehanizme, detaljna priča bi zahtijevala poseban članak, a za neke i cijelu knjigu!
Za početak, vrijedi 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 kratkoće, tako ćemo je nazvati) odnosi na sredstvo za razvoj poslovnih aplikacija, runtime okruženje i administrativne alate. Sljedeće komponente se mogu grubo razlikovati:

  • klaster servera
  • “tanki” klijent sposoban da se poveže sa serverom preko http i sopstvenog binarnog protokola
  • klijent za rad u dvoslojnoj arhitekturi s bazom podataka koja se nalazi na tvrdom disku ili mrežnom folderu
  • web klijent
  • alati za administraciju servera 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++. Uz to, tu je i nedavno najavljena Konfigurator nove generacije, napisan 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 Windows XP), a za Linux i Android - gcc 4.8, za iOS - clang 5.0. Standardna biblioteka koja se koristi je ista za sve operativne sisteme i kompajlere - STLPort. Ovo rješenje smanjuje vjerovatnoću grešaka specifičnih za STL implementaciju. Trenutno planiramo da pređemo na STL implementaciju isporučenu sa CLang-om, pošto je STLPort ukinut i nije kompatibilan sa gcc-ovim C++11 omogućenim načinom rada.
Baza koda servera je 99% uobičajena, klijentova - 95%. Štaviše, čak i mobilna platforma koristi isti C++ kod kao i „velika“, iako je postotak unifikacije tamo nešto manji.
Kao i većina C++ korisnika, mi ne tvrdimo da koristimo 100% mogućnosti jezika i njegovih biblioteka. Dakle, mi praktički ne koristimo Boost, a jedna od jezičnih karakteristika je dinamičko prebacivanje tipova. Istovremeno, aktivno koristimo:

  • STL (posebno nizovi, kontejneri i algoritmi)
  • višestruko nasljeđivanje, uklj. višestruko nasljeđivanje implementacije
  • templates
  • izuzeci
  • pametni pokazivači (prilagođena implementacija)

Korišćenjem višestrukog nasleđivanja interfejsa (potpuno apstraktnih klasa) postaje moguć model komponenti, o čemu će biti reči u nastavku.

Komponente

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

backend
Sadrži mehanizam za metapodatke platforme

accnt
Objekti koje programeri aplikacija koriste za pravljenje računovodstvenih zapisa (računskih planova i računovodstvenih registara)

bsl
Ugrađeni mehanizam za izvršavanje jezika

nuke
Prilagođena implementacija alokatora memorije

dbeng8
Mehanizam baze podataka datoteka. Jednostavan mehanizam baze podataka servera datoteka baziran na ISAM-u, koji također uključuje jednostavan SQL procesor

wbase
Sadrži osnovne klase i funkcije za implementaciju Windows korisničkog interfejsa - prozorske klase, GDI pristup itd.

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

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

Sve komponente potrebne za ovu opciju pokretanja se učitavaju 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žem nivou koristi se SCOM sistem, biblioteka slična po ideologiji ATL-u. Za one koji nisu radili sa ATL-om, ukratko navodimo glavne mogućnosti i karakteristike.
Za posebno dizajniranu SCOM klasu:

  • Pruža tvorničke metode koje vam omogućavaju da kreirate klasu iz druge komponente znajući samo njeno ime (bez otkrivanja implementacije)
  • Pruža infrastrukturu pametnog pokazivača za brojanje referenci. Životni vijek klase SCOM ne mora se pratiti ručno
  • Omogućava vam da saznate da li objekt implementira određeno sučelje i automatski konvertuje pokazivač na objekt u pokazivač na sučelje
  • Kreirajte servisni objekt koji je uvijek dostupan putem get_service metode, itd.

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

SCOM_CLASS_ENTRY(JSONStreamReader)

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

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

Za podršku uslugama, SCOM nudi dodatnu, prilično složenu infrastrukturu. Centralno u njemu je koncept SCOM procesa, koji služi kao kontejner za pokretanje servisa (tj. igra ulogu lokatora usluge), a takođe sadrži vezivanje za lokalizovane resurse. SCOM proces je vezan za OS nit. Zahvaljujući tome, unutar aplikacije možete primati sljedeće usluge:

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

Štaviše, prebacivanjem logičkih (SCOM) procesa vezanih za nit, možete dobiti aplikacije koje su praktično nezavisne sa stanovišta informacionog prostora, koje rade unutar iste niti. Ovako naš tanki klijent radi sa bazom podataka – unutar jednog OS procesa postoje dva SCOM procesa, jedan je povezan sa klijentom, a drugi sa serverom. Ovaj pristup nam omogućava da ujedinimo pisanje koda koji će raditi i na lokalnoj bazi podataka iu "pravoj" verziji klijent-server. Cijena takve uniformnosti je visoka, ali praksa pokazuje da se isplati.

Na osnovu modela komponente SCOM implementirana je i poslovna logika i dio interfejsa 1C: Enterprise.

Korisničko sučelje

Usput, o interfejsima. Ne koristimo standardne Windows kontrole; naše kontrole su implementirane direktno na Windows API. Za Linux verziju, napravljen je sloj koji radi kroz wxWidgets biblioteku.
Biblioteka kontrola ne zavisi od drugih delova 1C:Enterprise i koristimo je u nekoliko drugih malih internih uslužnih programa.

Tokom godina razvoja 1C:Enterprise, izgled kontrola se promijenio, ali se ozbiljna promjena principa dogodila samo jednom, 2009. godine, izdavanjem verzije 8.2 i pojavom „upravljanih obrazaca“. Osim promjene izgleda, princip rasporeda forme se iz temelja promijenio - došlo je do odbacivanja piksel po piksel pozicioniranja elemenata u korist flow-layouta elemenata. Osim toga, u novom modelu kontrole ne rade direktno sa objektima domene, već sa posebnim DTO-ovima (Objekti prijenosa podataka).
Ove promjene su omogućile kreiranje 1C:Enterprise web klijenta koji replicira C++ logiku JavaScript kontrola. Trudimo se održati funkcionalnu ekvivalenciju između tankih i web klijenata. U slučajevima kada to nije moguće, na primjer zbog ograničenja dostupnog JavaScript API-ja (na primjer, mogućnost rada sa datotekama je vrlo ograničena), često implementiramo potrebnu funkcionalnost koristeći ekstenzije pretraživača napisane na 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 kreiranje sučelja za mobilne aplikacije na 1C platformi. Na mobilnim uređajima, kontrole se crtaju korištenjem tehnologija koje su izvorne za operativni sistem, ali za logiku izgleda obrasca i odgovor interfejsa koristi se isti kod kao na „velikoj“ platformi 1C:Enterprise.

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

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

1C interfejs na drugim platformama Platforma "1C: Enterprise" - šta je ispod haube?
1C interfejs na Windows OS

Platforma "1C: Enterprise" - šta je ispod haube?
Interfejs 1C - web klijent

Open source

Iako ne koristimo standardne biblioteke za C++ programere pod Windowsom (MFC, kontrole iz WinAPI), ne pišemo sve komponente sami. Biblioteka je već spomenuta wxWidgets, a koristimo i:

  • cURL za rad sa HTTP i FTP.
  • OpenSSL za rad sa kriptografijom i uspostavljanje TLS veza
  • libxml2 i libxslt za XML raščlanjivanje
  • libetpan za rad sa mail protokolima (POP3, SMTP, IMAP)
  • mimetički da raščlanite poruke e-pošte
  • sqllite za pohranjivanje korisničkih dnevnika
  • ICU za internacionalizaciju

Lista se nastavlja.
Osim toga, koristimo vrlo modificiranu verziju Google Test и Google Mock prilikom razvoja jediničnih testova.
Biblioteke su zahtijevale prilagodbu kako bi bile kompatibilne s modelom organizacije komponenti SCOM.
Prevalencija 1C čini platformu odličnim testom snage za biblioteke koje se u njoj koriste. Različiti korisnici i scenariji brzo otkrivaju greške čak iu najrjeđe korištenim područjima koda. Sami ih ispravljamo i pokušavamo da ih vratimo autorima biblioteke. Pokazalo se da je iskustvo interakcije veoma različito.
Programeri cURL и libetpan brzo reaguju na zahtjeve za povlačenjem, ali je zakrpa, na primjer, uključena OpenSSL Nikada ga nismo uspjeli vratiti.

zaključak

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

Kako je implementirana 1C mobilna platforma?
Opis interne strukture web klijenta?
Ili ste možda zainteresirani za proces odabira karakteristika za nova izdanja, razvoja i testiranja?

Pišite u komentarima!

izvor: www.habr.com

Dodajte komentar