Par 1C tīmekļa klientu

Viena no 1C:Enterprise tehnoloģijas jaukajām iezīmēm ir tā, ka lietojumprogrammu risinājumu, kas izstrādāts, izmantojot pārvaldīto formu tehnoloģiju, var palaist gan plānā (izpildāmā) klientā operētājsistēmai Windows, Linux, MacOS X, gan kā tīmekļa klientu 5 pārlūkprogrammām - Chrome, Internet Explorer, Firefox, Safari, Edge un tas viss, nemainot lietojumprogrammas pirmkodu. Turklāt ārēji lietojumprogramma plānā klientā un pārlūkprogrammā darbojas un izskatās gandrīz identiski.
Atrodiet 10 atŔķirÄ«bas (2 attēli zem griezuma):

Plāns klienta logs operētājsistēmā Linux:

Par 1C tīmekļa klientu

Tas pats logs tīmekļa klientā (pārlūkā Chrome):

Par 1C tīmekļa klientu

Kāpēc mēs izveidojām tÄ«mekļa klientu? Nedaudz nožēlojami izsakoties, laiks mums ir izvirzÄ«jis Ŕādu uzdevumu. Darbs internetā jau sen ir bijis priekÅ”noteikums biznesa lietojumprogrammām. Pirmkārt, mēs savam plānajam klientam pievienojām iespēju strādāt, izmantojot internetu (daži no mÅ«su konkurentiem, starp citu, apstājās pie tā; citi, gluži pretēji, atteicās no plānā klienta un aprobežojās ar tÄ«mekļa klienta ievieÅ”anu). Mēs nolēmām sniegt saviem lietotājiem iespēju izvēlēties sev piemērotāko klienta iespēju.

Par 1C tīmekļa klientu

TÄ«mekļa iespēju pievienoÅ”ana plānajam klientam bija liels projekts, kurā tika pilnÄ«bā mainÄ«ta klienta-servera arhitektÅ«ra. TÄ«mekļa klienta izveide ir pilnÄ«gi jauns projekts, kas sākas no nulles.

Problēmas paziņojums

Tātad, projekta prasības: tīmekļa klientam ir jādara tas pats, kas plānajam klientam, proti:

  1. Displeja lietotāja interfeiss
  2. Izpildiet klienta kodu, kas rakstīts 1C valodā

Lietotāja saskarne 1C ir aprakstīta vizuālā redaktorā, bet deklaratīvi, bez elementu izkārtojuma pa pikseļiem; Tiek izmantoti aptuveni trīs desmiti interfeisa elementu veidi - pogas, ievades lauki (teksts, skaitļi, datums/laiks), saraksti, tabulas, grafiki utt.

Klienta kods 1C valodā var saturēt servera zvanus, darbu ar vietējiem resursiem (failiem utt.), DrukāŔanu un daudz ko citu.

Gan plānais klients (strādājot, izmantojot tīmekli), gan tīmekļa klients izmanto vienu un to paŔu tīmekļa pakalpojumu kopu, lai sazinātos ar 1C lietojumprogrammu serveri. Klientu implementācijas, protams, ir dažādas - plānais klients ir rakstīts C++, tīmekļa klients ir rakstīts JavaScript.

Nedaudz vēstures

TÄ«mekļa klienta projekts tika uzsākts 2006. gadā, komandā (vidēji) 5 cilvēki. AtseviŔķos projekta posmos tika piesaistÄ«ti izstrādātāji, lai ieviestu konkrētu funkcionalitāti (izklājlapu dokuments, diagrammas utt.); parasti tie bija tie paÅ”i izstrādātāji, kuri veica Å”o funkcionalitāti plānā klientā. Tie. izstrādātāji pārrakstÄ«ja komponentus JavaScript, ko viņi iepriekÅ” bija izveidojuÅ”i programmā C++.

