Platforma "1C: Enterprise" - kas atrodas zem pārsega?

Čau Habr!
Å ajā rakstā mēs sāksim stāstu par to, kā tas darbojas iekŔā platforma "1C:Enterprise 8" un kādas tehnoloÄ£ijas tiek izmantotas tā izstrādē.

Platforma "1C: Enterprise" - kas atrodas zem pārsega?

Kāpēc mēs domājam, ka tas ir interesanti? Pirmkārt, tāpēc, ka platforma 1C:Enterprise 8 ir liela (vairāk nekā 10 miljoni koda rindu) lietojumprogramma C++ (klients, serveris utt.), JavaScript (tÄ«mekļa klients) un pēdējā laikā Un Java. Lieli projekti var bÅ«t interesanti kaut vai sava mēroga dēļ, jo mazā kodu bāzē neredzamie jautājumi Ŕādos projektos rodas pilnā spēkā. Otrkārt, ā€œ1C:Enterpriseā€ ir replikējams, ā€œiesaiņotsā€ produkts, un vietnē HabrĆ© ir ļoti maz rakstu par Ŕādiem notikumiem. Vienmēr ir arÄ« interesanti uzzināt, kā notiek dzÄ«ve citās komandās un uzņēmumos.

Tātad sāksim. Å ajā rakstā mēs sniegsim pārskatu par dažām platformā izmantotajām tehnoloÄ£ijām un ieskicēsim ainavu, neiedziļinoties ievieÅ”anā. PatieŔām, daudziem mehānismiem detalizētam stāstam bÅ«tu nepiecieÅ”ams atseviŔķs raksts, bet dažiem - vesela grāmata!
Sākumā ir vērts izlemt par pamata lietām - kas ir platforma 1C: Enterprise un no kādiem komponentiem tā sastāv. Atbilde uz Å”o jautājumu nav tik vienkārÅ”a, jo termins ā€œPlatformaā€ (Ä«sumā to sauksim tā) attiecas uz lÄ«dzekli biznesa lietojumprogrammu, izpildlaika vides un administrÄ“Å”anas rÄ«ku izstrādei. Aptuveni var atŔķirt Ŕādas sastāvdaļas:

  • serveru klasteris
  • ā€œplānsā€ klients, kas spēj izveidot savienojumu ar serveri, izmantojot http un savu bināro protokolu
  • klients darbam divu lÄ«meņu arhitektÅ«rā ar datu bāzi, kas atrodas cietajā diskā vai tÄ«kla mapē
  • tÄ«mekļa klients
  • lietojumprogrammu servera administrÄ“Å”anas rÄ«ki
  • izstrādes vide (pazÄ«stama kā konfigurators)
  • izpildlaika vide operētājsistēmai iOS, Android un Windows Phone (mobilā platforma 1C)

Visas Ŕīs daļas, izņemot tÄ«mekļa klientu, ir rakstÄ«tas C++ valodā. Turklāt ir nesen paziņotais Jaunās paaudzes konfigurators, rakstÄ«ts Java valodā.

Vietējās lietotnes

