Përshëndetje, Habr!
Në këtë artikull do të fillojmë tregimin për mënyrën se si funksionon brenda dhe cilat teknologji përdoren gjatë zhvillimit të saj.

Pse e konsiderojmë këtë interesante? Së pari, sepse platforma '1C:Ndërmarrja 8' është një aplikacion i madh (më shumë se 10 milion rreshta kodi) në C++ (klienti, serveri etj.), JavaScript (klienti web), dhe, së fundmi, gjithashtu . Projektet e mëdha kanë interes sidomos për shkak të shkallës, sepse problemet e padukshme në një bazë të vogël kodi bëhen të dukshme në projekte të tilla. Së dyti, '1C:Ndërmarrja' është një produkt i riprodhueshëm, 'kotizues', dhe artikujt për zhvillime të tilla në Habrë janë shumë të pakta. Gjithashtu, gjithmonë është interesante të dish si jetojnë ekipet dhe kompanitë e tjera.
Pra, le të fillojmë. Në këtë artikull do të japim një përmbledhje të disa teknologjive që përdoren në platformë, duke përshkuar peizazhin, pa u thelluar shumë në zbatimin e tyre. Sepse për shumë mekanizma, një tregim i detajuar do të kërkonte një artikull të veçantë, e për disa — një libër të tërë!
Së pari, është e rëndësishme të përcaktojmë gjëra bazike — çfarë është platforma '1C:Ndërmarrja' dhe nga cilat komponentë përbëhet. Përgjigja ndaj këtij pyetje nuk është kaq e thjeshtë, sepse nën termin 'Platforma' (për shkurtim do ta quajmë kështu) nënkuptohet si mjet zhvillimi për aplikacione biznesi, edhe si mjedis ekzekutimi, edhe si mjete administrimi. Mund të veçojmë përbërësit e mëposhtëm:
- klaster serverash
- 'klienti i hollë', i aftë të lidhet me serverin përmes http dhe protokollit të tij binar
- klienti për punë në arkitekturë të dyfishtë me DB që ndodhet në një disk të ngurtë ose në një dosje rrjeti
- klienti web
- mjetet e administrimit të serverit të aplikacioneve
- mjedisi i zhvillimit (i njohur si Konfiguratori)
- mjedisi ekzekutimi për iOS, Android dhe Windows Phone (platforma mobile 1C)
Të gjithë këta pjesë, me përjashtim të klientit web, janë të shkruara në C++. Për më tepër, ekziston një 'Konfiguratori i Brezit të Ri' Aplikacionet native
Për zhvillimin e aplikacioneve native përdoret C++03. Nën Windows përdoret Microsoft Visual C++ 12 (profil i përputhshëm me Windows XP), ndërsa për Linux dhe Android — gcc 4.8, për iOS — clang 5.0. Biblioteka standarde përdoret e njëjtë për të gjitha OS-të dhe kompilatorët — STLPort. Ky zgjidhje lejon të ulë probabilitetin e gabimeve, specifike për implementimin e STL. Tani po planifikojmë kalimin në implementimin e STL, të ofruar me CLang, pasi STLPort ka ndaluar zhvillimin e tij dhe është i papajtueshëm me modalitetin e mbështetjes C++11 në gcc.
Baza e kodit të serverit është kështu e përbashkët në 99%, e klientit në 95%. Për më tepër, madje edhe platforma mobile përdor të njëjtin kod C++ si 'i madhi', edhe pse atje procenti i unifikimit është pak më i ulët.
Si shumica e përdoruesve të C++, ne nuk pretendokojmë për përdorimin e mundësive 100% të gjuhës dhe bibliotekave të saj. Pra, ne praktikisht nuk përdorim Boost, dhe nga mundësitë e gjuhës — konvertimi dinamik i tipeve. Megjithatë, ne përdorim me forcë:
STL (sidomos, vargjet, kontejnerët dhe algoritmet)
- trashëgimia e shumëfishtë, përfshirë trashëgiminë e shumëfishtë të zbatimit
- shabllonat
- pajisjet inteligjente (implementimi ynë)
- përjashtimet
- Duke përdorur trashëgiminë e shumëfishtë të interfaceve (klasave tërësisht abstrakte) bëhet e mundur modeli komponentor, për të cilin do të flasim më poshtë.
За счет использования множественного наследования интерфейсов (полностью абстрактных классов) становится возможной компонентная модель, речь о которой пойдет ниже.
Komponentët
Për të siguruar modularitet, të gjitha funksionalitetet janë të ndara në komponente, të cilat përbëjnë biblioteka dinamike (*.dll nën Windows, *.so — nën Linux). Ka më shumë se 150 komponentë, do të përmendim përshkrimet e disa prej tyre:
backend
Përmban 'motorin' e metadatat e platformës
accnt
Objektet që zhvilluesit aplikativë përdorin për të ndërtuar llogaritë (planet e llogarive dhe regjistrat e llogarive)
bsl
Motorin e ekzekutimit të gjuhës së integruar
nuke
Implementimi ynë i alokatorit të memories
dbeng8
Motorin e bazës së dhënave me skedarë. Një makinë thjesht file-server e bazës së të dhënave, e bazuar në ISAM, duke përfshirë gjithashtu një procesor të thjeshtë SQL
wbase
Përmban klasat bazë dhe funksionet për realizimin e ndërfaqes së përdoruesit në Windows — klasat e dritareve, qasja në GDI etj.
Ndara në shumë komponente është e dobishme nga disa pikëpamje:
- Ndarja kontribuon në një projektim më të mirë, sidomos një izolim më të mirë të kodit
- Nga grupi i komponentëve mund të krijohen në mënyrë fleksibël variante të ndryshme të dorëzimit:
- Për shembull, instalimi i klientit të hollë do të përmbajë wbase, por nuk do të përmbajë backend
- ndërsa në server wbase, përkundrazi, nuk do të ketë
- të dy variantet do të përmbajnë, sigurisht, nuke dhe bsl
Të gjithë komponentët e nevojshëm për këtë variant nisje ngarkohen gjatë fillimit të programit. Kjo është e nevojshme për regjistrimin e klasave SCOM, për të cilat do të flasim më poshtë.
SCOM
Për dekompozimin në një nivel më të ulët përdoret sistemi SCOM — i ngjashëm në ide me bibliotekën ATL. Për ata që nuk kanë punuar me ATL, ja disa nga mundësitë dhe veçoritë kryesore.
Për klasën e veçantë të dizajnuar SCOM:
- Ofron metoda fabrike që lejojnë krijimin e një klase nga një komponent tjetër duke ditur vetëm emrin e saj (pa zbuluar implementimin)
- Ofron infrastrukturë për tregues të mençur me numërimin e referencave. Nuk është e nevojshme të ndjekim manualisht jetën e klasës SCOM
- Lejon të kuptohet nëse një objekt implementon një interface të caktuar dhe automatikisht të konvertohet treguesi i objektit në treguesin për interface-in
- Të krijohet një objekt-shërbim, gjithmonë e aksesueshme përmes metodës get_service etj.
Për shembull, mund të përshkruhet në komponentin json.dll një klasë për leximin e JSON (p.sh. JSONStreamReader).
Klasat, instancat mund të krijohen nga të tjera komponentë dhe duhet të regjistrohen në makinën SCOM:
SCOM_CLASS_ENTRY(JSONStreamReader)
Ky makro do të përshkruajë një klasë statike regjistruese të veçantë, konstruktori i së cilës do të thirret kur komponenti ngarkohet në memorie.
Pas kësaj, mund të krijohet një instancë në një komponent tjetër:
IJSONStreamReaderPtr jsonReader = create_instance(SCOM_CLSIDOF(JSONStreamReader));
Për mbështetje të shërbimeve, SCOM ofron një infrastrukturë shtesë, mjaft komplekse. Qendra e saj është koncepti i procesit SCOM, i cili shërben si një enë për shërbimet e nisura (pra, vepron si Service Locator), si dhe përmban lidhjen me burimet e lokalizuara. Procesi SCOM lidhet me vlasninë OS. Falë kësaj, brenda aplikacionit mund të merrni shërbime në këtë mënyrë:
SCOM_Process* process = core::current_process();
if (process)
return get_service(process);
Madje, duke ndryshuar proceset logjike (SCOM) të lidhura me vlasninë, mund të merrni praktikisht të pavarur nga pikëpamja e hapësirës informacionit aplikacionet që funksionojnë brenda një vlasi. Kështu është ndërtuar klienti ynë i hollë, që funksionon me bazën e të dhënave dosje — brenda një procesi OS janë dy procese SCOM, një i lidhur me klientin dhe tjetri me serverin. Ky qasje lejon një unifikim në të shkruarit e kodit që funksionon si në bazën lokale të dosjeve ashtu edhe në variantin “e vërtetë” klient-server. Çmimi për këtë njëllojësi — shpenzime shtesë, por praktika tregon se ato ia vlen.
Baza e modelit komponent SCOM realizon si logjikën e biznesit ashtu edhe pjesën ndërfaqësore të 1C: Ndërmarrjes.
Ndërfaqja e përdoruesit
Përveç kësaj, për ndërfaqet. Ne nuk përdorim kontrollet standarde të Windows, elementet tona të kontrollit janë realizuar direkt në Windows API. Për versionin Linux është krijuar një ndërfaqe që punon përmes bibliotekës wxWidgets.
Biblioteka e elementeve të kontrollit nuk varret nga pjesët e tjera të "1C: Ndërmarrjes" dhe përdoret gjithashtu në disa utilitete të brendshme më të vogla.
Gjatë viteve të zhvillimit të 1C: Ndërmarrës, pamja e kontrollit ka ndryshuar, por një ndryshim i rëndësishëm në principet është ndodhur vetëm një herë, në vitin 2009, me daljen e versionit 8.2 dhe shfaqjen e "formave të menaxhuara". Përveç ndryshimit të pamjes, është ndryshuar thelbësisht parimi i përbërjes së formës — është hequr pozicionimi piksel për piksel në favor të përbërjes flux të elementeve. Përveç kësaj, në modelin e ri, elementet e kontrollit nuk punojnë drejtë me objektet domene, por me DTO të veçantë ().
Këto ndryshime lejuan krijimin e klientit në web të "1C: Ndërmarrjes", që përsërit logjikën e kontrollit C++ në JavaScript. Ne përpiqemi të mbajmë ekuivalencën funksionale midis klientëve të hollë dhe atyre në web. Në rastin kur kjo është e pamundur, për shembull, për shkak të kufizimeve të mundësive të API JavaScript (p.sh., mundësitë e punës me skedarët janë shumë të kufizuara), ne shpesh realizojmë funksionalitetin e nevojshëm përmes zgjerimeve të shfletuesve, të shkruara në C++. Aktualisht ne mbështesim Internet Explorer dhe Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows dhe Linux) dhe Safari (MacOS).
Përveç kësaj, teknologjia e formave të menaxhuara përdoret për krijimin e ndërfaqes së aplikacioneve mobile në platformën 1C. Në pajisjet mobile, vizatimi i kontrollit është realizuar duke përdorur teknologjitë "native" për sistemin operativ, por për logjikën e përbërjeve të formës dhe reagimin e ndërfaqes përdoret e njëjta kod si në platformën "e madhe" të "1C: Ndërmarrjes".

