Platforma "1C: Ndërmarrja" - çfarë ka nën kapuç?

Hej Habr!
Në këtë artikull do të fillojmë historinë se si funksionon brenda platforma "1C: Enterprise 8" dhe cilat teknologji përdoren në zhvillimin e tij.

Platforma "1C: Ndërmarrja" - çfarë ka nën kapuç?

Pse mendojmë se kjo është interesante? Së pari, sepse platforma 1C:Enterprise 8 është një aplikacion i madh (më shumë se 10 milionë rreshta kodi) në C++ (klient, server, etj.), JavaScript (klient në ueb) dhe, së fundmi, Dhe Java. Projektet e mëdha mund të jenë interesante të paktën për shkak të shkallës së tyre, sepse çështjet që janë të padukshme në një bazë të vogël kodi lindin me forcë të plotë në projekte të tilla. Së dyti, "1C:Enterprise" është një produkt i riprodhueshëm, "kuti" dhe ka shumë pak artikuj në lidhje me zhvillime të tilla në Habré. Është gjithashtu gjithmonë interesante të dish se si është jeta në ekipe dhe kompani të tjera.

Pra, le të fillojmë. Në këtë artikull do të japim një pasqyrë të disa prej teknologjive që përdoren në platformë dhe do të përshkruajmë peizazhin, pa u zhytur thellë në zbatim. Në të vërtetë, për shumë mekanizma, një histori e detajuar do të kërkonte një artikull të veçantë, dhe për disa, një libër të tërë!
Për të filluar, ia vlen të vendosni për gjërat themelore - çfarë është platforma 1C: Enterprise dhe nga cilat komponentë përbëhet. Përgjigja për këtë pyetje nuk është aq e thjeshtë, sepse termi "Platformë" (për shkurtim, ne do ta quajmë kështu) i referohet një mjeti për zhvillimin e aplikacioneve të biznesit, një mjedisi të funksionimit dhe mjeteve të administrimit. Përafërsisht mund të dallohen përbërësit e mëposhtëm:

  • grupi i serverëve
  • Klienti "i hollë" i aftë për t'u lidhur me serverin nëpërmjet http dhe protokollit të tij binar
  • klient për të punuar në një arkitekturë me dy nivele me një bazë të dhënash të vendosur në një hard disk ose dosje rrjeti
  • klient web
  • mjetet e administrimit të serverit të aplikacionit
  • mjedisi i zhvillimit (i njohur si Konfigurator)
  • mjedisi i ekzekutimit për iOS, Android dhe Windows Phone (platforma celulare 1C)

Të gjitha këto pjesë, me përjashtim të klientit të internetit, janë të shkruara në C++. Për më tepër, ekziston edhe ajo e shpallur së fundmi Konfiguruesi i gjeneratës së re, shkruar në Java.

Aplikacionet vendase

C++03 përdoret për të zhvilluar aplikacione vendase. Për Windows, Microsoft Visual C++ 12 (një profil i pajtueshëm me Windows XP) përdoret si përpilues, dhe për Linux dhe Android - gcc 4.8, për iOS - clang 5.0. Biblioteka standarde e përdorur është e njëjtë për të gjitha sistemet operative dhe përpiluesit - STLPort. Kjo zgjidhje zvogëlon gjasat e gabimeve specifike të zbatimit të STL. Aktualisht po planifikojmë të migrojmë në zbatimin STL të dërguar me CLang, pasi STLPort është ndërprerë dhe është i papajtueshëm me modalitetin e aktivizuar C++11 të gcc.
Baza e kodit të serverit është 99% e zakonshme, e klientit - 95%. Për më tepër, edhe platforma celulare përdor të njëjtin kod C++ si ajo "e madhe", megjithëse përqindja e unifikimit atje është disi më e ulët.
Ashtu si shumica e përdoruesve të C++, ne nuk pretendojmë të përdorim 100% të aftësive të gjuhës dhe bibliotekave të saj. Pra, ne praktikisht nuk përdorim Boost, dhe një nga veçoritë gjuhësore është transmetimi i tipit dinamik. Në të njëjtën kohë, ne përdorim në mënyrë aktive:

  • STL (veçanërisht vargjet, kontejnerët dhe algoritmet)
  • trashëgimi e shumëfishtë, përfshirë. trashëgimi e shumëfishtë e zbatimit
  • templates
  • përjashtime
  • tregues të zgjuar (zbatim me porosi)

Duke përdorur trashëgimi të shumëfishtë të ndërfaqeve (klasa plotësisht abstrakte), bëhet i mundur një model komponenti, i cili do të diskutohet më poshtë.

Komponentet

Për të siguruar modularitet, i gjithë funksionaliteti është i ndarë në komponentë, të cilët janë biblioteka dinamike (*.dll për Windows, *.so për Linux). Në total ka më shumë se njëqind e pesëdhjetë përbërës; këtu janë përshkrimet e disa prej tyre:

