Dwar il-klijent tal-web 1C

Waħda mill-karatteristiċi sbieħ tat-teknoloġija 1C:Enterprise hija li s-soluzzjoni tal-applikazzjoni, żviluppata bl-użu tat-teknoloġija tal-formoli ġestiti, tista 'tiġi mnedija kemm f'klijent irqiq (eżekutibbli) għall-Windows, Linux, MacOS X, kif ukoll bħala klijent tal-web għal 5 browsers - Chrome, Internet Explorer, Firefox, Safari, Edge, u dan kollu mingħajr ma jinbidel il-kodiċi tas-sors tal-applikazzjoni. Barra minn hekk, esternament l-applikazzjoni fil-thin client u fil-browser taħdem u tidher kważi identika.
Sib 10 differenzi (2 stampi taħt il-qatgħa):

Tieqa tal-klijent irqiq fuq Linux:

Dwar il-klijent tal-web 1C

L-istess tieqa fil-klijent tal-web (fil-browser Chrome):

Dwar il-klijent tal-web 1C

Għaliex għamilna klijent tal-web? Biex ngħiduha kemmxejn patetika, iż-żmien stabbilixxa biċċa xogħol bħal din għalina. Ix-xogħol fuq l-Internet ilu prerekwiżit għall-applikazzjonijiet tan-negozju. L-ewwel, żidna l-abbiltà li naħdmu permezz tal-Internet għall-klijent irqiq tagħna (xi wħud mill-kompetituri tagħna, bil-mod, waqfu fuq dan; oħrajn, għall-kuntrarju, abbandunaw il-klijent irqiq u llimitaw ruħhom għall-implimentazzjoni ta 'klijent tal-web). Iddeċidejna li nagħtu lill-utenti tagħna l-opportunità li jagħżlu l-għażla tal-klijent li taqbelhom l-aħjar.

Dwar il-klijent tal-web 1C

Iż-żieda ta 'kapaċitajiet ibbażati fuq il-web lill-thin client kien proġett kbir b'bidla sħiħa fl-arkitettura klijent-server. Il-ħolqien ta 'klijent tal-web huwa proġett kompletament ġdid, li jibda mill-bidu.

Dikjarazzjoni tal-problema

Għalhekk, ir-rekwiżiti tal-proġett: il-klijent tal-web għandu jagħmel l-istess bħall-klijent irqiq, jiġifieri:

  1. Uri l-interface tal-utent
  2. Eżegwixxi kodiċi tal-klijent miktub bil-lingwa 1C

L-interface tal-utent f'1C hija deskritta f'editur viżwali, iżda b'mod dikjarattiv, mingħajr arranġament pixel b'pixel tal-elementi; Jintużaw madwar tliet tużżani tipi ta’ elementi ta’ interface - buttuni, oqsma ta’ input (test, numeriku, data/ħin), listi, tabelli, graffs, eċċ.

Il-kodiċi tal-klijent fil-lingwa 1C jista 'jkun fih sejħiet għal server, li jaħdmu ma' riżorsi lokali (fajls, eċċ.), stampar, u ħafna aktar.

Kemm il-klijent irqiq (meta jaħdem permezz tal-web) kif ukoll il-klijent tal-web jużaw l-istess sett ta 'servizzi tal-web biex jikkomunikaw mas-server tal-applikazzjoni 1C. L-implimentazzjonijiet tal-klijenti, ovvjament, huma differenti - il-klijent irqiq huwa miktub f'C++, il-klijent tal-web huwa miktub f'JavaScript.

Ftit storja

Il-proġett tal-klijent tal-web beda fl-2006, b'tim ta' (medja) 5 persuni. F'ċerti stadji tal-proġett, l-iżviluppaturi kienu involuti biex jimplimentaw funzjonalità speċifika (dokument tal-ispreadsheet, dijagrammi, eċċ.); bħala regola, dawn kienu l-istess żviluppaturi li għamlu din il-funzjonalità fil-thin client. Dawk. l-iżviluppaturi reġgħu kitbu komponenti f'JavaScript li kienu ħolqu qabel f'C++.

Mill-bidu nett, irrifjutajna l-idea ta 'kwalunkwe konverżjoni awtomatika (anke parzjali) ta' kodiċi tal-klijent irqiq C++ f'klijent web JavaScript minħabba d-differenzi kunċettwali qawwija bejn iż-żewġ lingwi; il-klijent tal-web inkiteb bil-JavaScript mill-bidu.

Fl-ewwel iterazzjonijiet tal-proġett, il-klijent tal-web ikkonverti l-kodiċi tal-klijent fil-lingwa 1C integrata direttament f'JavaScript. Il-klijent irqiq jaġixxi b'mod differenti - il-kodiċi fil-lingwa 1C mibnija huwa kkompilat f'bytecode, u mbagħad dan il-bytecode jiġi interpretat fuq il-klijent. Sussegwentement, il-klijent tal-web beda jagħmel l-istess - l-ewwelnett, ta gwadann fil-prestazzjoni, u t-tieni, għamilha possibbli li tgħaqqad l-arkitettura tal-klijenti rqiqa u tal-web.

L-ewwel verżjoni tal-pjattaforma 1C:Enterprise b'appoġġ għall-klijent tal-web ġiet rilaxxata fl-2009. Il-klijent tal-web dak iż-żmien appoġġa 2 browsers - Internet Explorer u Firefox. Il-pjanijiet oriġinali kienu jinkludu appoġġ għal Opera, iżda minħabba problemi insormontabbli f'dak iż-żmien mal-handlers tal-għeluq tal-applikazzjoni f'Opera (ma kienx possibbli li jintraċċa b'ċertezza 100% li l-applikazzjoni kienet qed tagħlaq, u f'dak il-mument twettaq il-proċedura ta 'skonnettjar mill- 1C application server) minn dawn il-pjanijiet kellhom jiġu abbandunati.

Struttura tal-proġett

B'kollox, il-pjattaforma 1C:Enterprise għandha 4 proġetti miktuba bil-JavaScript:

  1. WebTools – libreriji kondiviżi użati minn proġetti oħra (inkludu wkoll Librerija tal-Għeluq tal-Google).
  2. Element ta' kontroll FormattedDocument (implimentat f'JavaScript kemm fil-klijent irqiq kif ukoll fil-klijent tal-web)
  3. Element ta' kontroll Scheduler (implimentat f'JavaScript kemm fil-klijent irqiq kif ukoll fil-klijent tal-web)
  4. Web client

L-istruttura ta 'kull proġett tixbaħ l-istruttura ta' proġetti Java (jew proġetti .NET - skond liema jkun l-eqreb); Għandna namespaces, u kull namespace jinsab f'folder separat. Ġewwa l-folder hemm fajls u klassijiet ta 'namespace. Hemm madwar 1000 fajl fil-proġett tal-klijent tal-web.

Strutturalment, il-klijent tal-web huwa maqsum fil-biċċa l-kbira fis-sottosistemi li ġejjin:

  • Interfaċċja tal-applikazzjoni tal-klijent immaniġġjata
    • Interface ġenerali tal-applikazzjoni (menus tas-sistema, pannelli)
    • Interface ta' formoli ġestiti, inklużi, fost affarijiet oħra, madwar 30 kontroll (buttuni, diversi tipi ta' oqsma ta' input - test, numeriċi, data/ħin, eċċ., tabelli, listi, graffs, eċċ.)

  • Mudell tal-oġġett disponibbli għall-iżviluppaturi fuq il-klijent (aktar minn 400 tip b'kollox: mudell tal-oġġett tal-interface ġestit, settings tat-tqassim tad-dejta, stil kondizzjonali, eċċ.)
  • Interpretu tal-lingwa integrata 1C
  • Estensjonijiet tal-browser (użati għal funzjonalità mhux appoġġjata f'JavaScript)
    • Ħidma bil-kriptografija
    • Ħidma ma 'fajls
    • Teknoloġija ta 'komponenti esterni, li tippermettilhom li jintużaw kemm fil-klijenti rqiqa kif ukoll tal-web

Karatteristiċi ta' Żvilupp

L-implimentazzjoni ta 'dan kollu ta' hawn fuq f'JavaScript mhix faċli. Forsi l-klijent tal-web 1C huwa wieħed mill-akbar applikazzjonijiet fuq in-naħa tal-klijent miktuba b'JavaScript - madwar 450.000 linja. Aħna nużaw b'mod attiv approċċ orjentat lejn l-oġġetti fil-kodiċi tal-klijent tal-web, li jissimplifika l-ħidma ma 'proġett daqshekk kbir.

Biex innaqqsu d-daqs tal-kodiċi tal-klijent, l-ewwel użajna l-obfuscator tagħna stess, u bdejna bil-verżjoni tal-pjattaforma 8.3.6 (Ottubru 2014) bdejna nużaw Kompilatur tal-Għeluq tal-Google. L-effett tal-użu fin-numri - id-daqs tal-qafas tal-klijent tal-web wara l-obfuskazzjoni:

  • Obfuscator proprju – 1556 kb
  • Google Closure Compiler – 1073 kb

L-użu tal-Google Closure Compiler għenna ntejbu l-prestazzjoni tal-klijent tal-web bi 30% meta mqabbel mal-obfuscator tagħna stess. Barra minn hekk, l-ammont ta 'memorja kkunsmat mill-applikazzjoni naqas bi 15-25% (skont il-browser).

Google Closure Compiler jaħdem tajjeb ħafna b'kodiċi orjentat lejn l-oġġetti, għalhekk l-effiċjenza tiegħu għall-klijent tal-web hija għolja kemm jista 'jkun. Closure Compiler jagħmel ftit affarijiet tajbin għalina:

  • Iċċekkjar tat-tip statiku fl-istadju tal-bini tal-proġett (jiżgura li nkopru l-kodiċi b'annotazzjonijiet JSDoc). Ir-riżultat huwa typing statiku, qrib ħafna fil-livell tal-ittajpjar f'C++. Dan jgħin biex jinqabad persentaġġ pjuttost kbir ta 'żbalji fl-istadju tal-kumpilazzjoni tal-proġett.
  • Tnaqqis tad-daqs tal-kodiċi permezz ta 'obfuscation
  • Numru ta 'ottimizzazzjonijiet tal-kodiċi esegwit, pereżempju, bħal:
    • sostituzzjonijiet tal-funzjoni inline. Is-sejħa ta 'funzjoni f'JavaScript hija operazzjoni pjuttost għalja, u sostituzzjonijiet inline ta' metodi żgħar użati ta 'spiss iħaffu l-kodiċi b'mod sinifikanti.
    • Għadd tal-kostanti fil-ħin tal-kumpilazzjoni. Jekk espressjoni tiddependi fuq kostanti, il-valur attwali tal-kostanti jiġi sostitwit fiha

Aħna nużaw WebStorm bħala l-ambjent tagħna għall-iżvilupp tal-klijent tal-web.

Għall-analiżi tal-kodiċi nużaw soundQube, fejn nintegraw analizzaturi tal-kodiċi statiċi. Bl-użu tal-analizzaturi, aħna nissorveljaw id-degradazzjoni tal-kwalità tal-kodiċi tas-sors JavaScript u nippruvaw nipprevjenuha.

Dwar il-klijent tal-web 1C

Liema problemi solvejna/qed insolvuhom?

Waqt l-implimentazzjoni tal-proġett, iltqajna ma’ numru ta’ problemi interessanti li kellna nsolvu.

Skambju ta' data mas-server u bejn twieqi

Hemm sitwazzjonijiet fejn it-tfixkil tal-kodiċi tas-sors jista' jinterferixxi mat-tħaddim tas-sistema. Kodiċi estern għall-kodiċi eżekutibbli tal-klijent tal-web, minħabba tfixkil, jista 'jkollu ismijiet ta' funzjonijiet u parametri li huma differenti minn dawk li l-kodiċi eżekutibbli tagħna jistenna. Il-kodiċi estern għalina huwa:

  • Kodiċi li ġej mis-server fil-forma ta 'strutturi tad-dejta
  • Kodiċi għal tieqa ta' applikazzjoni oħra

Biex tiġi evitata tfixkil meta jinteraġixxu mas-server, nużaw it-tikketta @expose:

/**
 * @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;
}

U biex tiġi evitata l-obfuskazzjoni meta jinteraġixxu ma 'twieqi oħra, nużaw l-hekk imsejħa interfaces esportati (interfaces li fihom il-metodi kollha huma esportati).

/**
 * Экспортируемый интерфейс контрола 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 (){}

Użajna DOM Virtwali qabel ma sar mainstream)

Bħall-iżviluppaturi kollha li jittrattaw UIs tal-Web kumplessi, aħna malajr indunajna li d-DOM mhux adattat tajjeb biex jaħdem ma 'interfaces tal-utent dinamiċi. Kważi immedjatament, analogu ta 'DOM Virtwali ġie implimentat biex jiġi ottimizzat ix-xogħol mal-UI. Matul l-ipproċessar tal-avvenimenti, il-bidliet DOM kollha huma maħżuna fil-memorja u, meta l-operazzjonijiet kollha jitlestew biss, il-bidliet akkumulati jiġu applikati għas-siġra DOM.

L-ottimizzazzjoni tal-klijent tal-web

Biex il-klijent tal-web tagħna jaħdem aktar malajr, nippruvaw nużaw il-kapaċitajiet standard tal-browser (CSS, eċċ.) sal-massimu. Għalhekk, il-pannell tal-kmand tal-formola (li jinsab fuq kważi kull forma tal-applikazzjoni) huwa magħmul esklussivament bl-użu ta 'għodod tal-browser, bl-użu ta' tqassim dinamiku bbażat fuq CSS.

Dwar il-klijent tal-web 1C

Ittestjar

Għall-ittestjar funzjonali u tal-prestazzjoni, nużaw għodda proprjetarja (miktuba f'Java u C++), kif ukoll sett ta' testijiet mibnija fuq Selenju.

L-għodda tagħna hija universali - tippermettilek tittestja kważi kull programm windowed, u għalhekk hija adattata għall-ittestjar kemm ta 'klijent irqiq kif ukoll ta' klijent tal-web. L-għodda tirreġistra l-azzjonijiet tal-utent li nieda s-soluzzjoni tal-applikazzjoni 1C f'fajl b'kitba. Fl-istess ħin, immaġini taż-żona tax-xogħol tal-iskrin—standards—jiġu rreġistrati. Meta timmonitorja verżjonijiet ġodda tal-klijent tal-web, skripts jintlagħbu mingħajr il-parteċipazzjoni tal-utent. F'każijiet fejn il-screenshot ma taqbilx ma 'referenza waħda fi kwalunkwe pass, it-test jitqies fallut, u wara speċjalista tal-kwalità jwettaq investigazzjoni biex jiddetermina jekk dan huwiex żball jew bidla ppjanata fl-imġiba tas-sistema. F'każ ta' mġiba ppjanata, l-istandards jiġu sostitwiti awtomatikament b'oħrajn ġodda.

L-għodda tkejjel ukoll il-prestazzjoni tal-applikazzjoni bi preċiżjoni sa 25 millisekondi. F'xi każijiet, aħna loop partijiet ta 'l-iskrittura (per eżempju, tirrepeti d-dħul ta' l-ordni diversi drabi) biex tanalizza d-degradazzjoni tal-ħin ta 'eżekuzzjoni maż-żmien. Ir-riżultati tal-kejl kollu huma rreġistrati f'ġurnal għall-analiżi.

Dwar il-klijent tal-web 1C
L-għodda tal-ittestjar tagħna u l-applikazzjoni taħt test

L-għodda tagħna u Selenju jikkumplimentaw lil xulxin; pereżempju, jekk xi buttuna fuq waħda mill-iskrins inbidlet il-post tagħha, Selenium jista' ma jsegwix dan, iżda l-għodda tagħna tinduna, għax jagħmel paragun pixel b'pixel tal-screenshot mal-istandard. L-għodda hija kapaċi wkoll issegwi problemi bl-input tal-ipproċessar mit-tastiera jew il-maws, peress li dan huwa eżattament dak li tirriproduċi.

It-testijiet fuq iż-żewġ għodod (tagħna u Selenium) imexxu xenarji tax-xogħol tipiċi mis-soluzzjonijiet tal-applikazzjoni tagħna. It-testijiet huma mnedija awtomatikament wara l-bini ta 'kuljum tal-pjattaforma 1C:Enterprise. Jekk l-iskripts huma aktar bil-mod (meta mqabbel mal-bini ta 'qabel), aħna ninvestigaw u nsolvu l-kawża tat-tnaqqis. Il-kriterju tagħna huwa sempliċi - il-bini l-ġdid m'għandux jaħdem aktar bil-mod minn dak ta 'qabel.

L-iżviluppaturi jużaw għodod differenti biex jinvestigaw inċidenti ta 'tnaqqis; prinċipalment użati Edizzjoni Dynatrace AJAX kumpanija tal-produzzjoni DynaTrace. Jiġu rreġistrati zkuk tal-eżekuzzjoni tal-operazzjoni problematika fuq il-bini preċedenti u ġodda, imbagħad jiġu analizzati z-zkuk. Fl-istess ħin, il-ħin ta 'eżekuzzjoni ta' operazzjonijiet singoli (f'millisekondi) jista 'ma jkunx fattur deċiżiv - proċessi ta' servizz bħall-ġbir taż-żibel huma mnedija perjodikament fil-browser, jistgħu jikkoinċidu mal-ħin ta 'eżekuzzjoni tal-funzjonijiet u jgħawġu l-istampa. Parametri aktar rilevanti f'dan il-każ ikunu n-numru ta 'struzzjonijiet JavaScript esegwiti, in-numru ta' operazzjonijiet atomiċi fuq id-DOM, eċċ. Jekk in-numru ta 'struzzjonijiet/operazzjonijiet fl-istess skript żdied f'verżjoni ġdida, dan kważi dejjem ifisser tnaqqis fil-prestazzjoni li jeħtieġ li tiġi kkoreġuta.

Ukoll, waħda mir-raġunijiet għat-tnaqqis fil-prestazzjoni tista 'tkun li Google Closure Compiler għal xi raġuni ma setax iwettaq sostituzzjoni inline tal-funzjoni (per eżempju, minħabba li l-funzjoni hija rikurrettiva jew virtwali). F'dan il-każ, nippruvaw nikkoreġu s-sitwazzjoni billi niktbu mill-ġdid il-kodiċi tas-sors.

Estensjonijiet tal-browser

Meta soluzzjoni ta' applikazzjoni teħtieġ funzjonalità li mhix disponibbli f'JavaScript, nużaw l-estensjonijiet tal-browser:

L-estensjonijiet tagħna jikkonsistu f'żewġ partijiet. L-ewwel parti hija dik li tissejjaħ estensjoni tal-browser (ġeneralment estensjonijiet għal Chrome u Firefox miktuba bil-JavaScript), li jinteraġixxu mat-tieni parti - estensjoni binarja li timplimenta l-funzjonalità li għandna bżonn. Għandu jissemma li niktbu 3 verżjonijiet ta 'estensjonijiet binarji - għall-Windows, Linux u MacOS. L-estensjoni binarja hija fornuta bħala parti mill-pjattaforma 1C:Enterprise u tinsab fuq is-server tal-applikazzjoni 1C. L-ewwel darba li tissejjaħ minn klijent tal-web, titniżżel fuq il-kompjuter tal-klijent u tiġi installata fil-browser.

Meta taħdem f'Safari, l-estensjonijiet tagħna jużaw NPAPI; meta jaħdmu f'Internet Explorer, jużaw it-teknoloġija ActiveX. Microsoft Edge għadu ma jappoġġjax estensjonijiet, għalhekk il-klijent tal-web fih jaħdem b'restrizzjonijiet.

Aktar żvilupp

Wieħed mill-kompiti għat-tim tal-iżvilupp tal-klijent tal-web huwa l-iżvilupp ulterjuri tal-funzjonalità. Il-funzjonalità tal-klijent tal-web għandha tkun identika għall-funzjonalità tal-klijent irqiq; il-funzjonalità l-ġdida kollha hija implimentata simultanjament kemm fil-klijent irqiq kif ukoll fil-web.

Ħidmiet oħra jinkludu l-iżvilupp tal-arkitettura, ir-refactoring, it-titjib tal-prestazzjoni u l-affidabbiltà. Pereżempju, waħda mid-direzzjonijiet hija aktar moviment lejn mudell ta 'xogħol mhux sinkroniku. Xi wħud mill-funzjonalità tal-klijent tal-web bħalissa hija mibnija fuq mudell sinkroniku ta 'interazzjoni mas-server. Il-mudell asinkroniku issa qed isir aktar rilevanti fil-browsers (u mhux biss fil-brawżers), u dan iġġiegħelna nimmodifikaw il-klijent tal-web billi nissostitwixxu sejħiet sinkroniċi b'dawk asinkroniċi (u nirrefactoring il-kodiċi kif xieraq). It-tranżizzjoni gradwali għal mudell mhux sinkroniku hija spjegata mill-ħtieġa li jiġu appoġġjati s-soluzzjonijiet rilaxxati u l-adattament gradwali tagħhom.

Sors: www.habr.com

Żid kumment