No paÅ”a sākuma mēs noraidÄ«jām ideju par jebkādu automātisku (pat daļēju) C++ plānā klienta koda pārveidoÅ”anu par JavaScript tÄ«mekļa klientu, jo starp abām valodām pastāv spēcÄ«gās konceptuālās atŔķirÄ«bas; tÄ«mekļa klients tika uzrakstÄ«ts JavaScript no jauna.

Pirmajās projekta iterācijās tÄ«mekļa klients klienta kodu iebÅ«vētajā 1C valodā pārveidoja tieÅ”i par JavaScript. Plānais klients darbojas atŔķirÄ«gi - kods iebÅ«vētajā 1C valodā tiek apkopots baitkodā, un pēc tam Å”is baitkods tiek interpretēts klientam. Pēc tam tÄ«mekļa klients sāka darÄ«t to paÅ”u - pirmkārt, tas deva veiktspējas pieaugumu, un, otrkārt, tas ļāva apvienot plāno un tÄ«mekļa klientu arhitektÅ«ru.

Pirmā platformas 1C:Enterprise versija ar tÄ«mekļa klientu atbalstu tika izlaista 2009. gadā. TÄ«mekļa klients tajā laikā atbalstÄ«ja 2 pārlÅ«kprogrammas - Internet Explorer un Firefox. Sākotnējos plānos bija atbalsts Operai, taču tobrÄ«d nepārvaramo problēmu dēļ ar aplikāciju slēgÅ”anas apstrādātājiem Operā (nebija iespējams ar 100% pārliecÄ«bu izsekot, ka aplikācija beidzas, un tajā brÄ«dÄ« veikt atvienoÅ”anas procedÅ«ru no plkst. 1C lietojumprogrammu serveris) no Å”iem plāniem bija jāatsakās.

Projekta struktūra

Kopumā platformā 1C: Enterprise ir 4 JavaScript valodā rakstīti projekti:

  1. WebTools ā€“ koplietojamās bibliotēkas, ko izmanto citi projekti (mēs iekļaujam arÄ« Google slēgÅ”anas bibliotēka).
  2. Vadības elements FormattedDocument (ieviests JavaScript gan plānā klientā, gan tīmekļa klientā)
  3. Vadības elements Plānotājs (ieviests JavaScript gan plānā klientā, gan tīmekļa klientā)
  4. Web klients

Katra projekta struktÅ«ra atgādina Java projektu struktÅ«ru (vai .NET projektu - atkarÄ«bā no tā, kurÅ” ir tuvāks); Mums ir nosaukumvietas, un katra nosaukumvieta atrodas atseviŔķā mapē. Mapē ir faili un nosaukumvietas klases. TÄ«mekļa klienta projektā ir aptuveni 1000 failu.

Strukturāli tÄ«mekļa klients lielākoties ir sadalÄ«ts Ŕādās apakÅ”sistēmās:

  • PārvaldÄ«ta klienta lietojumprogrammas saskarne
    • Vispārējs lietojumprogrammu interfeiss (sistēmas izvēlnes, paneļi)
    • PārvaldÄ«to formu saskarne, kas cita starpā ietver aptuveni 30 vadÄ«klas (pogas, dažāda veida ievades lauki - teksts, skaitļi, datums/laiks utt., tabulas, saraksti, grafiki utt.)

  • Klienta izstrādātājiem pieejams objekta modelis (kopā vairāk nekā 400 veidu: pārvaldÄ«tā interfeisa objekta modelis, datu izkārtojuma iestatÄ«jumi, nosacÄ«juma stils utt.)
  • IebÅ«vētās 1C valodas tulks
  • PārlÅ«ka paplaÅ”inājumi (izmanto funkcionalitātei, kas netiek atbalstÄ«ta JavaScript)
    • Darbs ar kriptogrāfiju
    • Darbs ar failiem
    • Ārējo komponentu tehnoloÄ£ija, kas ļauj tos izmantot gan plānos, gan tÄ«mekļa klientiem