backend
Përmban motorin e meta të dhënave të platformës

accnt
Objektet që zhvilluesit e aplikacioneve përdorin për të ndërtuar regjistra kontabël (grafikë të llogarive dhe regjistra kontabël)

bsl
Motori i ekzekutimit të gjuhës së integruar

nuke
Implementimi i personalizuar i alokuesit të memories

dbeng8
Motori i bazës së të dhënave të skedarëve. Një motor i thjeshtë i bazës së të dhënave të serverit të skedarëve i bazuar në ISAM, i cili gjithashtu përfshin një procesor të thjeshtë SQL

wbase
Përmban klasat bazë dhe funksionet për zbatimin e ndërfaqes së përdoruesit të Windows - klasat e dritareve, aksesi GDI, etj.

Ndarja në komponentë të shumtë është e dobishme nga disa këndvështrime:

  • Ndarja promovon dizajn më të mirë, veçanërisht izolim më të mirë të kodit
  • Nga një grup përbërësish mund të grumbulloni në mënyrë fleksibël opsione të ndryshme shpërndarjeje:
    • Për shembull, një instalim me klient të hollë do të përmbajë wbase, por nuk do të ketë backend
    • por në serverin wbase, përkundrazi, nuk do të jetë
    • të dyja opsionet sigurisht që do të përmbajnë nuke dhe bsl

Të gjithë komponentët e kërkuar për këtë opsion nisjeje ngarkohen kur programi fillon. Kjo, në veçanti, është e nevojshme për regjistrimin e klasave SCOM, të cilat do të diskutohen më poshtë.

SCOM

Për zbërthimin në një nivel më të ulët, përdoret sistemi SCOM, një bibliotekë e ngjashme në ideologji me ATL. Për ata që nuk kanë punuar me ATL, ne rendisim shkurtimisht aftësitë dhe veçoritë kryesore.
Për një klasë SCOM të krijuar posaçërisht:

  • Ofron metoda të fabrikës që ju lejojnë të krijoni një klasë nga një komponent tjetër duke ditur vetëm emrin e saj (pa zbuluar zbatimin)
  • Ofron një infrastrukturë treguese inteligjente të numërimit të referencës. Jetëgjatësia e klasës SCOM nuk ka nevojë të monitorohet manualisht
  • Ju lejon të zbuloni nëse një objekt zbaton një ndërfaqe specifike dhe konverton automatikisht një tregues në objekt në një tregues në ndërfaqe
  • Krijoni një objekt shërbimi që është gjithmonë i aksesueshëm përmes metodës get_service, etj.

Për shembull, mund të përshkruani një klasë për leximin e JSON (për shembull, JSONStreamReader) në komponentin json.dll.
Klasat dhe instancat mund të krijohen nga komponentë të tjerë; ato duhet të regjistrohen në makinën SCOM:

SCOM_CLASS_ENTRY(JSONStreamReader)

Kjo makro do të përshkruajë një klasë të veçantë regjistruesi statik, konstruktori i së cilës do të thirret kur komponenti të ngarkohet në memorie.
Pas kësaj, mund të krijoni një shembull të tij në një komponent tjetër:

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

Për të mbështetur shërbimet, SCOM ofron një infrastrukturë shtesë, mjaft komplekse. Në qendër të tij është koncepti i një procesi SCOM, i cili shërben si një kontejner për funksionimin e shërbimeve (d.m.th., luan rolin e Shërbimit Locator), dhe gjithashtu përmban një lidhje me burimet e lokalizuara. Procesi SCOM është i lidhur me fillin e OS. Falë kësaj, brenda aplikacionit mund të merrni shërbime si kjo:

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

Për më tepër, duke ndërruar proceset logjike (SCOM) të lidhura me një fije, mund të merrni aplikacione që janë praktikisht të pavarura nga pikëpamja e hapësirës së informacionit, që funksionojnë brenda të njëjtit thread. Kështu funksionon klienti ynë i hollë me një bazë të dhënash skedarësh - brenda një procesi OS ka dy procese SCOM, një i lidhur me klientin dhe i dyti me serverin. Kjo qasje na lejon të unifikojmë shkrimin e kodit që do të funksionojë si në bazën e të dhënave lokale të skedarëve ashtu edhe në versionin "real" klient-server. Çmimi për një uniformitet të tillë është i lartë, por praktika tregon se ia vlen.

Bazuar në modelin e komponentit SCOM, zbatohen si logjika e biznesit ashtu edhe pjesa e ndërfaqes së 1C: Enterprise.

Ndërfaqja e përdoruesit

Nga rruga, në lidhje me ndërfaqet. Ne nuk përdorim kontrolle standarde të Windows; kontrollet tona zbatohen drejtpërdrejt në API të Windows. Për versionin Linux, është krijuar një shtresë që funksionon përmes bibliotekës wxWidgets.
Biblioteka e kontrolleve nuk varet nga pjesët e tjera të 1C: Enterprise dhe përdoret nga ne në disa shërbime të tjera të vogla të brendshme.

