Platvorm "1C: Enterprise" — mis peitub kapoti all?

Tere, Habr!
Selles artiklis alustame juttu sellest, kuidas see on korraldatud seestpoolt platvorm «1C:EttevÔte 8» ja milliseid tehnoloogiaid kasutatakse selle arendamisel.

Platvorm "1C: Enterprise" — mis peitub kapoti all?

Miks me arvame, et see on huvitav? Esiteks, sest platvorm «1C:EttevĂ”te 8» on suur (ĂŒle 10 miljoni koodirea) C++ (kliendi, serveri jne), JavaScripti (veebi klient) rakendus ja hiljuti ka Java. Suured projektid on huvitavad vĂ€hemalt oma ulatuse tĂ”ttu, kuna kĂŒsimused, mis jÀÀvad mĂ€rkamatuks vĂ€ikestes koodibaasides, tĂ”usevad sellistes projektides esile. Teiseks, «1C:EttevĂ”te» on reprodutseeritav, „karbihindadega” toode ning selliste arenduste kohta on Habrisis ĂŒsna vĂ€he artikleid. Ja alati on huvitav teada saada, kuidas teistes meeskondades ja ettevĂ”tetes elatakse.

Niisiis, alustame. Selles artiklis anname ĂŒlevaate mĂ”ningatest tehnoloogiatest, mida rakendatakse platvormil, ja joonistame maastikku, sĂŒvitsi minemata rakendusse. Paljude mehhanismide kohta on ĂŒksikasjalik jutt pigem eraldi artikkel vĂ”i isegi terve raamat!
Esmalt tasub paika panna pĂ”hiasjad — mis on platvorm «1C:EttevĂ”te» ja millest see koosneb. Sellele kĂŒsimusele pole lihtne vastata, kuna termina «Platvorm» all mĂ”istetakse lĂŒhidalt nii Ă€rirakenduste arendustööriistu, kĂ€ituskeskkonda kui ka haldusvahendeid. Üldiselt vĂ”ib vĂ€lja tuua jĂ€rgmised osad:

  • serverite klaster
  • „peen” klient, mis suudab serveriga ĂŒhendada http ja oma binaarprotokolli kaudu
  • kliendi rakendus kaheastmelise arhitektuuriga, mis töötab andmebaasiga, mis asub kĂ”vakettal vĂ”i vĂ”rgu kaustas
  • veebi klient
  • rakenduste serveri haldustooted
  • arenduskeskkond (tuntud kui Konfigurator)
  • teostuskeskkond iOS, Android ja Windows Phone jaoks (mobiilne platvorm 1C)

KÔik need osad, vÀlja arvatud veebi klient, on kirjutatud C++ keeles. Lisaks on hiljuti kuulutatud vÀlja uue pÔlvkonna Konfigurator, mis on kirjutatud Java keeles.

Kohalikud rakendused

Native rakenduste arendamiseks kasutatakse C++03. Windowsi all kasutatakse kompilaatorina Microsoft Visual C++ 12 (Windows XP ĂŒhilduv profiil), Linuxi ja Androidi puhul gcc 4.8 ning iOS-i puhul clang 5.0. Standardbiblioteek, mida kasutatakse, on kĂ”igi OS-ide ja kompilaatorite jaoks ĂŒhine — STLPort. See lahendus vĂ€hendab STL-i teostusele iseloomulike vigade tekkimise tĂ”enĂ€osust. Praegu plaanime ĂŒleminekut STL-ile, mida tarnib CLang, kuna STLPort on oma arendamise lĂ”petanud ja ei ĂŒhildu gcc-s lubatud C++11 toe reĆŸiimiga.
Serveri koodibaas on sel juhul 99% ĂŒhine, kliendi oma 95%. Pealegi kasutab isegi mobiiliplatvorm sama C++ koodi, mis "suurem", kuigi seal on ĂŒhtlustamise protsent veidi madalam.
Nagu enamik C++ kasutajaid, ei pretendeerime me keele ja selle raamatukogude 100% vĂ”imaluste kasutamisele. Niisiis, meil ei kasutata praktiliselt Boost'i ning keele vĂ”imalustest — dĂŒnaamilist tĂŒĂŒpide konverteerimist. Sellegipoolest kasutame aktiivselt:

  • STL (eriti stringid, konteinerid ja algoritmid)
  • mitme pĂ€randi, sealhulgas mitme pĂ€randi teostamine
  • ĆĄabloone
  • kuumale koodide asendamisele
  • nutikaid pointereid (oma teostus)

Mitme pÀrandi liideste (tÀiesti abstraktsete klasside) kasutamine vÔimaldab komponentide mudelit, millest rÀÀgime allpool.

Komponendid

Moodulsuse tagamiseks on kogu funktsionaalsus jagatud komponentideks, mis on dĂŒnaamilised raamatukogud (*.dll Windowsi all, *.so Linuxi all). Kokku on komponente rohkem kui sada viiskĂŒmmend, toome vĂ€lja mĂ”ne nende kirjeldused:

