Bok, Habr!
U ovom članku započinjemo priču o tome kako je unutrašnje strukturirana i koje se tehnologije koriste pri njenom razvoju.

Zašto smatramo da je ovo zanimljivo? Prvo, zato što je platforma „1C:Preduzeće 8“ velika (više od 10 miliona redova koda) aplikacija napisana u C++ (klijent, server itd.), JavaScript (web-klijent), i, od nedavno, još i . Veliki projekti su zanimljivi bar zbog svog obima, jer se pitanja koja su neprimetna u maloj bazi koda u takvim projektima pojavljuju u punom svetlu. Drugo, „1C:Preduzeće“ je reproduktivni, „kutijski“ proizvod, a članaka o takvim razvojnim projektima na Habru ima veoma malo. A uvek je zanimljivo saznati kako život ide u drugim timovima i firmama.
Dakle, krenimo. U ovom članku daćemo pregled nekih tehnologija koje se primenjuju u platformi, ocrtaćemo pejzaž, bez dubokog uranjanja u implementaciju. Jer za mnoge mehanizme detaljno objašnjenje zahteva poseban članak, a za neke – celu knjigu!
Za početak treba definisati osnovne stvari – šta je to platforma „1C:Preduzeće“ i od kojih se komponenti ona sastoji. Odgovor na ovo pitanje nije tako jednostavan, jer pod terminom „Platforma“ (za skraćenje ćemo je tako zvati) podrazumevamo i sredstvo za razvoj poslovnih aplikacija, i okruženje za izvršenje, i alate za administraciju. Usmereno možemo izdvojiti sledeće delove:
- klaster servera
- „tanki“ klijent sposoban da se poveže na server putem http i sopstvenog binarnog protokola
- klijent za rad u dvostepenoj arhitekturi s BDP-om smeštenim na hard disku ili mrežnoj mapi
- web-klijent
- alat za administraciju servera aplikacija
- okruženje za razvoj (poznato kao Konfigurator)
- okruženje za izvršenje za iOS, Android i Windows Phone (mobilna platforma 1C)
Sve ove delove, osim web-klijenta, napisane su u C++. Pored toga, postoji nedavno najavljen , napisan u Javi.
Nativne aplikacije
Za razvoj nativnih aplikacija koristi se C++03. Pod Windows se kao kompajler koristi Microsoft Visual C++ 12 (profil kompatibilan s Windows XP), a pod Linux i Android — gcc 4.8, za iOS — clang 5.0. Standardna biblioteka je jedinstvena za sve operativne sisteme i kompajlere — STLPort. Ovo rešenje smanjuje verovatnoću grešaka specifičnih za implementaciju STL. Trenutno planiramo prelazak na implementaciju STL koja se isporučuje s CLang, budući da je STLPort prestao sa razvojem i nije kompatibilan s uključenim režimom podrške za C++11 u gcc.
Baza koda servera je zajednička 99%, a klijenta 95%. Štaviše, čak i mobilna platforma koristi isti C++ kod kao i "velika", iako je tamo procenat unifikacije nešto niži.
Kao i većina korisnika C++, ne pretendujemo na korišćenje 100% mogućnosti jezika i njegovih biblioteka. Tako, praktično ne koristimo Boost, a od mogućnosti jezika — dinamičko prevođenje tipova. U međuvremenu aktivno primenjujemo:
- STL (konkretno, stringove, kontejneri i algoritmi)
- višestruko nasleđivanje, uključujući višestruko nasleđivanje implementacije
- šablone
- iznimke
- pametni pokazivači (vlastita implementacija)
Zbog upotrebe višestrukog nasleđivanja interfejsa (potpuno apstraktnih klasa) postaje moguća komponentna model, o kojoj ćemo govoriti u nastavku.
Komponente
Kako bi se osigurala modularnost, sva funkcionalnost je podeljena na komponente, koje predstavljaju dinamičke biblioteke (*.dll pod Windows, *.so — pod Linux). Svega ima više od stotinu pedeset komponenti, a evo opisa nekih od njih:
backend
Sadrži "motor" metapodataka platforme
accnt
Objekti koje aplikativni programeri koriste za izgradnju računovodstva (planovi računa i registri računovodstva)
bsl
Motor izvršavanja ugrađenog jezika
nuke
Vlastita implementacija alokatora memorije
dbeng8
Motor datotečne baze. Jednostavna fajl-server mašina baza podataka, zasnovana na ISAM, koja takođe uključuje jednostavni SQL procesor
wbase
Sadrži osnovne klase i funkcije za implementaciju korisničkog interfejsa Windows — prozorske klase, pristup GDI i sl.
Podela na više komponenti je korisna iz nekoliko aspekata:
- Podela doprinosi boljem projektovanju, posebno boljoj izolaciji koda
- Iz seta komponenti možete fleksibilno sastavljati razne opcije isporuke:
- Na primjer, instalacija tankog klijenta će sadržavati wbase, ali neće imati backend
- dok na serveru wbase, naprotiv, neće biti
- oba varijante će, naravno, sadržavati nuke i bsl
Sve potrebne komponente za ovu varijantu pokretanja učitavaju se pri startu programa. To je, između ostalog, potrebno za registraciju SCOM klasa, o kojima će biti reči u nastavku.
SCOM
Za dekompoziciju na nižem nivou koristi se SCOM sistem — sličan ideološki ATL biblioteci. Za one koji nisu radili s ATL-om, ukratko navodim osnovne mogućnosti i karakteristike.
Za posebno oblikovanu klasu SCOM:
- Pruža fabrčke metode koje omogućuju stvaranje klase iz druge komponente znajući samo njeno ime (bez otkrivanja implementacije)
- Pruža infrastrukturu pametnih pokazivača s brojanjem referenci. Za vreme života SCOM klase nije potrebno ručno pratiti
- Omogućava da saznate implementira li objekat određeni interfejs i automatski pretvara pokazivač na objekat u pokazivač na interfejs
- Kreirati servisni objekat, koji je uvek dostupan putem metode get_service itd.
Na primjer, možete opisati u komponenti json.dll klasu za čitanje JSON-a (na primjer, JSONStreamReader).
Klase, instance se mogu kreirati iz drugih komponenti potrebno je registrovati u SCOM mašini:
SCOM_CLASS_ENTRY(JSONStreamReader)
Ovaj makro će opisati posebnu statičku klasu-registar, čiji će konstruktor biti pozvan prilikom učitavanja komponente u memoriju.
Nakon toga može se stvoriti njen instanca u drugoj komponenti:
IJSONStreamReaderPtr jsonReader = create_instance<IJSONStreamReader>(SCOM_CLSIDOF(JSONStreamReader));
Za podršku servisima, SCOM nudi dodatnu, prilično složenu infrastrukturu. Centralna u njoj je pojam SCOM procesa, koji služi kao kontejner za pokrenute servise (tj. obavlja ulogu Service Locator-a), kao i sadrži vezu sa lokalizovanim resursima. SCOM proces se vezuje za OS nit. Zbog toga unutar aplikacije možete ovako dobijati servise:
SCOM_Process* process = core::current_process();
if (process)
return get_service<IMyService>(process);
Štoviše, prebacivanjem logičkih (SCOM) procesa povezanih s tokom, može se dobiti praktički neovisne aplikacije s obzirom na informacijski prostor, koje rade unutar jednog toka. Tako je osmišljen naš tanki klijent, koji radi s datotečnom bazom — unutar jednog procesa OS-a nalaze se dva SCOM-procesa, jedan povezan s klijentom, a drugi s poslužiteljem. Ovaj pristup omogućava unifikaciju pisanja koda koji će raditi i na lokalnoj datotečnoj bazi i u 'pravom' klijent-poslužiteljskom varijanti. Cijena za takvu usklađenost su troškovi, no praksa pokazuje da se isplati.
Na temelju komponentne модели SCOM implementirana je i poslovna logika i sučelje 1C: Poduzeća.
Korisničko sučelje
Usput, o sučeljima. Ne koristimo standardne Windows kontrole, naši kontrolni elementi su implementirani izravno na Windows API-ju. Za verziju za Linux napravljena je sloj koji radi preko wxWidgets biblioteke.
Biblioteka kontrolnih elemenata ne ovisi o drugim dijelovima '1C: Poduzeća' i koristimo je i u nekoliko manjih unutarnjih alata.
Tijekom godina razvoja 1C: Poduzeće izgled kontrola se mijenjao, ali ozbiljna promjena principa dogodila se samo jednom, 2009. godine, s izlaskom verzije 8.2 i uvođenjem 'upravljanih formi'. Osim promjene izgleda, fundamentalno se promijenio način slaganja forme — odustalo se od pozicioniranja elemenata po pikselima u korist flow-slaganja elemenata. Dodatno, u novoj modelu kontrolni elementi ne rade izravno s domenama objekata, već sa specijalnim DTO ().
Ove promjene omogućile su izradu web-klijenta '1C: Poduzeća', koji ponavlja C++ logiku kontrola u JavaScript-u. Nastojimo održati funkcionalnu ekvivalentnost između tankih i web klijenata. U slučaju kada to nije moguće, na primjer, zbog ograničenja dostupnih iz JavaScript API-ja (na primjer, mogućnosti rada s datotekama su vrlo ograničene), često implementiramo potrebnu funkcionalnost putem proširenja 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 mobilnih aplikacija na platformi 1C. Na mobilnim uređajima crtanje kontrola ostvaruje se korištenjem „izvornih“ tehnologija za operacijski sustav, ali se za logiku rasporeda obrasca i reakciju sučelja koristi isti kod kao i na „velikoj“ platformi „1C:Poduzetništvo“.

