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

Pse e konsiderojmĂ« kĂ«tĂ« interesante? E para, sepse platforma "1C:NdĂ«rmarrja 8" Ă«shtĂ« njĂ« aplikim i madh (mĂ« shumĂ« se 10 milion rreshta kodi) nĂ« C++ (klienti, serveri, etj.), JavaScript (klienti nĂ« ueb), dhe, sĂ« fundmi, edhe . Projektet e mĂ«dha janĂ« tĂ« interesantĂ«, sĂ« paku pĂ«r shkak tĂ« shkallĂ«s, sepse pyetjet qĂ« nuk duken nĂ« njĂ« bazĂ« tĂ« vogĂ«l kodi dalin nĂ« plan tĂ« parĂ« nĂ« projekte tĂ« tilla. E dyta, "1C:NdĂ«rmarrja" Ă«shtĂ« njĂ« produkt i shpĂ«rndarĂ«, "produkti i kutisĂ«", dhe artikujt mbi zhvillime tĂ« tilla nĂ« HabrĂ« janĂ« shumĂ« tĂ« pakta. ĂshtĂ« gjithashtu interesante tĂ« dihet si Ă«shtĂ« jeta nĂ« skuadra dhe kompani tĂ« tjera.
Pra, le të fillojmë. Në këtë artikull do të japim një pasqyrë të disa teknologjive që përdoren në platformë, duke vizatuar peizazhin, pa u thelluar në realizim. Sepse për shumë mekanizma, një tregim i detajuar do të kërkonte një artikull të veçantë, ndërsa për disa, madje do të kërkonte një libër të tërë!
SĂ« pari, Ă«shtĂ« e rĂ«ndĂ«sishme tĂ« pĂ«rcaktojmĂ« disa gjĂ«ra tĂ« bazĂ« â çfarĂ« Ă«shtĂ« platforma "1C:NdĂ«rmarrja" dhe nga cilat komponente pĂ«rbĂ«het. PĂ«rgjigjja pĂ«r kĂ«tĂ« pyetje nuk Ă«shtĂ« kaq e thjeshtĂ«, sepse me termin "PlatformĂ«" (pĂ«r shkurtim do ta quajmĂ« ashtu) kuptojmĂ« dhe mjetin pĂ«r zhvillimin e aplikacioneve biznesore, dhe mjedisin e ekzekutimit, dhe mjetet e administrimit. Mund tĂ« dallojmĂ« nĂ« mĂ«nyrĂ« tĂ« kushtĂ«zuar komponentĂ«t e mĂ«poshtĂ«m:
- kaster serverësh
- "klienti i hollë", i aftë të lidhet me serverin përmes http dhe protokollit të tij binar
- klienti për të punuar në një arkitekturë me dy nivele me DB, e vendosur në një disk të fortë ose në një dosje rrjet
- klienti në ueb
- mjetet për administrimin e serverit të aplikacioneve
- mjedisi i zhvillimit (i njohur si Konfiguratori)
- mjedisi i ekzekutimit për iOS, Android dhe Windows Phone (platformat mobile 1C)
Të gjitha këto pjesë, me përjashtim të klientit në ueb, janë shkruar në C++. Për më tepër, ekziston një " ", i shkruari në Java.
Aplikacione natyrore
PĂ«r zhvillimin e aplikacioneve natyrore, pĂ«rdoret C++03. NĂ«n Windows, kompilator pĂ«rdoret Microsoft Visual C++ 12 (profil i pĂ«rputhshĂ«m me Windows XP), ndĂ«rsa nĂ«n Linux dhe Android â gcc 4.8, pĂ«r iOS â clang 5.0. Biblioteka standarde pĂ«rdoret e njĂ«jtĂ« pĂ«r tĂ« gjitha sistemet operuese dhe kompilatorĂ«t â STLPort. Ky zgjidhje lejon tĂ« ulet probabiliteti i gabimeve, specifike pĂ«r implementimin e STL. Tani ne po planifikojmĂ« kalimin nĂ« implementimin e STL-sĂ«, e cila ofrohet me CLang, pasi STLPort ka ndaluar zhvillimin e tij dhe Ă«shtĂ« e papĂ«rputhshme me modalitetin e mbĂ«shtetjes C++11 nĂ« gcc.
Baza e kodit të serverit është e përbashkët në 99%, ndërsa e klientit në rreth 95%. Më tepër, edhe platforma mobile përdor të njëjtin kod C++ si 'i madhi', ndonëse aty përqindja e unifikimit është disi më e ulët.
Si shumica e pĂ«rdoruesve tĂ« C++, ne nuk pretendojmĂ« tĂ« pĂ«rdorim 100% tĂ« mundĂ«sive tĂ« gjuhĂ«s dhe bibliotekave tĂ« saj. KĂ«shtu, ne praktikisht nuk pĂ«rdorim Boost, dhe nga mundĂ«sitĂ« e gjuhĂ«s â konvertimi dinamik i tipeve. MegjithatĂ«, ne aktivisht aplikojmĂ«:
- STL (në veçanti, string, konteiner dhe algoritme)
- trashëgimi shumëfishe, përfshirë trashëgiminë shumëfishe të implementimit
- shabllonat
- përjashtime
- përcjellës inteligjentë (implementim i brendshëm)
Përmes përdorimit të trashëgimisë shumëfishe të ndërfaqeve (klasave krejtësisht abstrakte), bëhet e mundur modeli komponent, për të cilin do të flasim më poshtë.
Komponentët
PĂ«r tĂ« siguruar modularitetin, e gjithĂ« funksionaliteti Ă«shtĂ« i ndarĂ« nĂ« komponente, tĂ« cilat paraqesin biblioteka dinamike (*.dll nĂ«n Windows, *.so â nĂ«n Linux). JanĂ« mĂ« shumĂ« se njĂ«qind e pesĂ«dhjetĂ« komponente, le tĂ« japim pĂ«rshkrimin e disa prej tyre:
backend
Përmban 'motorin' e metadatos së platformës
accnt
Objektet, që zhvilluesit e aplikacioneve përdorin për ndërtimin e kontabilitetit (planet e llogarive dhe regjistrat e kontabilitetit)
bsl
Motori i ekzekutimit të gjuhës së integruar
nuke
Implementimi ynë i alokuesit të kujtesës
dbeng8
Motori i bazës së të dhënave me skedarë. Një makinë e thjeshtë për skedarë baza të të dhënave, e bazuar në ISAM, duke përfshirë gjithashtu një procesor të thjeshtë SQL
wbase
PĂ«rmban klasat dhe funksionet kryesore pĂ«r implementimin e ndĂ«rfaqes sĂ« pĂ«rdoruesit tĂ« Windows â klasat e dritareve, qasja nĂ« GDI etj.
Ndarja në shumë komponente është e dobishme nga disa pikapamje:
- Ndarja kontribuon në një projektim më të mirë, në veçanti izolimin më të mirë të kodit
- Nga grupi i komponentëve, mund të krijoni variacione të ndryshme të dërgesës:
- Për shembull, instalimi i klientit të hollë do të përmbajë wbase, por nuk do të ketë backend.
- ndërsa në serverin wbase, përkundrazi, nuk do të ketë.
- Të dy variantet, natyrisht, do të përmbajnë nuke dhe bsl.
Të gjitha komponentët e nevojshëm për këtë variant nisjeje ngarkohen gjatë startit të programit. Kjo është, në veçanti, 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, do tĂ« pĂ«rmendim shkurtimisht mundĂ«sitĂ« dhe karakteristikat kryesore.
Për klasën e veçantë të formatuar 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ën e treguesve inteligjentë me numërimin e referencave. Nuk është e nevojshme të mbajmë mend për jetën e klasës SCOM manualisht.
- Lejon të kuptohet nëse një objekt implementon një ndërfaqe të veçantë dhe automatikisht e konverton treguesin te objekti në treguesin te ndërfaqja.
- Krijoni një objekt-shërbim, gjithmonë në dispozicion përmes metodës get_service, etj.
Për shembull, mund të përshkruhet në komponentin json.dll një klasë për të lexuar JSON (p.sh. JSONStreamReader).
Klasat, instancat mund të krijohen nga komponentë të tjerë, 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 saj do të thirret kur komponenti të ngarkohet në memori.
Pas kësaj, mund të krijoni instancën e tij në një komponent tjetër:
IJSONStreamReaderPtr jsonReader = create_instance(SCOM_CLSIDOF(JSONStreamReader));
Për mbështetje të shërbimeve, SCOM ofron infrastrukturë shtesë, mjaft komplekse. Qendra e saj është koncepti i SCOM-procesit, i cili shërben si kontejner për shërbimet e nisura (dmth. luan rolin e Service Locator), si dhe përmban lidhjen me burimet e lokalizuara. Procesi SCOM lidhet me thread-in e OS. Falë kësaj, brenda aplikacionit mund të merrni shërbimet si kështu:
SCOM_Process* process = core::current_process();
if (process)
return get_service(process);
PĂ«r mĂ« tepĂ«r, duke kaluar proceset logjike (SCOM) tĂ« lidhura me rrjedhĂ«n, mund tĂ« fitojmĂ« aplikacione praktikisht tĂ« pavarura nga pikĂ«pamja e hapĂ«sirĂ«s informative, qĂ« funksionojnĂ« brenda njĂ« rrjedhe. Ky Ă«shtĂ« mĂ«nyra si funksionon klienti ynĂ« i hollĂ«, qĂ« punon me bazĂ«n e tĂ« dhĂ«nave skedare â brenda njĂ« procesi OS ka dy procese SCOM, njĂ«ra e lidhur me klientin dhe tjetra me serverin. Ky qasje lejon unifikimin e kodit, i cili do tĂ« funksionojĂ« si nĂ« bazĂ«n e tĂ« dhĂ«nave lokale ashtu edhe nĂ« njĂ« variant klient-server "tĂ« vĂ«rtetĂ«". Ămimi pĂ«r kĂ«tĂ« uniformitet janĂ« shpenzimet e mbĂ«shtetjes, por praktika tregon se ato e meritojnĂ«.
Bazuar në modelin komponent SCOM, janë realizuar si logjika biznesore ashtu edhe pjesa e ndërfaqes e 1C: Ndërmarrjes.
Ndërfaqja e përdoruesit
Për të folur për ndërfaqet. Ne nuk përdorim kontrollet standarde të Windows, elementët tanë të kontrollit janë realizuar direkt në Windows API. Për versionin Linux është krijuar një ndërmjetës që punon përmes bibliotekës wxWidgets.
Biblioteka e elementeve të kontrollit nuk varet nga pjesët e tjera të "1C: Ndërmarrjes" dhe përdoret nga ne edhe në disa utilitete të vogla të brendshme.
Gjatë viteve të zhvillimit të 1C: Ndërmarrjes, pamja e kontrolleve ka ndryshuar, por ndryshimi i rëndësishëm i principeve ka ndodhur vetëm një herë, në vitin 2009, me publikimin e versionit 8.2 dhe shfaqjen e "formave të menaxhuara". Përveç ndryshimit të pamjes, boja e re e formave ndryshoi gjithashtu krejtësisht parimin e kompozimit të formës - u hoq pozicionimi pixel-për-pixel i elementeve për të favorizuar kompozimin flow të elementeve. Për më tepër, në modelin e ri, elementët e kontrollit punojnë jo drejtpërdrejt me objektet domene, por me DTO të veçantë ().
Këto ndryshime lejuan krijimin e klientit web "1C: Ndërmarrjes", që përsërit logjikën e kontrolleve C++ në JavaScript. Ne përpiqemi të mbajmë ekvivalenten funksionale midis klientëve të hollë dhe web. Në rastet kur kjo është e pamundur, për shembull, për shkak të kufizimeve të API-ve të disponueshëm nga JavaScript (p.sh., mundësitë për të punuar me skedarë janë shumë të kufizuara), ne shpesh realizojmë funksionalitetin e nevojshëm përmes zgjerimeve të shfletuesve, të shkruara në C++. Aktualisht mbështesim Internet Explorer dhe Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows dhe Linux) dhe Safari (MacOS).
Për më tepër, teknologjia e formave të menaxhuara përdoret për të krijuar ndërfaqen e aplikacioneve të lëvizshme në platformën 1C. Në pajisjet mobile, renditja e kontrolleve realizohet duke përdorur teknologjitë "natyrore" për sistemin operativ, por për logjikën e kompozitës së formës dhe reagimin e ndërfaqes përdoret e njëjta kod si në platformën "1C: Ndërmarrja".

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 â klienti nĂ« web
Open source
Megjithëse nuk përdorim bibliotekat standarde për zhvilluesit C++ në Windows (MFC, kontrollet nga WinAPI), jo të gjitha komponentët i shkruajmë vetë. Biblioteka e përmendur më parë , dhe gjithashtu përdorim:
- për punë me HTTP dhe FTP.
- për punë me kriptografinë dhe vendosjen e lidhjeve TLS
- për analizën e XML
- për punë me protokollet e postës elektronike (POP3, SMTP, IMAP)
- për analizimin e mesazheve të postës elektronike
- për ruajtjen e regjistrave të punës së përdoruesve
- për internacionizimin
Lista mund të vazhdojë.
Për më tepër, ne përdorim një version të modifikuar të dhe në zhvillimin e testeve unitare.
Bibliotekat kërkuan adaptim për të qenë të përputhshme me modelin SCOM të organizatës së komponentëve.
Përhapja e 1C e bën platformën një test të shkëlqyer për qëndrueshmërinë e bibliotekave të përdorura në të. Diversiteti i përdoruesve dhe skenarëve zbulojnë shpejt gabime edhe në pjesët më të përdorura të kodit. Ne i korrigjojmë ato në sistemin tonë dhe përpiqemi t'i japim prapa autorëve të bibliotekave. Eksperianca e bashkëveprimit është shumë e ndryshme.
Zhvilluesit dhe shpejt përgjigjen ndaj kërkesave për të tërhequr/ndihmuar, por patch, për shembull, në nuk arritëm ta kthenim.
Përfundim
Në artikull kemi prekur disa aspekte kryesore të zhvillimit të platformës "1C: Ndërmarrja". Në një përmasë të kufizuar të artikullit, ne trajtuam 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 interesante për ju në artikujt e ardhshëm?
Si është realizuar platforma mobile 1C?
Përshkrimi i strukturës së brendshme të klientit në web?
Ose, ndoshta, jeni të interesuar në procesin e zgjedhjes së karakteristikave për versionet e reja, zhvillimin dhe testimin?
Shkruani në komentet!
Burimi: habr.com