backend
Sisaldab platvormi metaandmete "mootorit"

accnt
Objektid, mida rakendusarendajad kasutavad raamatupidamise loomisel (arvelduskavad ja raamatupidamise registrid)

bsl
Siseprogrammi teostuse mootori mootor

nuke
Oma mÀlu allocatori teostus

dbeng8
Failibaasi mootori. Lihtne failiserveri andmebaas, mis on pÔhinev ISAM-il ja sisaldab ka lihtsat SQL-protsessorit

wbase
Sisaldab baasklasse ja funktsioone Windowsi kasutajaliidese rakendamiseks — aknaklassid, juurdepÀÀs GDI ja t.

Jagamine mitmeks komponendiks on kasulik mitmest vaatenurgast:

  • Jagamine soosib paremat disaini, eriti koodi paremat isoleerimist.
  • Komponentide komplektist saab paindlikult koostada erinevaid tarnimisvalikuid:
    • NĂ€iteks hĂ”lmas Ă”huke klient, kuid ei sisaldanud backend'i
    • ja serveris wbase, vastupidi, ei ole
    • Kuid mĂ”lemad variandid sisaldavad loomulikult nuke'i ja bsl'i

KÔik vajaliku kÀivitamiseks vajalikud komponendid laaditakse programmi kÀivitamisel. See on vajalik SCOM klasside registreerimiseks, millest juttu tuleb hiljem.

SCOM

Madalamal tasemel dekodeerimiseks kasutatakse SCOM sĂŒsteemi, mis on ideoloogiliselt sarnane ATL raamatukogule. Neile, kes ei ole ATL-iga töötanud, loetleme lĂŒhidalt pĂ”hivĂ”imalused ja omadused.
Eespecialiseeritud SCOM klassi jaoks:

  • Pakkuda tehase meetodeid, mis vĂ”imaldavad luua klassi, teades ainult selle nime (ilma rakenduse avalikustamiseta)
  • Pakkuda nutikate nĂ€idikute infrastruktuuri koos viidete loendamisega. SCOM klassi eluea ĂŒle ei pea kĂ€sitsi jĂ€lgima
  • VĂ”imaldab teada saada, kas objekt rakendab konkreetset liidest ja automaatselt viia objekti nĂ€idik liidese nĂ€idikuks
  • Luua teenusobjekt, mis on alati saadaval meetodi get_service kaudu jne.

NÀiteks vÔib manustada komponendis json.dll klassi JSON-i lugemiseks (nÀiteks JSONStreamReader).
Klassid, eksemplarid saab luua teistest komponentidest, registreerides SCOM-masinas:

SCOM_CLASS_ENTRY(JSONStreamReader)

See makro kirjeldab spetsiaalset staatilist klassiregistrit, mille konstruktor kutsutakse ĂŒles komponentide mĂ€lu laadimisel.
PĂ€rast seda saab luua selle eksemplari teises komponendis:

IJSONStreamReaderPtr jsonReader = create_instance(SCOM_CLSIDOF(JSONStreamReader));

Teenuste toetamiseks pakub SCOM tÀiendavat, piisavalt keerulist infrastruktuuri. Selle keskmes on SCOM-protsessi mÔisted, mis toimib kÀitatud teenuste konteinerina (st tegutseb Teenuse Locatorina) ja sisaldab ka sidumist lokaliseeritud ressurssidega. SCOM protsess sidub end OS-i lÔimiga. Selle tÔttu saab rakenduse sees teenuseid jÀrgmiselt hankida:

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

Lisaks sellele, et vahetades loogilisi (SCOM) protsesse, mis on seotud vooga, on vĂ”imalik saavutada praktiliselt sĂ”ltumatud rakendused teabepinna mĂ”ttes, mis töötavad ĂŒhe voolu raames. Nii on ĂŒles ehitatud meie Ă”huke klient, mis töötab failibaasi kasutades — ĂŒhe operatsioonisĂŒsteemi protsessi sees on kaks SCOM-protsessi, ĂŒks on seotud kliendi ja teine serveriga. Selline lĂ€henemine vĂ”imaldab standardiseerida koodi kirjutamist, mis töötab nii kohalikus failibaasis kui ka „pĂ€ris“ kliendi-serveri variandina. Sellise ĂŒhtsuse hind on tĂ€iendavad kulud, kuid praktika nĂ€itab, et need on seda vÀÀrt.

Komponentide mudeli SCOM pÔhjal on rakendatud nii Àriloogika kui ka liidese osa 1C: EttevÔtte jaoks.

Kasutajaliides

Muide, liidestest. Me ei kasuta Windowsi standardkontrolle, meie juhtseadmed on otseselt rakendatud Windows API-le. Linuxi versiooni jaoks on loodud kiht, mis töötab wxWidgets teegi kaudu.
Kontrollide teek ei sĂ”ltu teistest „1C: EttevĂ”tte“ osadest ja seda kasutatakse ka mitmes teises vĂ€ikestes sisemistes utiliitides.

