Platvorm «1C: Ettevõte» — mis on kapoti all?

Tere, Habr!
Selles artiklis alustame jutustamist sellest, kuidas see seestpoolt töötab platvorm «1C: Ettevõte 8» ja milliseid tehnoloogiaid selle arendamisel kasutatakse.

Platvorm «1C: Ettevõte» — mis on kapoti all?

Miks me arvame, et see on huvitav? Esiteks, sest platvorm «1C: Ettevõte 8» on suur (üle 10 miljoni koodi rea) rakendus C++ keeles (kliendi-, serveri jne), JavaScriptis (veebi klient) ning, mis on hiljuti lisandunud, Java. Suured projektid on huvitavad juba oma suuruse tõttu, sest küsimused, mis väikestes koodibaasides jäävad märkamatuks, muutuvad sellistes projektides selgelt nähtavaks. Teiseks, «1C: Ettevõte» on korduv, „karbikeskus“, ja artikleid selliste arenduste kohta Habras on väga vähe. Ja alati on huvitav teada saada, kuidas teistes meeskondades ja ettevõtetes elatakse.

Nii et alustame. Selles artiklis anname ülevaate mõnedest tehnoloogiatest, mida platvormis kasutatakse, visandame maastiku, ilma sügavale rakendamisse süvenemata. Sest paljude mehhanismide detailne arutelu tooks kaasa eraldi artikli, mõnedel aga terve raamatu!
Alustuseks tasub selgusele jõuda, mis on «1C:Ettevõte» platvorm ja millest see koosneb. Vastus sellele küsimusele pole nii lihtne, sest termini «Platvorm» (tutvumisteks nimetame seda lihtsalt nii) alla kuuluvad nii ärirakenduste arendamise vahend kui ka käituskeskkond ja haldustooted. Üldiselt võib eristada järgmisi komponente:

  • serverikluster
  • «õhuke» klient, mis suudab serveriga ühendada http ja oma binaarprotokolli kaudu
  • klient tööks kahetasandilises arhitektuuris andmebaasiga, mis asub kõvakettal või võrgu kaustas
  • veebiklient
  • rakenduste serveri haldustooted
  • arenduskeskkond (tuntud kui Konfigureerija)
  • käituskeskkond iOS, Android ja Windows Phone jaoks (mobiilne 1C platvorm)

Kõik need osad, välja arvatud veebiklient, on kirjutatud C++-s. Lisaks on äsja välja kuulutatud uus põlvkond Konfigureerijat, mis on kirjutatud Java-s.

Natiivrakendused

Natiivsete rakenduste arendamiseks kasutatakse C++03. Windowsi puhul kasutatakse kompilatorina Microsoft Visual C++ 12 (Windows XP ühilduv profiil) ning Linuxi ja Androidi puhul gcc 4.8, iOS-i puhul aga clang 5.0. Standardbiblioteek on kõigi opsüsteemide ja kompilátorite jaoks ühtne — STLPort. See lahendus vähendab STL-i rakendusega seotud vigu. Praegu kavatseme üle minna STL-i rakendusele, mida pakub CLang, kuna STLPort on oma arenduse lõpetanud ja ei ühildu gcc-s sisse lülitatud C++11 toetusega.
Serveri koodibaas on 99% jagatud, kliendi oma aga 95%. Veelgi enam, isegi mobiilplatvorm kasutab sama C++ koodi, mis 'suurem', kuigi seal on ühtsuse määr veidi madalam.
Nagu enamik C++ kasutajaid, ei püüa me kasutada kõiki keele ja selle raamatukogude funktsioone. Näiteks kasutame harva Boost'i ning keele võimalustest peaaegu mitte üldse dünaamilist tüüpide teisendamist. Samas rakendame aktiivselt:

  • STL (eriti stringid, konteinerid ja algoritmid)
  • mitmikpärand, sealhulgas mitmikpärand rakendustest
  • mallid
  • erandid
  • nutikad viidikud (enda lahendus)

Liideste (täielikult abstraktsete klasside) mitmekordse pärimise kasutamine võimaldab komponentide mudelit, millest räägitakse edasi.

Komponendid

Modulaarsuse tagamiseks on kogu funktsionaalsus jagatud komponentideks, mis on dünaamilised raamatukogud (*.dll Windowsi jaoks, *.so Linuxi jaoks). Komponente on kokku rohkem kui poolsada, toome välja mõnede nende kirjeldused:

