Platforma „1C: Enterprise“ - kas yra po gaubtu?

Sveiki, Habr!
Šiame straipsnyje mes pradėsime istoriją apie tai, kaip tai veikia viduje platforma „1C:Enterprise 8“ ir kokios technologijos naudojamos jį kuriant.

Platforma „1C: Enterprise“ - kas yra po gaubtu?

Kodėl manome, kad tai įdomu? Pirma, todėl, kad 1C:Enterprise 8 platforma yra didelė (daugiau nei 10 milijonų kodo eilučių) programa C++ (klientas, serveris ir kt.), JavaScript (žiniatinklio klientas) ir pastaruoju metu. Java. Dideli projektai gali būti įdomūs bent jau dėl savo masto, nes mažoje kodų bazėje nematomos problemos tokiuose projektuose iškyla visu pajėgumu. Antra, „1C:Enterprise“ yra pakartojamas, „supakuotas“ produktas, ir apie tokius pokyčius „Habré“ yra labai mažai straipsnių. Taip pat visada įdomu sužinoti, kaip gyvenimas vyksta kitose komandose ir įmonėse.

Taigi pradėkime. Šiame straipsnyje apžvelgsime kai kurias platformoje naudojamas technologijas ir apibūdinsime kraštovaizdį, nesigilindami į diegimą. Iš tiesų, daugeliui mechanizmų detaliai istorijai reikėtų atskiro straipsnio, o kai kuriems – visos knygos!
Pirmiausia verta nuspręsti dėl pagrindinių dalykų - kas yra platforma „1C: Enterprise“ ir iš kokių komponentų ji susideda. Atsakymas į šį klausimą nėra toks paprastas, nes terminas „Platforma“ (dėl trumpumo taip vadinsime) reiškia verslo taikomųjų programų kūrimo priemonę, vykdymo aplinką ir administravimo įrankius. Apytiksliai galima išskirti šiuos komponentus:

  • serverių klasteris
  • „Plonas“ klientas, galintis prisijungti prie serverio per http ir savo dvejetainį protokolą
  • klientas, skirtas dirbti dviejų pakopų architektūroje su duomenų baze, esančia standžiajame diske arba tinklo aplanke
  • žiniatinklio klientas
  • taikomųjų programų serverio administravimo įrankiai
  • kūrimo aplinka (žinoma kaip konfigūratorius)
  • vykdymo aplinka, skirta iOS, Android ir Windows Phone (mobilioji platforma 1C)

Visos šios dalys, išskyrus žiniatinklio klientą, parašytos C++ kalba. Be to, yra neseniai paskelbtas Naujos kartos konfigūratorius, parašyta Java.

Vietinės programos

C++03 naudojamas vietinėms programoms kurti. Windows sistemoje kaip kompiliatorius naudojamas Microsoft Visual C++ 12 (profilis, suderinamas su Windows XP), o Linux ir Android - gcc 4.8, iOS - clang 5.0. Naudojama standartinė biblioteka visoms operacinėms sistemoms ir kompiliatoriams – STLPort. Šis sprendimas sumažina su STL diegimu susijusių klaidų tikimybę. Šiuo metu planuojame pereiti prie STL diegimo, pateikto kartu su CLang, nes STLPort buvo nutrauktas ir nesuderinamas su gcc C++11 režimu.
Serverio kodų bazė yra 99% bendra, kliento – 95%. Be to, net mobilioji platforma naudoja tą patį C++ kodą kaip ir „didžioji“, nors ten suvienodinimo procentas yra kiek mažesnis.
Kaip ir dauguma C++ vartotojų, mes netvirtiname, kad naudojame 100% kalbos ir jos bibliotekų galimybių. Taigi, „Boost“ praktiškai nenaudojame, o viena iš kalbos ypatybių yra dinaminio tipo liejimas. Tuo pačiu metu aktyviai naudojame:

  • STL (konkrečiai eilutės, konteineriai ir algoritmai)
  • daugybinis paveldėjimas, įskaitant. daugialypis įgyvendinimo paveldėjimas
  • šablonai
  • išimtys
  • išmaniosios nuorodos (priskirtas diegimas)

Naudojant daugialypį sąsajų paveldėjimą (visiškai abstrakčias klases), tampa įmanomas komponentų modelis, kuris bus aptartas toliau.

Komponentai