1C: EttevĂ”tte arenguaastate jooksul on kontrollide vĂ€limus muutunud, kuid pĂ”himĂ”tetesse toimusid olulised muutused vaid ĂŒks kord, 2009. aastal, versiooni 8.2 vĂ€ljalaskmisega ja „haldatud vormide“ tutvustamisega. Lisaks vĂ€limuse muutusele on fundamentaalselt muutunud ka vormi komponeerimise printsiip - on loobutud piksel-piksel positsioneerimise printsiibist elementide voogkompodeerimise kasuks. Samuti töötavad uue mudeli kontrollid mitte otse domeeni objektidega, vaid spetsiaalsete DTO-dega (Andmeedastusobjektid).
Need muudatused vĂ”imaldasid luua veebiklient „1C: EttevĂ”tte“, mis kordab C++ loogikat kontrollide osas JavaScriptis. Me pĂŒĂŒame sĂ€ilitada funktsionaalset ekvivalentsust Ă”hukese ja veebikliendi vahel. Juhul, kui see pole vĂ”imalik, nĂ€iteks JavaScripti API kaudu kĂ€tte saadavatest piirangutest tulenevalt (nĂ€iteks failide töötlemise vĂ”imalused on vĂ€ga piiratud), rakendame sageli vajaliku funktsionaalsuse brauseri laienduste kaudu, mis on kirjutatud C++-s. Praegu toetame Internet Explorerit ja Microsoft Edge'i (Windows), Google Chrome'i (Windows), Firefoxi (Windows ja Linux) ning Safari't (MacOS).

Lisaks kasutatakse hallatavate vormide tehnoloogiat 1C mobiilirakenduste liidese loomiseks. Mobiilseadmetes on juhtseadmete joonistamine rakendatud operatsioonisĂŒsteemi "loomulike" tehnoloogiate abil, kuid vormi kompositsiooniloogika ja liidese reaktsioonide jaoks kasutatakse sama koodi, mis ka suurem platform "1C:EttevĂ”te".

Platvorm "1C: Enterprise" — mis peitub kapoti all?
1C liides Linuxi operatsioonisĂŒsteemis

Platvorm "1C: Enterprise" — mis peitub kapoti all?
1C liides mobiilseadmes

1C liides teistel platvormidel Platvorm "1C: Enterprise" — mis peitub kapoti all?
1C liides Windowsi operatsioonisĂŒsteemis

Platvorm "1C: Enterprise" — mis peitub kapoti all?
1C — veebiklient

Avatud lÀhtekoodiga

Kuigi me ei kasuta Windowsi jaoks C++ arendajate standardraamatukogusid (MFC, WinAPI juhtseaded), ei kirjuta me kÔiki komponente ise. Olemme juba maininud raamatukogu wxWidgets, ja kasutame veel:

  • cURL HTTP ja FTP töötluseks.
  • OpenSSL krĂŒptograafia ja TLS ĂŒhenduste seadistamiseks
  • libxml2 ja libxslt XML-i analĂŒĂŒsimiseks
  • libetpan postaliste protokollide (POP3, SMTP, IMAP) töötluseks
  • mimetic e-kirjade sĂ”numite analĂŒĂŒsimiseks
  • sqllite kasutajate töölogsude salvestamiseks
  • ICU rahvusvaheliseks lokaliseerimiseks

Loetelu vÔiks jÀtkuda.
Lisaks kasutame tugevalt muudetud versiooni Google Test ja Google Mock ĂŒksuste testide arendamisel.
Raamatukogud nĂ”udsid SCOM mudeliga komponentide ĂŒhilduvuseks kohandamist.
1C laialdane kasutamine teeb platvormist suurepĂ€rase testi selle raamatukogude vastupidavuse osas. Kasutajate ja stsenaariumide mitmekesisus tuvastab kiiresti vigu isegi kĂ”ige harvemini kasutatavates koodiosa. Me parame need enda juures ja pĂŒĂŒame tagasi anda raamatukogude autoritele. Koostöö kogemus on olnud vĂ€ga erinev.
Arendajad cURL ja libetpan kiiresti reageerivad pull-request'idele, kuid nÀiteks patƥi OpenSSL me ei saanud kunagi Àra anda.

KokkuvÔte

Artiklis kÀsitlesime mitmeid peamisi aspekte 1C: EttevÔtte platvormi arendamisest. Artikli piiratud mahus kÀsitlesime ainult mÔningaid huvitavaid aspekte, meie arvates.
Platvormi erinevate mehhanismide ĂŒldise kirjelduse leiate siit.
Millised teemad oleksid teile huvipakkuvad jÀrgmistes artiklites?

Kuidas on mobiiliplatvorm 1C rakendatud?
Veebiklientide sisemiste seadmete kirjeldus?
VÔi on teil huvi uute versioonide funktsioonide valimise, arendamise ja testimise protsessi vastu?

Kirjuta kommentaarides!

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster