Platvorm "1C: Enterprise" - mis on kapoti all?

Tere Habr!
Selles artiklis alustame lugu sellest, kuidas see sees töötab platvorm "1C:Enterprise 8" ja milliseid tehnoloogiaid selle väljatöötamisel kasutatakse.

Platvorm "1C: Enterprise" - mis on kapoti all?

Miks see meie arvates huvitav on? Esiteks seetõttu, et platvorm 1C: Enterprise 8 on suur (rohkem kui 10 miljonit koodirida) rakendus C++ (klient, server jne), JavaScriptis (veebiklient) ja viimasel ajal ka Ja Java. Suured projektid võivad olla huvitavad vähemalt oma mastaabi poolest, sest sellistes projektides tekivad täies mahus probleemid, mis väikeses koodibaasis on nähtamatud. Teiseks on “1C:Enterprise” reprodutseeritav, “karbis” toode ja selliste arengute kohta on Habré lehel väga vähe artikleid. Samuti on alati huvitav teada, kuidas teistes meeskondades ja ettevõtetes elu käib.

Nii et alustame. Selles artiklis anname ülevaate mõnest platvormil kasutatavast tehnoloogiast ja anname ülevaate maastikust, ilma juurutusse süvenemata. Tõepoolest, paljude mehhanismide jaoks vajaks üksikasjalik lugu eraldi artiklit, mõne jaoks aga tervet raamatut!
Alustuseks tasub otsustada põhiliste asjade üle - mis on platvorm 1C:Enterprise ja millistest komponentidest see koosneb. Vastus sellele küsimusele pole nii lihtne, sest termin "Platvorm" (lühidalt nimetame seda nii) viitab vahendile ärirakenduste, käituskeskkonna ja haldustööriistade arendamiseks. Ligikaudu saab eristada järgmisi komponente:

  • serveri klaster
  • "õhuke" klient, mis suudab luua ühenduse serveriga http ja oma binaarprotokolli kaudu
  • klient kahetasandilise arhitektuuriga töötamiseks kõvakettal või võrgukaustas asuva andmebaasiga
  • veebiklient
  • rakendusserveri haldustööriistad
  • arenduskeskkond (tuntud kui konfiguraator)
  • käituskeskkond iOS-i, Androidi ja Windows Phone'i jaoks (mobiilne platvorm 1C)

Kõik need osad, välja arvatud veebiklient, on kirjutatud C++ keeles. Lisaks on hiljuti välja kuulutatud Uue põlvkonna konfiguraator, kirjutatud Java keeles.

Omarakendused

C++03 kasutatakse natiivsete rakenduste arendamiseks. Windowsi puhul kasutatakse kompilaatorina Microsoft Visual C++ 12 (Windows XP-ga ühilduv profiil) ning Linuxi ja Androidi puhul - gcc 4.8, iOS-i puhul - clang 5.0. Standardne teek, mida kasutatakse kõigi operatsioonisüsteemide ja kompilaatorite jaoks, on STLPort. See lahendus vähendab STL-i juurutusspetsiifiliste vigade tõenäosust. Praegu plaanime üle minna CLangiga kaasas olevale STL-i juurutamisele, kuna STLPort on lõpetatud ja ei ühildu gcc C++11 toega režiimiga.
Serveri koodibaas on 99% ühine, kliendi oma - 95%. Veelgi enam, isegi mobiiliplatvorm kasutab sama C++ koodi, mis “suur”, kuigi seal on ühtlustamisprotsent mõnevõrra väiksem.
Nagu enamik C++ kasutajaid, ei väida me, et kasutame 100% keele ja selle teekide võimalusi. Niisiis, me Boosti praktiliselt ei kasuta ja üks keelefunktsioonidest on dünaamiline tüübi ülekandmine. Samal ajal kasutame aktiivselt:

  • STL (täpsemalt stringid, konteinerid ja algoritmid)
  • mitmikpärand, sh. mitme rakenduse pärand
  • malle
  • erandeid
  • nutikad näpunäited (kohandatud rakendamine)

Kasutades liideste (täiesti abstraktsete klasside) mitut pärimist, saab võimalikuks komponentmudel, mida arutatakse allpool.

Komponendid

Modulaarsuse tagamiseks on kogu funktsionaalsus jagatud komponentideks, milleks on dünaamilised teegid (*.dll Windowsile, *.so Linuxile). Kokku on rohkem kui sada viiskümmend komponenti, siin on mõnede kirjeldused:

backend
Sisaldab platvormi metaandmete mootorit

accnt
Objektid, mida rakenduste arendajad kasutavad raamatupidamiskirjete (kontoplaanid ja raamatupidamisregistrid) koostamiseks

bsl
Manustatud keele täitmismootor

nuke
Mälujaoturi kohandatud rakendamine

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

wbase
Sisaldab Windowsi kasutajaliidese juurutamise baasklasse ja funktsioone – aknaklassid, GDI ligipääs jne.

Mitmeks komponendiks jagamine on kasulik mitmest vaatenurgast:

  • Eraldamine soodustab paremat disaini, eriti paremat koodi eraldamist
  • Komponentide komplektist saate paindlikult kokku panna erinevad tarnevõimalused:
    • Näiteks sisaldab õhuke kliendi install wbase'i, kuid sellel ei ole taustaprogrammi
    • aga wbase serveris, vastupidi, seda ei tehta
    • mõlemad valikud sisaldavad loomulikult nuke ja bsl

Kõik selle käivitusvaliku jaoks vajalikud komponendid laaditakse programmi käivitumisel. See on eriti vajalik SCOM-klasside registreerimiseks, mida arutatakse allpool.

SCOM

Madalamal tasemel lagundamiseks kasutatakse SCOM-süsteemi, mis on ATL-i ideoloogiaga sarnane raamatukogu. Neile, kes pole ATL-iga töötanud, loetleme lühidalt peamised võimalused ja funktsioonid.
Spetsiaalselt loodud SCOM-klassi jaoks:

  • Pakub tehase meetodeid, mis võimaldavad teil luua klassi teisest komponendist, teades ainult selle nime (rakendust avaldamata)
  • Pakub viiteloendusega nutika osuti infrastruktuuri. SCOM-klassi eluiga pole vaja käsitsi jälgida
  • Võimaldab teil teada saada, kas objekt rakendab konkreetset liidest ja teisendada automaatselt objektile suunatud kursori liidese osutajaks
  • Looge teenindusobjekt, mis on alati juurdepääsetav meetodi get_service jne kaudu.

Näiteks saate kirjeldada klassi JSON-i lugemiseks (nt JSONStreamReader) komponendis json.dll.
Klassid ja eksemplarid saab luua muudest komponentidest; need tuleb registreerida SCOM-i masinas:

SCOM_CLASS_ENTRY(JSONStreamReader)

See makro kirjeldab spetsiaalset staatilise salvesti klassi, mille konstruktor kutsutakse välja komponendi mällu laadimisel.
Pärast seda saate luua selle eksemplari teises komponendis:

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

Teenuste toetamiseks pakub SCOM täiendavat, üsna keerukat infrastruktuuri. Selle kesksel kohal on SCOM-protsessi kontseptsioon, mis toimib teenuste käitamise konteinerina (st mängib teenuselookija rolli) ja sisaldab ka sidumist lokaliseeritud ressurssidega. SCOM-protsess on seotud OS-i lõimega. Tänu sellele saate rakenduses selliseid teenuseid saada:

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

Veelgi enam, lõimega seotud loogilisi (SCOM) protsesse vahetades saate sama lõime sees töötavaid rakendusi, mis on inforuumi seisukohast praktiliselt sõltumatud. Nii töötab meie õhuke klient failiandmebaasiga – ühe OS-i protsessi sees on kaks SCOM-i protsessi, millest üks on seotud kliendiga ja teine ​​serveriga. See lähenemisviis võimaldab meil ühtlustada koodi kirjutamist, mis töötab nii kohalikus failiandmebaasis kui ka "päris" klient-serveri versioonis. Sellise ühtluse hind on üldkulud, kuid praktika näitab, et see on seda väärt.

SCOM-i komponendi mudeli alusel rakendatakse nii 1C: Enterprise'i äriloogikat kui ka liidese osa.

Kasutajaliides