Attīstības iezīmes

Visu iepriekÅ” minēto ieviest JavaScript programmā nav viegli. Iespējams, 1C tÄ«mekļa klients ir viena no lielākajām klienta puses lietojumprogrammām, kas rakstÄ«tas JavaScript ā€” aptuveni 450.000 XNUMX rindiņu. TÄ«mekļa klienta kodā mēs aktÄ«vi izmantojam objektorientētu pieeju, kas vienkārÅ”o darbu ar tik lielu projektu.

Lai samazinātu klienta koda lielumu, mēs vispirms izmantojām savu obfuskatoru un, sākot ar platformas versiju 8.3.6 (2014. gada oktobris), sākām izmantot Google slēgÅ”anas kompilators. IzmantoÅ”anas efekts skaitļos ā€“ tÄ«mekļa klienta ietvara lielums pēc obfuskācijas:

  • Savs obfuskators ā€“ 1556 kb
  • Google Closure Compiler ā€“ 1073 kb

Google Closure Compiler izmantoÅ”ana palÄ«dzēja mums uzlabot tÄ«mekļa klienta veiktspēju par 30%, salÄ«dzinot ar mÅ«su paÅ”u obfuscator. Turklāt aplikācijas patērētās atmiņas apjoms ir samazinājies par 15-25% (atkarÄ«bā no pārlÅ«kprogrammas).

Google Closure Compiler ļoti labi darbojas ar objektorientētu kodu, tāpēc tā efektivitāte tīmekļa klientam ir pēc iespējas augstāka. Closure Compiler mūsu labā dara dažas labas lietas:

  • Statiskā tipa pārbaude projekta izveides stadijā (nodroÅ”ina, lai kods tiktu pārklāts ar JSDoc anotācijām). Rezultāts ir statiska maŔīnrakstÄ«Å”ana, ļoti tuvu rakstÄ«Å”anai C++ valodā. Tas palÄ«dz konstatēt diezgan lielu kļūdu procentuālo daļu projekta apkopoÅ”anas posmā.
  • Koda lieluma samazināŔana, izmantojot neskaidrÄ«bas
  • Vairākas izpildÄ«tā koda optimizācijas, piemēram, piemēram:
    • iekļautas funkciju aizstāŔanas. Funkcijas izsaukÅ”ana JavaScript ir diezgan dārga darbÄ«ba, un bieži izmantoto mazo metožu iekļautās aizstāŔanas ievērojami paātrina kodu.
    • Konstantu skaitÄ«Å”ana kompilÄ“Å”anas laikā. Ja izteiksme ir atkarÄ«ga no konstantes, tajā tiks aizstāta konstantes faktiskā vērtÄ«ba

Mēs izmantojam WebStorm kā mūsu tīmekļa klienta izstrādes vidi.

Koda analÄ«zei mēs izmantojam soundQube, kur mēs integrējam statisko kodu analizatorus. Izmantojot analizatorus, mēs uzraugām JavaScript avota koda kvalitātes pasliktināŔanos un cenÅ”amies to novērst.

Par 1C tīmekļa klientu

Kādas problēmas mēs risinām/atrisinām?

ÄŖstenojot projektu, mēs saskārāmies ar vairākām interesantām problēmām, kuras mums bija jāatrisina.

Apmainieties ar datiem ar serveri un starp logiem

Pastāv situācijas, kad avota koda aptumÅ”oÅ”ana var traucēt sistēmas darbÄ«bu. Kodam, kas ir ārpus tÄ«mekļa klienta izpildāmā koda, apmulsināŔanas dēļ var bÅ«t funkciju un parametru nosaukumi, kas atŔķiras no tiem, ko paredz mÅ«su izpildāmais kods. Ārējais kods mums ir:

  • Kods, kas nāk no servera datu struktÅ«ru veidā
  • Kods citam lietojumprogrammas logam

Lai izvairītos no neskaidrības, mijiedarbojoties ar serveri, mēs izmantojam @expose tagu:

/**
 * @constructor
 * @extends {Base.SrvObject}
 */
Srv.Core.GenericException = function ()
{
    /**
     * @type {string}
     * @expose
     */
    this.descr;

    /**
     * @type {Srv.Core.GenericException}
     * @expose
     */
    this.inner;

    /**
     * @type {string}
     * @expose
     */
    this.clsid;

    /**
     * @type {boolean}
     * @expose
     */
    this.encoded;
}

Un, lai izvairītos no neskaidrības, mijiedarbojoties ar citiem logiem, mēs izmantojam tā sauktās eksportētās saskarnes (saskarnes, kurās tiek eksportētas visas metodes).

/**
 * Š­ŠŗсŠæŠ¾Ń€Ń‚ŠøруŠµŠ¼Ń‹Š¹ ŠøŠ½Ń‚ŠµŃ€Ń„ŠµŠ¹Ń ŠŗŠ¾Š½Ń‚Ń€Š¾Š»Š° DropDownWindow
 *
 * @interface
 * @struct
 */
WebUI.IDropDownWindowExp = function(){}

/**
 * ŠŸŠµŃ€ŠµŠ¼ŠµŃ‰Š°ŠµŃ‚ Š²Ń‹Š“ŠµŠ»ŠµŠ½ŠøŠµ Š½Š° 1 Š²ŠæŠµŃ€ŠµŠ“ ŠøŠ»Šø Š½Š°Š·Š°Š“
 *
 * @param {boolean} isForward
 * @param {boolean} checkOnly
 * @return {boolean}
 * @expose
 */
WebUI.IDropDownWindowExp.prototype.moveMarker = function (isForward, checkOnly){}

/**
 * ŠŸŠµŃ€ŠµŠ¼ŠµŃ‰Š°ŠµŃ‚ Š²Ń‹Š“ŠµŠ»ŠµŠ½ŠøŠµ Š² Š½Š°Ń‡Š°Š»Š¾ ŠøŠ»Šø ŠŗŠ¾Š½ŠµŃ†
 *
 * @param {boolean} isFirst
 * @param {boolean} checkOnly
 * @return {boolean}
 * @expose
 */
WebUI.IDropDownWindowExp.prototype.moveMarkerTo = function (isFirst, checkOnly){}

/**
 * @return {boolean}
 * @expose
 */
WebUI.IDropDownWindowExp.prototype.selectValue = function (){}

Mēs izmantojām virtuālo DOM, pirms tas kļuva par galveno)

Tāpat kā visi izstrādātāji, kas nodarbojas ar sarežģītām tīmekļa saskarnēm, mēs ātri sapratām, ka DOM ir slikti piemērots darbam ar dinamiskām lietotāja saskarnēm. Gandrīz nekavējoties tika ieviests Virtual DOM analogs, lai optimizētu darbu ar lietotāja interfeisu. Notikumu apstrādes laikā visas DOM izmaiņas tiek saglabātas atmiņā un tikai tad, kad visas darbības ir pabeigtas, uzkrātās izmaiņas tiek lietotas DOM kokā.

TÄ«mekļa klienta optimizÄ“Å”ana

Lai mÅ«su tÄ«mekļa klients strādātu ātrāk, mēs cenÅ”amies maksimāli izmantot standarta pārlÅ«kprogrammas iespējas (CSS utt.). Tādējādi veidlapas komandu panelis (atrodas gandrÄ«z visās lietojumprogrammas formās) tiek atveidots tikai, izmantojot pārlÅ«kprogrammas rÄ«kus, izmantojot dinamisku izkārtojumu, kura pamatā ir CSS.

Par 1C tīmekļa klientu

TestēŔana