Me kalimin e viteve të zhvillimit të 1C: Enterprise, pamja e kontrolleve ka ndryshuar, por një ndryshim serioz në parime ndodhi vetëm një herë, në 2009, me lëshimin e versionit 8.2 dhe ardhjen e "formave të menaxhuara". Përveç ndryshimit të pamjes, parimi i paraqitjes së formës ka ndryshuar rrënjësisht - ka pasur një refuzim të pozicionimit piksel pas piksel të elementeve në favor të paraqitjes së rrjedhës së elementeve. Për më tepër, në modelin e ri, kontrollet nuk funksionojnë drejtpërdrejt me objektet e domenit, por me DTO të veçanta (Objektet e transferimit të të dhënave).
Këto ndryshime bënë të mundur krijimin e një klienti ueb 1C:Enterprise që përsërit logjikën C++ të kontrolleve JavaScript. Ne përpiqemi të ruajmë ekuivalencën funksionale midis klientëve të hollë dhe të internetit. Në rastet kur kjo nuk është e mundur, për shembull për shkak të kufizimeve të JavaScript API në dispozicion (për shembull, aftësia për të punuar me skedarë është shumë e kufizuar), ne shpesh zbatojmë funksionalitetin e nevojshëm duke përdorur shtesat e shfletuesit 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ër më tepër, teknologjia e formave të menaxhuara përdoret për të krijuar një ndërfaqe për aplikacionet celulare në platformën 1C. Në pajisjet celulare, kontrollet vizatohen duke përdorur teknologjitë vendase të sistemit operativ, por për logjikën e paraqitjes së formularit dhe përgjigjen e ndërfaqes, përdoret i njëjti kod si në platformën "e madhe" 1C:Enterprise.

Platforma "1C: Ndërmarrja" - çfarë ka nën kapuç?
Ndërfaqja 1C në Linux OS

Platforma "1C: Ndërmarrja" - çfarë ka nën kapuç?
Ndërfaqja 1C në një pajisje celulare

Ndërfaqja 1C në platforma të tjera Platforma "1C: Ndërmarrja" - çfarë ka nën kapuç?
Ndërfaqja 1C në Windows OS

Platforma "1C: Ndërmarrja" - çfarë ka nën kapuç?
Ndërfaqja 1C - klient në internet

Burim i Hapur

Edhe pse ne nuk përdorim bibliotekat standarde për zhvilluesit e C++ nën Windows (MFC, kontrollet nga WinAPI), ne nuk i shkruajmë vetë të gjithë komponentët. Biblioteka tashmë është përmendur wxWidgets, dhe ne përdorim gjithashtu:

  • mblidhem për të punuar me HTTP dhe FTP.
  • OpenSSL për punën me kriptografinë dhe vendosjen e lidhjeve TLS
  • libxml2 dhe libxslt për analizimin XML
  • libetpan për të punuar me protokollet e postës (POP3, SMTP, IMAP)
  • mimikë për të analizuar mesazhet e emailit
  • sqllite për ruajtjen e regjistrave të përdoruesve
  • ICU për ndërkombëtarizim

Lista vazhdon.
Për më tepër, ne përdorim një version shumë të modifikuar Google Test и Google Mock gjatë zhvillimit të testeve të njësisë.
Bibliotekat kërkonin përshtatje për të qenë në përputhje me modelin e organizimit të komponentëve SCOM.
Prevalenca e 1C e bën platformën një provë të shkëlqyer të forcës për bibliotekat e përdorura në të. Një shumëllojshmëri e përdoruesve dhe skenarëve zbulojnë shpejt gabimet edhe në fushat më rrallë të përdorura të kodit. Ne i korrigjojmë vetë dhe përpiqemi t'ua kthejmë autorëve të bibliotekës. Përvoja e ndërveprimit rezulton të jetë shumë e ndryshme.
Zhvilluesit mblidhem и libetpan përgjigjuni shpejt kërkesave për tërheqje, por patch-i, për shembull, in OpenSSL Nuk arritëm ta kthenim kurrë.

Përfundim

Në artikull ne prekëm disa aspekte kryesore të zhvillimit të platformës 1C: Enterprise. Në shtrirjen e kufizuar të artikullit, ne prekëm vetëm disa aspekte interesante, sipas mendimit tonë.
Mund të gjendet një përshkrim i përgjithshëm i mekanizmave të ndryshëm të platformës këtu.
Cilat tema do të ishin me interes për ju në artikujt e ardhshëm?

Si zbatohet platforma celulare 1C?
Përshkrimi i strukturës së brendshme të klientit në internet?
Apo ndoshta jeni të interesuar në procesin e zgjedhjes së veçorive për publikimet e reja, zhvillimin dhe testimin?

Shkruani në komente!

Burimi: www.habr.com

Shto një koment