Muide, liideste kohta. Me ei kasuta standardseid Windowsi juhtelemente; meie juhtelemendid on rakendatud otse Windows API-s. Linuxi versiooni jaoks on tehtud kiht, mis töötab wxWidgetsi teegi kaudu.
Juhtelementide teek ei sõltu 1C:Enterprise'i muudest osadest ja me kasutame seda mitmes teises väikeses sisemises utiliitis.

1C:Enterprise'i arendamise aastate jooksul on juhtelementide välimus muutunud, kuid tõsine põhimõtete muutus toimus ainult üks kord, 2009. aastal, kui ilmus versioon 8.2 ja ilmusid hallatavad vormid. Lisaks välimuse muutmisele on põhimõtteliselt muutunud ka vormipaigutuse põhimõte – elementide pikslite kaupa positsioneerimine lükati tagasi elementide voolupaigutuse kasuks. Lisaks ei tööta uues mudelis juhtelemendid otse domeeniobjektidega, vaid spetsiaalsete DTO-dega (Andmeedastusobjektid).
Need muudatused võimaldasid luua 1C:Enterprise veebikliendi, mis kordab JavaScripti juhtelementide C++ loogikat. Püüame säilitada funktsionaalse samaväärsuse õhukeste ja veebiklientide vahel. Juhtudel, kui see pole võimalik, näiteks saadaoleva JavaScript API piirangute tõttu (näiteks failidega töötamise võimalus on väga piiratud), rakendame sageli vajalikke funktsioone kasutades C++ keeles kirjutatud brauseri laiendusi. Praegu toetame Internet Explorerit ja Microsoft Edge'i (Windows), Google Chrome'i (Windows), Firefoxi (Windows ja Linux) ja Safarit (MacOS).

Lisaks kasutatakse hallatavate vormide tehnoloogiat mobiilirakenduste liidese loomiseks platvormil 1C. Mobiilseadmetes rakendatakse juhtnuppude renderdamist operatsioonisüsteemile omaste tehnoloogiate abil, kuid vormipaigutuse loogika ja liidese vastuse jaoks kasutatakse sama koodi, mis “suurel” 1C:Enterprise platvormil.

Platvorm "1C: Enterprise" - mis on kapoti all?
1C liides Linux OS-is

Platvorm "1C: Enterprise" - mis on kapoti all?
1C liides mobiilseadmes

1C liides teistel platvormidel Platvorm "1C: Enterprise" - mis on kapoti all?
1C liides Windows OS-is

Platvorm "1C: Enterprise" - mis on kapoti all?
Liides 1C - veebiklient

Avatud lähtekoodiga

Kuigi me ei kasuta Windowsi all C++ arendajatele mõeldud standardteeke (MFC, juhtelemendid WinAPI-st), ei kirjuta me kõiki komponente ise. Raamatukogust on juba juttu olnud wxVidinadja kasutame ka:

Loetelu jätkub.
Lisaks kasutame väga muudetud versiooni Google'i test и Google Mock ühikutestide väljatöötamisel.
Teegid vajasid kohandamist, et need ühilduksid SCOM-i komponentide organisatsiooni mudeliga.
1C levimus muudab platvormi selles kasutatavate raamatukogude jaoks suurepäraseks jõuprooviks. Erinevad kasutajad ja stsenaariumid paljastavad kiiresti vead isegi kõige harvemini kasutatavates koodipiirkondades. Parandame need ise ja püüame raamatukogu autoritele tagasi anda. Interaktsioonikogemus osutub väga erinevaks.
Arendajad Curl и libetpan tõmbetaotlustele kiiresti vastata, kuid plaaster näiteks sisse OpenSSL Meil ei õnnestunud seda kunagi tagasi anda.

Järeldus

Artiklis puudutasime mitmeid platvormi 1C: Enterprise arendamise põhiaspekte. Artikli piiratud ulatuses puudutasime vaid mõnda meie arvates huvitavat aspekti.
Erinevate platvormimehhanismide üldise kirjelduse leiate siin.
Millised teemad võiksid teile tulevastes artiklites huvi pakkuda?

Kuidas 1C mobiiliplatvormi rakendatakse?
Veebikliendi sisemise struktuuri kirjeldus?
Või äkki olete huvitatud uute versioonide funktsioonide valimise, arendamise ja testimise protsessist?

Kirjuta kommentaaridesse!

Allikas: www.habr.com

Lisa kommentaar