C++03 tiek izmantots vietējo lietojumprogrammu izstrādei. Operētājsistēmai Windows kā kompilators tiek izmantots Microsoft Visual C++ 12 (profils, kas ir saderÄ«gs ar Windows XP), savukārt Linux un Android - gcc 4.8, iOS - clang 5.0. Visām operētājsistēmām un kompilatoriem izmantotā standarta bibliotēka ir vienāda - STLPort. Å is risinājums samazina STL ievieÅ”anai raksturÄ«gu kļūdu iespējamÄ«bu. PaÅ”laik mēs plānojam migrēt uz STL ievieÅ”anu, kas piegādāta kopā ar CLang, jo STLPort ir pārtraukta un nav saderÄ«ga ar gcc C++11 iespējoto režīmu.
Servera kodu bāze ir 99% izplatÄ«ta, klienta - 95%. Turklāt pat mobilā platforma izmanto to paÅ”u C++ kodu, ko ā€œlielaisā€, lai gan tur apvienoÅ”anās procents ir nedaudz mazāks.
Tāpat kā lielākā daļa C++ lietotāju, mēs neapgalvojam, ka izmantojam 100% valodas un tās bibliotēku iespējas. Tātad mēs praktiski neizmantojam Boost, un viena no valodas funkcijām ir dinamiskā tipa lieÅ”ana. Tajā paŔā laikā mēs aktÄ«vi izmantojam:

  • STL (Ä«paÅ”i virknes, konteineri un algoritmi)
  • daudzkārtējs mantojums, t.sk. vairāku ievieÅ”anas mantojums
  • veidnes
  • izņēmumi
  • viedās norādes (pielāgota ievieÅ”ana)

Izmantojot vairāku interfeisu pārmantoÅ”anu (pilnÄ«gi abstraktas klases), kļūst iespējams komponentu modelis, kas tiks apspriests turpmāk.

Komponenti

Lai nodroÅ”inātu modularitāti, visa funkcionalitāte ir sadalÄ«ta komponentos, kas ir dinamiskās bibliotēkas (*.dll Windows, *.so Linux). Kopumā ir vairāk nekā simts piecdesmit komponenti; Å”eit ir daži no tiem apraksti:

aizmugure
Ietver platformas metadatu dzinēju

accnt
Objekti, ko lietojumprogrammu izstrādātāji izmanto, lai izveidotu grāmatvedības ierakstus (kontu diagrammas un grāmatvedības reģistrus)

bsl
Iegultā valodas izpildes dzinējs

nuke,
Pielāgota atmiņas sadalÄ«tāja ievieÅ”ana

dbeng8
Failu datu bāzes dzinējs. VienkārÅ”s failu servera datu bāzes dzinējs, kura pamatā ir ISAM un kas ietver arÄ« vienkārÅ”u SQL procesoru

wbase
Satur bāzes klases un funkcijas Windows lietotāja interfeisa ievieŔanai - logu klases, GDI piekļuve u.c.

SadalīŔana vairākos komponentos ir noderīga no vairākiem viedokļiem:

  • AtdalÄ«Å”ana veicina labāku dizainu, jo Ä«paÅ”i labāku koda izolāciju
  • No komponentu komplekta jÅ«s varat elastÄ«gi salikt dažādas piegādes iespējas:
    • Piemēram, plānā klienta instalācijā bÅ«s wbase, bet tai nebÅ«s aizmugursistēmas
    • bet wbase serverÄ« gluži otrādi tā nebÅ«s
    • abās opcijās, protams, bÅ«s nuke un bsl

Visi komponenti, kas nepiecieÅ”ami Å”ai palaiÅ”anas opcijai, tiek ielādēti, kad programma tiek startēta. Tas jo Ä«paÅ”i ir nepiecieÅ”ams, lai reÄ£istrētu SCOM klases, kas tiks apspriestas turpmāk.

SCOM

DekompozÄ«cijai zemākā lÄ«menÄ« tiek izmantota SCOM sistēma, kas pēc ideoloÄ£ijas ir lÄ«dzÄ«ga ATL. Tiem, kuri nav strādājuÅ”i ar ATL, mēs Ä«sumā uzskaitām galvenās iespējas un funkcijas.
ÄŖpaÅ”i izstrādātai SCOM klasei:

  • NodroÅ”ina rÅ«pnÄ«cas metodes, kas ļauj izveidot klasi no cita komponenta, zinot tikai tā nosaukumu (neatklājot ievieÅ”anu)
  • NodroÅ”ina atsauces skaitÄ«Å”anas viedo rādÄ«tāju infrastruktÅ«ru. SCOM klases kalpoÅ”anas laiks nav jāuzrauga manuāli
  • Ä»auj noskaidrot, vai objekts ievieÅ” noteiktu interfeisu, un automātiski konvertēt rādÄ«tāju uz objektu par rādÄ«tāju uz saskarni
  • Izveidojiet pakalpojuma objektu, kas vienmēr ir pieejams, izmantojot get_service metodi utt.

Piemēram, varat aprakstÄ«t klasi JSON lasÄ«Å”anai (piemēram, JSONStreamReader) komponentā json.dll.
Klases un instances var izveidot no citiem komponentiem; tie ir jāreÄ£istrē SCOM maŔīnā:

SCOM_CLASS_ENTRY(JSONStreamReader)

Å is makro aprakstÄ«s Ä«paÅ”u statiskā ierakstÄ«tāja klasi, kuras konstruktors tiks izsaukts, kad komponents tiks ielādēts atmiņā.
Pēc tam varat izveidot tā instanci citā komponentā:

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

Pakalpojumu atbalstam SCOM piedāvā papildu, diezgan sarežģītu infrastruktÅ«ru. Tās centrālais elements ir SCOM procesa jēdziens, kas kalpo kā konteiners pakalpojumu darbināŔanai (t.i., pilda pakalpojumu meklētāja lomu) un satur arÄ« saistÄ«Å”anu ar lokalizētiem resursiem. SCOM process ir saistÄ«ts ar OS pavedienu. Pateicoties tam, lietojumprogrammā varat saņemt Ŕādus pakalpojumus:

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

Turklāt, pārslēdzot loÄ£iskos (SCOM) procesus, kas saistÄ«ti ar pavedienu, jÅ«s varat iegÅ«t no informācijas telpas viedokļa praktiski neatkarÄ«gas programmas, kas darbojas vienā pavedienā. Tādā veidā mÅ«su plānais klients strādā ar failu datu bāzi ā€“ vienā OS procesā ir divi SCOM procesi, viens saistÄ«ts ar klientu, bet otrs ar serveri. Å Ä« pieeja ļauj mums unificēt koda rakstÄ«Å”anu, kas darbosies gan lokālajā failu datu bāzē, gan ā€œÄ«stajāā€ klienta-servera versijā. Cena par Ŕādu vienveidÄ«bu ir pieskaitāma, taču prakse rāda, ka tas ir tā vērts.

Pamatojoties uz SCOM komponenta modeli, 1C: Enterprise ir ieviesta gan biznesa loģika, gan saskarnes daļa.

Lietotāja interfeiss

Starp citu, par saskarnēm. Mēs neizmantojam standarta Windows vadÄ«klas; mÅ«su vadÄ«klas ir ieviestas tieÅ”i Windows API. Linux versijai ir izveidots slānis, kas darbojas caur wxWidgets bibliotēku.
VadÄ«bas elementu bibliotēka nav atkarÄ«ga no citām 1C:Enterprise daļām, un mēs to izmantojam vairākās citās mazās iekŔējās utilÄ«tprogrammās.

1C:Enterprise izstrādes gadu laikā vadÄ«klu izskats ir mainÄ«jies, taču nopietnas izmaiņas principos notika tikai vienu reizi, 2009. gadā, izlaižot versiju 8.2 un parādoties ā€œpārvaldÄ«tajām formāmā€. Papildus izskata maiņai ir bÅ«tiski mainÄ«jies arÄ« formas izkārtojuma princips - tika noraidÄ«ta elementu pozicionÄ“Å”ana pa pikseļiem par labu elementu plÅ«smas izkārtojumam. Turklāt jaunajā modelÄ« vadÄ«klas nedarbojas tieÅ”i ar domēna objektiem, bet gan ar Ä«paÅ”iem DTO (Datu pārsÅ«tÄ«Å”anas objekti).
Å Ä«s izmaiņas ļāva izveidot 1C:Enterprise tÄ«mekļa klientu, kas atkārto JavaScript vadÄ«klu C++ loÄ£iku. Mēs cenÅ”amies saglabāt funkcionālo lÄ«dzvērtÄ«bu starp plānajiem un tÄ«mekļa klientiem. GadÄ«jumos, kad tas nav iespējams, piemēram, pieejamā JavaScript API ierobežojumu dēļ (piemēram, iespēja strādāt ar failiem ir ļoti ierobežota), mēs bieži ievieÅ”am nepiecieÅ”amo funkcionalitāti, izmantojot pārlÅ«kprogrammas paplaÅ”inājumus, kas rakstÄ«ti C++ valodā. PaÅ”laik mēs atbalstām Internet Explorer un Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows un Linux) un Safari (MacOS).

Turklāt pārvaldÄ«to veidlapu tehnoloÄ£ija tiek izmantota, lai izveidotu saskarni mobilajām lietojumprogrammām platformā 1C. Mobilajās ierÄ«cēs vadÄ«klu renderÄ“Å”ana tiek Ä«stenota, izmantojot operētājsistēmai raksturÄ«gās tehnoloÄ£ijas, bet veidlapas izkārtojuma loÄ£ikai un saskarnes reakcijai tiek izmantots tas pats kods kā ā€œlielajāā€ 1C: Enterprise platformā.

Platforma "1C: Enterprise" - kas atrodas zem pārsega?
1C interfeiss operētājsistēmā Linux

Platforma "1C: Enterprise" - kas atrodas zem pārsega?
1C interfeiss mobilajā ierīcē

1C interfeiss citās platformās Platforma "1C: Enterprise" - kas atrodas zem pārsega?
1C interfeiss operētājsistēmā Windows OS

Platforma "1C: Enterprise" - kas atrodas zem pārsega?
Interfeiss 1C - tīmekļa klients

Atvērtais avots

Lai gan mēs neizmantojam standarta bibliotēkas C++ izstrādātājiem operētājsistēmā Windows (MFC, vadÄ«klas no WinAPI), mēs nerakstām visus komponentus paÅ”i. Par bibliotēku jau tika runāts wxWidget, un mēs arÄ« izmantojam:

Saraksts turpinās.
Turklāt mēs izmantojam ļoti modificētu versiju Google tests Šø Google izspēles izstrādājot vienÄ«bu testus.
Bibliotēkām bija nepiecieÅ”ama pielāgoÅ”ana, lai tās bÅ«tu saderÄ«gas ar SCOM komponentu organizācijas modeli.
1C izplatÄ«ba padara platformu par lielisku spēku pārbaudi tajā izmantotajām bibliotēkām. Dažādi lietotāji un scenāriji ātri atklāj kļūdas pat visretāk izmantotajās koda zonās. Mēs paÅ”i tos labojam un cenÅ”amies atdot bibliotēkas autoriem. MijiedarbÄ«bas pieredze izrādās ļoti dažāda.
Izstrādātāji čokuroÅ”anās Šø libetpan ātri reaģēt uz pull-pieprasÄ«jumiem, bet ielāps, piemēram, in OpenSSL Mums nekad neizdevās to atdot.

Secinājums

Rakstā mēs pieskārāmies vairākiem galvenajiem platformas 1C: Enterprise izstrādes aspektiem. Raksta ierobežotajā apjomā mēs pieskārāmies tikai dažiem interesantiem, mūsuprāt, aspektiem.
Var atrast vispārīgu aprakstu par dažādiem platformas mehānismiem Ŕeit.
Kādas tēmas jūs interesētu turpmākajos rakstos?

Kā tiek ieviesta 1C mobilā platforma?
TÄ«mekļa klienta iekŔējās struktÅ«ras apraksts?
Vai varbÅ«t jÅ«s interesē jaunu izlaidumu funkciju atlases, izstrādes un testÄ“Å”anas process?

Raksti komentāros!

Avots: www.habr.com

Pievieno komentāru