Siekiant užtikrinti moduliškumą, visos funkcijos yra suskirstytos į komponentus, kurie yra dinaminės bibliotekos (*.dll Windows, *.so Linux). Iš viso yra daugiau nei šimtas penkiasdešimt komponentų; čia yra kai kurių iš jų aprašymai:

posistemės
Yra platformos metaduomenų variklis

accnt
Objektai, kuriuos programų kūrėjai naudoja kurdami apskaitos įrašus (sąskaitų planus ir apskaitos registrus)

bsl
Įterptasis kalbos vykdymo variklis

branduolinis
Pasirinktinis atminties skirstytuvo įgyvendinimas

dbeng8
Failų duomenų bazės variklis. Paprastas failų serverio duomenų bazės variklis, pagrįstas ISAM, kuriame taip pat yra paprastas SQL procesorius

wbase
Jame yra pagrindinės klasės ir funkcijos, skirtos „Windows“ vartotojo sąsajai įdiegti – langų klasės, GDI prieiga ir kt.

Padalijimas į kelis komponentus naudingas keliais požiūriais:

  • Atskyrimas skatina geresnį dizainą, ypač geresnį kodo izoliavimą
  • Iš komponentų rinkinio galite lanksčiai surinkti skirtingus pristatymo variantus:
    • Pavyzdžiui, plonojo kliento diegime bus wbase, bet neturės backend
    • bet wbase serveryje, atvirkščiai, to nebus
    • abiejose parinktyse, žinoma, bus nuke ir bsl

Visi komponentai, reikalingi šiai paleidimo parinkčiai, įkeliami paleidus programą. Tai ypač reikalinga registruojant SCOM klases, kurios bus aptartos toliau.

SCOM

Žemesnio lygio skaidymui naudojama SCOM sistema – biblioteka, savo ideologija panaši į ATL. Tiems, kurie nedirbo su ATL, trumpai išvardijame pagrindines galimybes ir funkcijas.
Specialiai sukurtai SCOM klasei:

  • Pateikiami gamykliniai metodai, leidžiantys sukurti klasę iš kito komponento žinant tik jo pavadinimą (neatskleidžiant įgyvendinimo)
  • Suteikia nuorodų skaičiavimo išmaniojo rodyklės infrastruktūrą. SCOM klasės veikimo laiko nereikia stebėti rankiniu būdu
  • Leidžia sužinoti, ar objektas įgyvendina konkrečią sąsają, ir automatiškai konvertuoti objekto žymeklį į sąsajos žymeklį
  • Sukurkite paslaugos objektą, kuris visada pasiekiamas naudojant get_service metodą ir kt.

Pavyzdžiui, galite aprašyti JSON skaitymo klasę (pvz., JSONStreamReader) komponente json.dll.
Klasės ir egzemplioriai gali būti sukurti iš kitų komponentų; jie turi būti užregistruoti SCOM įrenginyje:

SCOM_CLASS_ENTRY(JSONStreamReader)

Ši makrokomanda aprašys specialią statinio įrašymo klasę, kurios konstruktorius bus iškviestas, kai komponentas bus įkeltas į atmintį.
Po to galite sukurti jo egzempliorių kitame komponente:

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

Paslaugoms palaikyti SCOM siūlo papildomą, gana sudėtingą infrastruktūrą. Jame svarbiausia yra SCOM proceso koncepcija, kuri tarnauja kaip tarnybų vykdymo talpykla (t. y. atlieka paslaugų lokatoriaus vaidmenį), taip pat yra susiejama su lokalizuotais ištekliais. SCOM procesas yra susietas su OS gija. Dėl to programoje galite gauti tokias paslaugas kaip:

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

Be to, perjungdami loginius (SCOM) procesus, susietus su gija, galite gauti informacijos erdvės požiūriu praktiškai nepriklausomas programas, veikiančias toje pačioje gijoje. Taip mūsų plonasis klientas veikia su failų duomenų baze – viename OS procese yra du SCOM procesai, vienas susietas su klientu, o antrasis su serveriu. Šis metodas leidžia suvienodinti kodo rašymą, kuris veiks tiek vietinėje failų duomenų bazėje, tiek „tikrojoje“ kliento-serverio versijoje. Tokio vienodumo kaina yra didelė, tačiau praktika rodo, kad tai verta.

Remiantis SCOM komponento modeliu, yra įdiegta ir verslo logika, ir 1C: Enterprise sąsajos dalis.

Vartotojo sąsaja