tagaosa
Sisaldab platvormi metaandmete "mootorit"

accnt
Objektid, mida rakenduste arendajad kasutavad raamatupidamise koostamiseks (bilansi plaanid ja raamatupidamisregister)

bsl
Sisseehitatud keele täitev mootor

nuke
Oma mälu jaoturi teostus

dbeng8
Failide andmebaasi mootor. Lihtne failiserveri andmebaasimootor, mis põhineb ISAM-il ning sisaldab ka lihtsat SQL-protsessorit

wbase
Sisaldab põhilisi klasse ja funktsioone Windowsi kasutajaliidese rakendamiseks — aknaklassid, juurdepääs GDI-le jne.

Jaotamine mitmeks komponendiks on kasulik mitmest vaatepunktist:

  • Jaotamine aitab parema disaini saavutamisele, sealhulgas koodi paremale isoleerimisele.
  • Komponentide komplektist saab paindlikult kokku panna erinevaid tarnevariante:
    • Näiteks, õhukese kliendi installatsioon sisaldab wbase'i, kuid mitte backend'i
    • ja serveris on vastupidi, wbase puudub
    • Mõlemad variandid sisaldavad kindlasti nuke'i ja bsl'i

Kõik selle käivitamise variandi jaoks vajalikud komponendid laaditakse programmi alguses. See on vajalik SCOM klasside registreerimiseks, mille kohta allpool juttu tuleb.

SCOM

Madalamal tasemel dekomponeerimiseks kasutatakse SCOM süsteemi — ideoloogiliselt sarnane ATL raamatukogule. Neile, kes ei ole ATL-iga töötanud, lühike loetelu peamistest võimalustest ja omadustest.
Spetsiaalselt vormistatud SCOM klassi jaoks:

  • Pakkub tehase meetodeid, mis võimaldavad luua klassi teisest komponendist, teades ainult selle nime (ilma rakenduse avamiseta)
  • Pakub nutikate viidete infrastruktuuri koos viidete arvestusega. SCOM klassi eluea eest ei pea käsitsi jälgima
  • Lubab teada, kas objekt rakendab kindlat interfaaži ja automaatselt viia objekti viidatud interfaažiks
  • Luua teenuse objekt, mis on alati kergesti kättesaadav meetodi get_service kaudu jne.

Näiteks võib json.dll komponendis kirjeldada klassi, mis loeb JSON-i (näiteks JSONStreamReader).
Klasse ja eksemplare, mida saab luua teistest komponentidest, tuleb registreerida SCOM-masinas:

SCOM_CLASS_ENTRY(JSONStreamReader)

See makro kirjeldab spetsiifilist staatilist klassi-registraatorit, mille konstruktor kutsutakse üles, kui komponent laaditakse mällu.
Pärast seda saab selle eksemplari luua teises komponendis:

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

SCOM toetab teenuste jaoks täiendavat ja piisavalt keerulist infrastruktuuri. Keskne mõisted on SCOM-protsess, mis teenib konteinerina käivitatud teenustele (st toimib Teenuse Otsijana) ja sisaldab samuti sidumist lokaliseeritavate ressurssidega. SCOM protsess seondub OS-i lõimuga. Tänu sellele saab rakenduses teenuseid sellisel moel saada:

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

Lisaks, lülitades loogilisi (SCOM) protsesse, mis on seotud vooluga, saab praktiliselt iseseisvaid rakendusi, mis toimivad ühe voolu raames. Selline on meie õhuke klient, mis töötab failibaasiga — ühe OPS-protsessi sees on kaks SCOM-protsessi, üks on seotud kliendi ja teine serveriga. Selline lähenemine võimaldab koodi kirjutamise ühtsust, mis töötab nii kohaliku failibaasi kui ka "reaalses" kliendiserveri variandis. Sellise ühtsuse hind on kulud, kuid praktika näitab, et need on seda väärt.

SCOM-i komponentide mudel põhjal on rakendatud nii äriloogika kui ka liidese osa 1C: Ettevõtte jaoks.

Kasutajaliides

Muide, liidestest. Me ei kasuta Windowsi standardkontrolle, meie juhtseadmestikud on otse realiseeritud Windows API-s. Linuxi versiooni jaoks on loodud vahekiht, mis töötab wxWidgets'i raamatukogu kaudu.
Juhtseadmestike teek ei sõltu mujalt 1C: Ettevõtte osadest ja seda kasutatakse ka mitmes muus väikestes sisemistes utiliitides.