Ndërfaqja 1C në OS Linux

Ndërfaqja 1C në pajisjen mobile
Ndërfaqja 1C në platforma të tjera 
Ndërfaqja 1C në OS Windows

Ndërfaqja 1C — klient web
Open source
Megjithëse ne nuk përdorim bibliotemat standarde për zhvilluesit e C++ nën Windows (MFC, kontrollet nga WinAPI), nuk i shkruajmë vetë të gjitha komponentët. Është përmendur biblioteka , dhe ne gjithashtu përdorim:
- për punën me HTTP dhe FTP.
- për punën me kriptografinë dhe vendosjen e lidhjeve TLS
- për analizën e XML
- për punën me protokollet e postës (POP3, SMTP, IMAP)
- për analizën e mesazheve të postës elektronike
- për ruajtjen e regjistrimeve të punës së përdoruesve
- për internacionalizimin
Lista mund të vazhdojë akoma.
Përveç kësaj, ne përdorim një version të modifikuar thelbësisht të dhe në zhvillimin e testeve të njësi.
Bibliotekat kërkuan adaptim për të siguruar kompatibilitet me modelin SCOM të organizatës së komponentëve.
Përhapja e 1C e bën platformën një provë të shkëlqyer për biblioteket e përdorura në të. Larmishmëria e përdoruesve dhe skenarëve zbula shpejt gabimet, madje edhe në pjesët më pak të përdorura të kodit. Ne i korrigjojmë ato dhe përpiqemi t'i kthejmë autorëve të bibliotekave. Përvoja e bashkëpunimit rezulton të jetë shumë e ndryshme.
Zhvilluesit dhe shpejt përgjigjen në pull-request, por patch, për shembull, në nuk arritëm ta kthejmë.
Përfundimi
Në këtë artikull kemi prekur disa aspekte kryesore të zhvillimit të platformës "1C: Ndërmarrja". Në volum të kufizuar të artikullit kemi prekur vetëm disa aspekte interesante, sipas mendimit tonë.
Përshkrimi i përgjithshëm i mekanizmave të ndryshëm të platformës mund të shikohet .
Cilat tema do ishin të interesuara për ju në artikujt e ardhshëm?
Si është realizuar platforma mobile 1C?
Përshkrimi i strukturës së brendshme të klientit web?
Ose, ndoshta, jeni të interesuar për procesin e përzgjedhjes së veçorive për versionet e reja, zhvillimin dhe testimin?
Shkruani në komente!
Burimi: habr.com