Beje, apie sąsajas. Nenaudojame standartinių „Windows“ valdiklių; mūsų valdikliai yra įdiegti tiesiogiai „Windows“ API. „Linux“ versijai buvo sukurtas sluoksnis, veikiantis per wxWidgets biblioteką.
Valdiklių biblioteka nepriklauso nuo kitų 1C:Enterprise dalių ir yra naudojama keliose kitose mažose vidinėse paslaugų programose.

Per daugelį „1C:Enterprise“ kūrimo metų valdiklių išvaizda pasikeitė, tačiau rimtas principų pasikeitimas įvyko tik vieną kartą, 2009 m., Išleidus 8.2 versiją ir atsiradus „valdomoms formoms“. Be išvaizdos pakeitimo, iš esmės pasikeitė ir formos išdėstymo principas – buvo atmestas elementų išdėstymas pikseliais po pikselių, o elementų išdėstymas srautu. Be to, naujajame modelyje valdikliai veikia ne tiesiogiai su domeno objektais, o su specialiais DTO (Duomenų perdavimo objektai).
Šie pakeitimai leido sukurti 1C:Enterprise žiniatinklio klientą, kuris atkartoja JavaScript valdiklių C++ logiką. Stengiamės išlaikyti funkcinį lygiavertiškumą tarp plonųjų ir interneto klientų. Tais atvejais, kai tai neįmanoma, pavyzdžiui, dėl turimos JavaScript API apribojimų (pavyzdžiui, galimybė dirbti su failais yra labai ribota), mes dažnai įdiegiame reikiamas funkcijas naudodami naršyklės plėtinius, parašytus C++ kalba. Šiuo metu palaikome Internet Explorer ir Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows ir Linux) ir Safari (MacOS).

Be to, valdomų formų technologija naudojama kuriant sąsają mobiliosioms programoms 1C platformoje. Mobiliuosiuose įrenginiuose valdiklių atvaizdavimas įgyvendinamas naudojant operacinei sistemai būdingas technologijas, tačiau formos išdėstymo logikai ir sąsajos atsakui naudojamas tas pats kodas kaip ir „didžiojoje“ 1C:Enterprise platformoje.

Platforma „1C: Enterprise“ - kas yra po gaubtu?
1C sąsaja Linux OS

Platforma „1C: Enterprise“ - kas yra po gaubtu?
1C sąsaja mobiliajame įrenginyje

1C sąsaja kitose platformose Platforma „1C: Enterprise“ - kas yra po gaubtu?
1C sąsaja Windows OS

Platforma „1C: Enterprise“ - kas yra po gaubtu?
1C sąsaja - žiniatinklio klientas

Atviro kodo

Nors nenaudojame standartinių bibliotekų, skirtų C++ kūrėjams su Windows operacine sistema (MFC, valdikliai iš WinAPI), visų komponentų rašome ne patys. Biblioteka jau buvo paminėta „wxWidgets“, taip pat naudojame:

Sąrašas tęsiasi.
Be to, mes naudojame labai modifikuotą versiją Google testas и Google Mock kuriant vienetinius testus.
Bibliotekoms reikėjo pritaikymo, kad jos būtų suderinamos su SCOM komponentų organizavimo modeliu.
Dėl 1C paplitimo platforma yra puikus joje naudojamų bibliotekų stiprumo išbandymas. Įvairūs vartotojai ir scenarijai greitai atskleidžia klaidas net ir rečiausiai naudojamose kodo srityse. Patys juos taisome ir stengiamės grąžinti bibliotekos autoriams. Sąveikos patirtis pasirodo labai skirtinga.
Kūrėjai raitytis и libetpan greitai reaguoti į ištraukimo užklausas, bet pleistras, pavyzdžiui, į OpenSSL Mums niekada nepavyko jo grąžinti.

išvada

Straipsnyje palietėme keletą pagrindinių „1C: Enterprise“ platformos kūrimo aspektų. Ribotoje straipsnio apimtyje palietėme tik keletą įdomių, mūsų nuomone, aspektų.
Galima rasti bendrą įvairių platformos mechanizmų aprašymą čia.
Kokios temos jus domina būsimuose straipsniuose?

Kaip įdiegta 1C mobilioji platforma?
Žiniatinklio kliento vidinės struktūros aprašymas?
O gal jus domina naujų leidimų funkcijų atrankos, kūrimo ir testavimo procesas?

Rašyk komentaruose!

Šaltinis: www.habr.com

Добавить комментарий