Funkcionālajai un veiktspējas pārbaudei mēs izmantojam patentētu rīku (rakstītu Java un C++ valodā), kā arī testu komplektu, kas ir izveidots Selēns.

MÅ«su rÄ«ks ir universāls - tas ļauj pārbaudÄ«t gandrÄ«z jebkuru logu programmu, tāpēc ir piemērots gan plāna klienta, gan tÄ«mekļa klienta testÄ“Å”anai. RÄ«ks skripta failā ieraksta tā lietotāja darbÄ«bas, kurÅ” palaida 1C lietojumprogrammas risinājumu. Tajā paŔā laikā tiek ierakstÄ«ti ekrāna darba zonas attēli - standarti. Pārraugot jaunas tÄ«mekļa klienta versijas, skripti tiek atskaņoti bez lietotāja lÄ«dzdalÄ«bas. GadÄ«jumos, kad ekrānuzņēmums nevienā solÄ« nesakrÄ«t ar atsauces attēlu, tests tiek uzskatÄ«ts par neizdevuÅ”os, un pēc tam kvalitātes speciālists veic izmeklÄ“Å”anu, lai noteiktu, vai tā ir kļūda vai plānotas izmaiņas sistēmas darbÄ«bā. Plānotas uzvedÄ«bas gadÄ«jumā standarti tiek automātiski aizstāti ar jauniem.

Å is rÄ«ks arÄ« mēra lietojumprogrammas veiktspēju ar precizitāti lÄ«dz 25 milisekundēm. Dažos gadÄ«jumos mēs veicam skripta daļu cilpu (piemēram, vairākas reizes atkārtojot pasÅ«tÄ«juma ierakstu), lai analizētu izpildes laika pasliktināŔanos laika gaitā. Visu mērÄ«jumu rezultāti tiek reÄ£istrēti žurnālā analÄ«zei.

Par 1C tīmekļa klientu
MÅ«su testÄ“Å”anas rÄ«ks un lietojumprogramma tiek pārbaudÄ«ta

MÅ«su instruments un Selēns papildina viens otru; piemēram, ja kāda no ekrāniem ir mainÄ«jusi savu atraÅ”anās vietu, Selēns var to neizsekot, taču mÅ«su rÄ«ks to pamanÄ«s, jo veic ekrānuzņēmuma salÄ«dzinājumu ar standarta pikseļiem pa pikseļiem. Å is rÄ«ks var arÄ« izsekot problēmām, kas saistÄ«tas ar tastatÅ«ras vai peles ievades apstrādi, jo tas ir tieÅ”i tas, ko tas atveido.

Abi rÄ«ki (mÅ«su un Selēna) pārbauda mÅ«su lietojumprogrammu risinājumu tipiskus darba scenārijus. Testi tiek automātiski palaisti pēc 1C:Enterprise platformas ikdienas izveides. Ja skripti darbojas lēnāk (salÄ«dzinājumā ar iepriekŔējo bÅ«vējumu), mēs izmeklējam un atrisinām palēninājuma cēloni. MÅ«su kritērijs ir vienkārÅ”s ā€“ jaunajai konstrukcijai ir jādarbojas ne lēnāk kā iepriekŔējai.

Izstrādātāji izmanto dažādus rÄ«kus, lai izmeklētu palēninājuma gadÄ«jumus; galvenokārt izmanto Dynatrace AJAX izdevums ražoÅ”anas uzņēmums DynaTrace. Tiek reÄ£istrēti problemātiskās darbÄ«bas izpildes žurnāli iepriekŔējā un jaunajā bÅ«vniecÄ«bā, pēc tam žurnāli tiek analizēti. Tajā paŔā laikā atseviŔķu darbÄ«bu izpildes laiks (milisekundēs) var nebÅ«t noteicoÅ”ais faktors - pārlÅ«kprogrammā periodiski tiek palaisti tādi servisa procesi kā atkritumu savākÅ”ana, kas var pārklāties ar funkciju izpildes laiku un izkropļot attēlu. Å ajā gadÄ«jumā atbilstoŔāki parametri bÅ«tu izpildÄ«to JavaScript instrukciju skaits, DOM atomu operāciju skaits utt. Ja instrukciju/operāciju skaits tajā paŔā skriptā ir palielinājies jaunā versijā, tas gandrÄ«z vienmēr nozÄ«mē veiktspējas samazināŔanos, kas ir jālabo.

Viens no veiktspējas samazināŔanās iemesliem var bÅ«t arÄ« tas, ka Google Closure Compiler kāda iemesla dēļ nevarēja veikt funkcijas iekļauto aizstāŔanu (piemēram, tāpēc, ka funkcija ir rekursÄ«va vai virtuāla). Å ajā gadÄ«jumā mēs cenÅ”amies situāciju labot, pārrakstot avota kodu.

Pārlūka paplaŔinājumi

Ja lietojumprogrammas risinājumam ir nepiecieÅ”ama funkcionalitāte, kas nav pieejama JavaScript, mēs izmantojam pārlÅ«kprogrammas paplaÅ”inājumus:

MÅ«su paplaÅ”inājumi sastāv no divām daļām. Pirmā daļa ir tā sauktais pārlÅ«kprogrammas paplaÅ”inājums (parasti pārlÅ«kprogrammas Chrome un Firefox paplaÅ”inājumi, kas rakstÄ«ti JavaScript), kas mijiedarbojas ar otro daļu - bināro paplaÅ”inājumu, kas ievieÅ” mums nepiecieÅ”amo funkcionalitāti. Jāpiemin, ka mēs rakstām 3 bināro paplaÅ”inājumu versijas ā€“ priekÅ” Windows, Linux un MacOS. Binārais paplaÅ”inājums tiek piegādāts kā platformas 1C:Enterprise daļa un atrodas 1C lietojumprogrammu serverÄ«. Pirmo reizi to izsaucot no tÄ«mekļa klienta, tas tiek lejupielādēts klienta datorā un instalēts pārlÅ«kprogrammā.

Darbojoties pārlÅ«kprogrammā Safari, mÅ«su paplaÅ”inājumi izmanto NPAPI; ja tie darbojas pārlÅ«kprogrammā Internet Explorer, tie izmanto ActiveX tehnoloÄ£iju. Microsoft Edge vēl neatbalsta paplaÅ”inājumus, tāpēc tÄ«mekļa klients tajā darbojas ar ierobežojumiem.

Tālāka attīstība

Viens no tīmekļa klientu izstrādes komandas uzdevumiem ir funkcionalitātes tālāka attīstība. Tīmekļa klienta funkcionalitātei ir jābūt identiskai plānā klienta funkcionalitātei, visa jaunā funkcionalitāte tiek ieviesta vienlaikus gan plānā, gan tīmekļa klientā.

Citi uzdevumi ietver arhitektÅ«ras izstrādi, pārveidoÅ”anu, veiktspējas un uzticamÄ«bas uzlaboÅ”anu. Piemēram, viens no virzieniem ir tālāka virzÄ«ba uz asinhronā darba modeli. Dažas tÄ«mekļa klienta funkcionalitātes paÅ”laik ir balstÄ«tas uz sinhrono mijiedarbÄ«bas ar serveri modeli. Asinhronais modelis tagad kļūst aktuālāks pārlÅ«kprogrammās (un ne tikai pārlÅ«kprogrammās), un tas liek mums modificēt tÄ«mekļa klientu, aizstājot sinhronos zvanus ar asinhroniem (un attiecÄ«gi pārveidojot kodu). Pakāpeniska pāreja uz asinhrono modeli ir izskaidrojama ar nepiecieÅ”amÄ«bu atbalstÄ«t izlaistos risinājumus un to pakāpenisku pielāgoÅ”anu.

Avots: www.habr.com

Pievieno komentāru