1C:Enterprise'i arendamise aastate jooksul on kontrollide välimus muutunud, kuid põhimõttelised muudatused toimusid ainult kord, 2009. aastal, versiooni 8.2 väljastamisega ja „hallitavate vormide“ ilmumisega. Lisaks välimuse muutumisele muutus fundamentaalselt ka vormi koostamise põhimõte — loobuti pikselipõhisest elementide paigutamisest elementide voogude koostamise kasuks. Lisaks sellele töötavad uues mudelis juhtnupud mitte otse domeeni objektidega, vaid spetsiaalsete DTO-dega (Data Transfer Objects).
Need muutused võimaldasid luua 1C:Enterprise'i veebikliendi, mis kordab C++ kontrollide loogikat JavaScriptis. Püüame säilitada funktsionaalset ekvivalentsi õhukese ja veebikliendi vahel. Kui see pole võimalik, näiteks JavaScripti API-st saadud piirangute tõttu (nt failidega töötamise võimalused on väga piiratud), rakendame sageli vajaliku funktsionaalsuse brauseri laienduste abil, mis on kirjutatud C++. Hetkel toetame Internet Exploreri ja Microsoft Edge’i (Windows), Google Chrome’i (Windows), Firefoxi (Windows ja Linux) ja Safari (MacOS).

Lisaks kasutatakse hallatud vormide tehnoloogiat 1C mobiilirakenduste liidese loomisel. Mobiilseadmetes on juhtnuppude joonistamine rakendatud operatsioonisüsteemile 'looduslike' tehnoloogiate abil, kuid vormi paigutuse ja liidese reageerimise loogika jaoks kasutatakse sama koodi nagu suurtes 1C: Ettevõte platvormides.

Platvorm «1C: Ettevõte» — mis on kapoti all?
1C liides Linuxi operatsioonisüsteemil

Platvorm «1C: Ettevõte» — mis on kapoti all?
1C liides mobiilseadmes

1C liides teistel platvormidel Platvorm «1C: Ettevõte» — mis on kapoti all?
1C liides Windowsi operatsioonisüsteemil

Platvorm «1C: Ettevõte» — mis on kapoti all?
1C liides – veebiklient

Avatud lähtekood

Kuigi me ei kasuta Windowsile tüüpilisi C++ arendaja raamatukogusid (MFC, WinAPI juhtnupud), ei kirjuta me kõiki komponente ise. Juba oli mainitud raamatukogu wxWidgets, ja lisaks kasutame:

  • cURL HTTP ja FTP töötluseks.
  • OpenSSL krüptograafia ja TLS ühenduste seadistamiseks
  • libxml2 ja libxslt XML-i analüüsimiseks
  • libetpan postiprotokollidega (POP3, SMTP, IMAP) töötamiseks
  • mimetic kliendimeili sõnumite analüüsimiseks
  • sqlite kasutajate töölogide salvestamiseks
  • ICU rahvusvahelisteks töödeks

Loetelu võiks jätkuda.
Lisaks kasutame tugevalt muudetud versiooni Google Test ja Google Mock üksuse testide arendamisel.
Raamatukogude kohandamine oli vajalik, et need oleksid ühilduvad organisatsiooni komponentide SCOM mudeliga.
1C laialdane levik muudab platvormi suurepäraseks katsesüsteemiks kasutatavate raamatukogade jaoks. Kasutajate ja stsenaariumide mitmekesisus avastab vead kiiresti isegi kõige harvemini kasutatavates koodi osades. Me parandame need enda juures ja püüame need raamatukogude autoritele tagasi anda. Koostöö kogemus on väga erinev.
Arendajad cURL ja libetpan reageerivad kiiresti pull-request'idele, kuid näiteks plaastrit OpenSSL ei ole me siiani suutnud tagasi anda.

Kokkuvõte

Artiklis käsitlesime mitmeid peamisi aspekte 1C: Enterprise platvormi arendamisel. Artikli piiratud mahus puudutasime vaid mõningaid huvitavaid aspekte, meie arvates.
Erinevate platvormi mehhanismide üldkirjeldust saab vaadata siin.
Millised teemad oleksid Teile huvitavad järgmistes artiklites?

Kuidas on realiseeritud 1C mobiiliplatvorm?
Veebikliendi sisemise struktuuri kirjeldus?
Või on Teil huvi uute väljaannete funktsioonide valimise, arendamise ja testimise protsessi vastu?

Kirjutage kommentaarides!

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster