Tere, Habr!
Selles artiklis alustame jutustamist sellest, kuidas see seestpoolt töötab ja milliseid tehnoloogiaid selle arendamisel kasutatakse.

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, . 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 , 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 ().
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.

1C liides Linuxi operatsioonisüsteemil

1C liides mobiilseadmes
1C liides teistel platvormidel 
1C liides Windowsi operatsioonisüsteemil

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 , ja lisaks kasutame:
- HTTP ja FTP töötluseks.
- krüptograafia ja TLS ühenduste seadistamiseks
- XML-i analüüsimiseks
- postiprotokollidega (POP3, SMTP, IMAP) töötamiseks
- kliendimeili sõnumite analüüsimiseks
- kasutajate töölogide salvestamiseks
- rahvusvahelisteks töödeks
Loetelu võiks jätkuda.
Lisaks kasutame tugevalt muudetud versiooni ja ü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 ja reageerivad kiiresti pull-request'idele, kuid näiteks plaastrit 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 .
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
