Tere, Habr!
Selles artiklis alustame juttu sellest, kuidas see on korraldatud seestpoolt ja milliseid tehnoloogiaid kasutatakse selle arendamisel.

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

1C liides Linuxi operatsioonisĂŒsteemis

1C liides mobiilseadmes
1C liides teistel platvormidel 
1C liides Windowsi operatsioonisĂŒsteemis

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 , ja kasutame veel:
- HTTP ja FTP töötluseks.
- krĂŒptograafia ja TLS ĂŒhenduste seadistamiseks
- XML-i analĂŒĂŒsimiseks
- postaliste protokollide (POP3, SMTP, IMAP) töötluseks
- e-kirjade sĂ”numite analĂŒĂŒsimiseks
- kasutajate töölogsude salvestamiseks
- rahvusvaheliseks lokaliseerimiseks
Loetelu vÔiks jÀtkuda.
Lisaks kasutame tugevalt muudetud versiooni ja ĂŒ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 ja kiiresti reageerivad pull-request'idele, kuid nÀiteks patƥi 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 .
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