Sučelje 1C na OS Linux

Sučelje 1C na mobilnom uređaju
Sučelje 1C na drugim platformama 
Sučelje 1C na OS Windows

Sučelje 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. Već je spomenuta biblioteka , a također koristimo:
- za rad s HTTP i FTP.
- za rad s kriptografijom i uspostavu TLS veza
- za parsiranje XML-a
- za rad s mail protokolima (POP3, SMTP, IMAP)
- za parsiranje poruka e-pošte
- za pohranu dnevnika rada korisnika
- za internacionalizaciju
Popis se može nastaviti.
Osim toga, koristimo jako modificirane verzije i prilikom izrade jediničnih testova.
Biblioteke su zahtijevale prilagodbu za kompatibilnost s SCOM-modelom organizacije komponenti.
Raširenost 1C čini platformu odličnom provjerom čvrstoće za korištene u njoj biblioteke. Raznolikost korisnika i scenarija brzo otkriva greške čak i u najrijetko korištenim dijelovima koda. Ispravljamo ih kod nas i trudimo se vraćati ih autorima biblioteka. Iskustvo suradnje je vrlo različito.
Razvijači i brzo odgovaraju na pull-request, ali patch, na primjer, u nam nije uspjelo predati.
Zaključak
U članku smo se dotaknuli nekoliko osnovnih aspekata razvoja platforme „1C: Poduzetništvo“. U ograničenju ovog članka, dotaknuli smo se samo nekih zanimljivih, po našem mišljenju, aspekata.
Opis različitih mehanizama platforme možete pogledati .
Koje bi teme bile zanimljive za vas u sljedećim člancima?
Kako je izvedena mobilna platforma 1C?
Opis unutarnje strukture web-klijenta?
Ili, možda, vas zanima proces odabira funkcionalnosti za nove verzije, razvoj i testiranje?
Pišite u komentarima!
Izvor: habr.com
