Kuhusu mteja wa wavuti wa 1C

Mojawapo ya sifa nzuri za 1C:Teknolojia ya Biashara ni kwamba suluhisho la maombi, lililotengenezwa kwa kutumia teknolojia ya fomu zinazodhibitiwa, linaweza kuzinduliwa katika mteja mwembamba (unaoweza kutekelezwa) wa Windows, Linux, MacOS X, na kama mteja wa wavuti kwa vivinjari 5 - Chrome, Internet Explorer, Firefox, Safari, Edge, na haya yote bila kubadilisha msimbo wa chanzo cha programu. Aidha, maombi ya nje katika mteja mwembamba na katika kivinjari hufanya kazi na inaonekana karibu sawa.
Pata tofauti 10 (picha 2 chini ya kata):

Dirisha nyembamba la mteja kwenye Linux:

Kuhusu mteja wa wavuti wa 1C

Dirisha sawa katika mteja wa wavuti (kwenye kivinjari cha Chrome):

Kuhusu mteja wa wavuti wa 1C

Kwa nini tulifanya mteja wa wavuti? Ili kuiweka kwa kusikitisha, wakati umeweka kazi kama hiyo kwa ajili yetu. Kufanya kazi kwenye mtandao kwa muda mrefu imekuwa sharti la maombi ya biashara. Kwanza, tuliongeza uwezo wa kufanya kazi kupitia mtandao kwa mteja wetu mwembamba (baadhi ya washindani wetu, kwa njia, walisimama kwa hili; wengine, kinyume chake, waliacha mteja mwembamba na kujizuia kutekeleza mteja wa mtandao). Tuliamua kuwapa watumiaji wetu fursa ya kuchagua chaguo la mteja linalowafaa zaidi.

Kuhusu mteja wa wavuti wa 1C

Kuongeza uwezo wa msingi wa wavuti kwa mteja mwembamba ulikuwa mradi mkubwa na mabadiliko kamili katika usanifu wa seva ya mteja. Kuunda mteja wa wavuti ni mradi mpya kabisa, kuanzia mwanzo.

Taarifa ya tatizo

Kwa hivyo, mahitaji ya mradi: mteja wa wavuti lazima afanye sawa na mteja mwembamba, ambayo ni:

  1. Onyesha kiolesura cha mtumiaji
  2. Tekeleza msimbo wa mteja ulioandikwa kwa lugha ya 1C

Kiolesura cha mtumiaji katika 1C kinaelezewa katika kihariri cha kuona, lakini kwa kutangaza, bila mpangilio wa vipengele vya pixel-by-pixel; Takriban aina tatu za vipengele vya interface hutumiwa - vifungo, mashamba ya pembejeo (maandishi, nambari, tarehe / wakati), orodha, meza, grafu, nk.

Msimbo wa mteja katika lugha ya 1C unaweza kuwa na simu za seva, kufanya kazi na rasilimali za ndani (faili, nk.), uchapishaji, na mengi zaidi.

Mteja mwembamba (wakati anafanya kazi kupitia wavuti) na mteja wa wavuti hutumia seti sawa ya huduma za wavuti kuwasiliana na seva ya programu ya 1C. Utekelezaji wa mteja, bila shaka, ni tofauti - mteja mwembamba ameandikwa katika C ++, mteja wa mtandao ameandikwa katika JavaScript.

kidogo ya historia

Mradi wa mteja wa wavuti ulianza mnamo 2006, na timu ya (kwa wastani) watu 5. Katika hatua fulani za mradi, watengenezaji walihusika kutekeleza utendaji maalum (hati ya lahajedwali, michoro, nk); kama sheria, hawa walikuwa watengenezaji sawa ambao walifanya utendakazi huu katika mteja mwembamba. Wale. watengenezaji waliandika tena vipengee katika JavaScript ambavyo walikuwa wameunda hapo awali katika C++.

Tangu mwanzo kabisa, tulikataa wazo la ubadilishaji wowote wa kiotomatiki (hata kiasi) wa msimbo mwembamba wa C++ kuwa mteja wa wavuti wa JavaScript kutokana na tofauti kubwa za kimawazo kati ya lugha hizi mbili; mteja wa wavuti iliandikwa kwa JavaScript kutoka mwanzo.

Katika marudio ya kwanza ya mradi, mteja wa wavuti alibadilisha msimbo wa mteja katika lugha iliyojengewa ndani ya 1C moja kwa moja hadi JavaScript. Mteja mwembamba hufanya kazi tofauti - msimbo katika lugha iliyojengwa ya 1C imejumuishwa katika bytecode, na kisha bytecode hii inatafsiriwa kwa mteja. Baadaye, mteja wa wavuti alianza kufanya vivyo hivyo - kwanza, alitoa faida ya utendaji, na pili, ilifanya iwezekane kuunganisha usanifu wa wateja nyembamba na wa wavuti.

Toleo la kwanza la 1C:Enterprise jukwaa lenye usaidizi wa mteja wa wavuti lilitolewa mnamo 2009. Kiteja cha wavuti wakati huo kilisaidia vivinjari 2 - Internet Explorer na Firefox. Mipango ya asili ilijumuisha usaidizi wa Opera, lakini kwa sababu ya shida zisizoweza kushindwa wakati huo na washughulikiaji wa kufunga programu katika Opera (haikuwezekana kufuatilia kwa uhakika wa 100% kwamba programu ilikuwa ikifungwa, na wakati huo kutekeleza utaratibu wa kukatwa kutoka kwa Seva ya maombi ya 1C) kutoka kwa mipango hii ilibidi kuachwa.

Muundo wa mradi

Kwa jumla, jukwaa la 1C:Enterprise lina miradi 4 iliyoandikwa kwa JavaScript:

  1. Zana za Wavuti - maktaba zilizoshirikiwa zinazotumiwa na miradi mingine (pia tunajumuisha Maktaba ya Kufungwa ya Google).
  2. Kipengele cha kudhibiti FormattedDocument (imetekelezwa katika JavaScript katika mteja mwembamba na mteja wa wavuti)
  3. Kipengele cha kudhibiti Mratibu (imetekelezwa katika JavaScript katika mteja mwembamba na mteja wa wavuti)
  4. Mteja wa wavuti

Muundo wa kila mradi unafanana na muundo wa miradi ya Java (au miradi ya NET - chochote kilicho karibu); Tuna nafasi za majina, na kila nafasi ya majina iko kwenye folda tofauti. Ndani ya folda kuna faili na madarasa ya nafasi ya majina. Kuna takriban faili 1000 katika mradi wa mteja wa wavuti.

Kimuundo, mteja wa wavuti kwa kiasi kikubwa amegawanywa katika mifumo ndogo ifuatayo:

  • Kiolesura cha programu ya mteja kinachosimamiwa
    • Kiolesura cha jumla cha programu (menu za mfumo, paneli)
    • Muunganisho wa fomu zinazodhibitiwa, ikijumuisha, miongoni mwa mambo mengine, takriban vidhibiti 30 (vifungo, aina mbalimbali za sehemu za ingizo - maandishi, nambari, tarehe/saa, n.k., majedwali, orodha, grafu, n.k.)

  • Muundo wa kitu unaopatikana kwa wasanidi programu kwenye mteja (zaidi ya aina 400 kwa jumla: muundo wa kiolesura kinachodhibitiwa, mipangilio ya mpangilio wa data, mtindo wa masharti, n.k.)
  • Mkalimani wa lugha iliyojengewa ndani ya 1C
  • Viendelezi vya kivinjari (vinavyotumika kwa utendakazi havitumiki katika JavaScript)
    • Kufanya kazi na cryptography
    • Kufanya kazi na faili
    • Teknolojia ya vipengele vya nje, kuruhusu kutumika katika wateja nyembamba na mtandao

Vipengele vya Maendeleo

Utekelezaji wa yote yaliyo hapo juu katika JavaScript sio rahisi. Pengine mteja wa wavuti wa 1C ni mojawapo ya programu kubwa zaidi za upande wa mteja zilizoandikwa katika JavaScript - takriban mistari 450.000. Tunatumia kikamilifu mbinu inayolenga kitu katika msimbo wa mteja wa wavuti, ambayo hurahisisha kufanya kazi na mradi mkubwa kama huo.

Ili kupunguza ukubwa wa msimbo wa mteja, kwanza tulitumia obfuscator yetu wenyewe, na kuanzia na toleo la jukwaa la 8.3.6 (Oktoba 2014) tulianza kutumia. Mkusanyaji wa Kufunga Google. Athari ya matumizi katika nambari - saizi ya mfumo wa mteja wa wavuti baada ya kufichwa:

  • Kidhibiti cha umiliki - 1556 kb
  • Kikusanyaji cha Kufunga Google - 1073 kb

Kutumia Kikusanyaji cha Kufunga Google kilitusaidia kuboresha utendakazi wa mteja wa wavuti kwa 30% ikilinganishwa na kimbungaji chetu wenyewe. Kwa kuongeza, kiasi cha kumbukumbu kinachotumiwa na programu kimepungua kwa 15-25% (kulingana na kivinjari).

Google Closure Compiler inafanya kazi vizuri sana na msimbo unaolenga kitu, kwa hivyo ufanisi wake kwa mteja wa wavuti ni wa juu iwezekanavyo. Mkusanyaji wa Kufunga hutufanyia mambo machache mazuri:

  • Kuangalia aina tuli katika hatua ya ujenzi wa mradi (huhakikisha kwamba tunashughulikia msimbo na maelezo ya JSDoc). Matokeo yake ni kuandika tuli, karibu sana katika kiwango cha kuandika katika C++. Hii husaidia kupata asilimia kubwa ya makosa katika hatua ya ujumuishaji wa mradi.
  • Kupunguza saizi ya msimbo kupitia utaftaji
  • Idadi ya uboreshaji wa nambari iliyotekelezwa, kwa mfano, kama vile:
    • vibadala vya utendakazi wa ndani. Kupigia simu kitendakazi katika JavaScript ni operesheni ya bei ghali, na uingizwaji wa ndani wa njia ndogo zinazotumiwa mara kwa mara huongeza kasi ya msimbo.
    • Kuhesabu mara kwa mara wakati wa kukusanya. Ikiwa usemi unategemea mara kwa mara, thamani halisi ya mara kwa mara itabadilishwa ndani yake

Tunatumia WebStorm kama mazingira ya ukuzaji wa mteja wa wavuti.

Kwa uchanganuzi wa kanuni tunatumia sautiQube, ambapo tunaunganisha wachanganuzi wa kanuni tuli. Kwa kutumia vichanganuzi, tunafuatilia uharibifu wa ubora wa msimbo wa chanzo wa JavaScript na kujaribu kuuzuia.

Kuhusu mteja wa wavuti wa 1C

Je, ni matatizo gani/tunayatatua?

Wakati wa utekelezaji wa mradi huo, tulikutana na shida kadhaa za kupendeza ambazo tulilazimika kutatua.

Badilisha data na seva na kati ya windows

Kuna hali ambapo upotovu wa msimbo wa chanzo unaweza kuingilia kati na uendeshaji wa mfumo. Msimbo ulio nje ya msimbo unaoweza kutekelezeka wa mteja wa wavuti, kwa sababu ya kufichuliwa, unaweza kuwa na kazi na majina ya vigezo ambayo yanatofautiana na yale ambayo msimbo wetu wa kutekelezeka unatarajia. Nambari ya nje kwa ajili yetu ni:

  • Msimbo unaotoka kwa seva katika mfumo wa miundo ya data
  • Nambari ya dirisha lingine la programu

Ili kuzuia kutatanisha wakati wa kuingiliana na seva, tunatumia lebo ya @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;
}

Na ili kuzuia kufifia wakati wa kuingiliana na madirisha mengine, tunatumia kinachojulikana kama miingiliano ya nje (interfaces ambazo njia zote zinasafirishwa).

/**
 * ЭкспортируСмый интСрфСйс ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π° 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 (){}

Tulitumia Virtual DOM kabla ya kuwa ya kawaida)

Kama wasanidi wote wanaoshughulikia violesura changamano vya Wavuti, tuligundua haraka kuwa DOM haifai kufanya kazi na violesura vinavyobadilika vya watumiaji. Takriban mara moja, analogi ya Virtual DOM ilitekelezwa ili kuboresha kazi na UI. Wakati wa usindikaji wa tukio, mabadiliko yote ya DOM yanahifadhiwa kwenye kumbukumbu na, tu wakati shughuli zote zimekamilika, mabadiliko yaliyokusanywa yanatumika kwenye mti wa DOM.

Kuboresha mteja wa wavuti

Ili kufanya mteja wetu wa wavuti kufanya kazi haraka, tunajaribu kutumia uwezo wa kawaida wa kivinjari (CSS, nk.) hadi kiwango cha juu. Kwa hivyo, jopo la amri ya fomu (iko karibu kila aina ya programu) hutolewa kwa kutumia zana za kivinjari, kwa kutumia mpangilio wa nguvu kulingana na CSS.

Kuhusu mteja wa wavuti wa 1C

Upimaji

Kwa majaribio ya utendakazi na utendakazi, tunatumia zana inayomilikiwa (iliyoandikwa katika Java na C++), pamoja na safu ya majaribio yaliyojengwa juu ya Selenium.

Chombo chetu ni cha ulimwengu wote - hukuruhusu kujaribu karibu programu yoyote iliyo na dirisha, na kwa hivyo inafaa kwa kujaribu mteja mwembamba na mteja wa wavuti. Chombo hurekodi vitendo vya mtumiaji ambaye alizindua suluhisho la programu ya 1C kwenye faili ya hati. Wakati huo huo, picha za eneo la kufanya kazi la skrini-viwango-zinarekodiwa. Wakati wa kufuatilia matoleo mapya ya mteja wa wavuti, hati huchezwa bila ushiriki wa mtumiaji. Katika hali ambapo picha ya skrini hailingani na kumbukumbu kwa hatua yoyote, jaribio linachukuliwa kuwa halikufaulu, baada ya hapo mtaalamu wa ubora hufanya uchunguzi ili kubaini ikiwa hii ni hitilafu au mabadiliko yaliyopangwa katika tabia ya mfumo. Katika kesi ya tabia iliyopangwa, viwango vinabadilishwa moja kwa moja na vipya.

Zana pia hupima utendaji wa programu kwa usahihi wa hadi milisekunde 25. Katika baadhi ya matukio, tunafunga sehemu za hati (kwa mfano, kurudia ingizo la agizo mara kadhaa) kuchambua uharibifu wa wakati wa utekelezaji kwa wakati. Matokeo ya vipimo vyote yameandikwa kwenye logi kwa uchambuzi.

Kuhusu mteja wa wavuti wa 1C
Chombo chetu cha majaribio na matumizi chini ya jaribio

Chombo chetu na Selenium hukamilishana; kwa mfano, ikiwa kitufe kwenye moja ya skrini kimebadilisha eneo lake, Selenium inaweza isifuatilie hii, lakini chombo chetu kitagundua, kwa sababu. hufanya ulinganisho wa pikseli-kwa-pixel wa picha ya skrini na kiwango. Chombo pia kinaweza kufuatilia matatizo na usindikaji wa pembejeo kutoka kwa kibodi au kipanya, kwa kuwa hii ndiyo hasa inazalisha.

Majaribio kwenye zana zote mbili (zetu na Selenium) huendesha hali za kawaida za kazi kutoka kwa suluhisho zetu za programu. Majaribio huzinduliwa kiotomatiki baada ya muundo wa kila siku wa 1C:Enterprise jukwaa. Ikiwa hati ni polepole (ikilinganishwa na muundo uliopita), tunachunguza na kutatua sababu ya kushuka. Kigezo chetu ni rahisi - muundo mpya haupaswi kufanya kazi polepole kuliko ule uliopita.

Watengenezaji hutumia zana tofauti kuchunguza matukio ya kupungua; hasa kutumika Toleo la Dynatrace AJAX uzalishaji wa kampuni DynaTrace. Kumbukumbu za utekelezaji wa operesheni ya shida kwenye ujenzi uliopita na mpya hurekodiwa, kisha magogo yanachambuliwa. Wakati huo huo, wakati wa utekelezaji wa shughuli moja (katika milliseconds) inaweza kuwa sio sababu ya kuamua - michakato ya huduma kama vile ukusanyaji wa takataka huzinduliwa mara kwa mara kwenye kivinjari, inaweza kuingiliana na wakati wa utekelezaji wa kazi na kupotosha picha. Vigezo muhimu zaidi katika kesi hii itakuwa idadi ya maagizo ya JavaScript yaliyotekelezwa, idadi ya shughuli za atomiki kwenye DOM, nk. Ikiwa idadi ya maagizo/operesheni katika hati sawa imeongezeka katika toleo jipya, hii karibu kila mara inamaanisha kushuka kwa utendaji ambao unahitaji kusahihishwa.

Pia, mojawapo ya sababu za kushuka kwa utendakazi inaweza kuwa kwamba Kikusanyaji cha Kufunga Google kwa sababu fulani hakikuweza kutekeleza ubadilishanaji wa chaguo za kukokotoa wa ndani (kwa mfano, kwa sababu chaguo la kukokotoa ni la kujirudia au la mtandaoni). Katika kesi hii, tunajaribu kurekebisha hali hiyo kwa kuandika tena msimbo wa chanzo.

Viendelezi vya kivinjari

Wakati suluhisho la programu linahitaji utendakazi ambao haupatikani katika JavaScript, tunatumia viendelezi vya kivinjari:

  • kwa kufanya kazi na faili
  • kwa kufanya kazi na cryptography
  • kazi na vipengele vya nje

Viendelezi vyetu vinajumuisha sehemu mbili. Sehemu ya kwanza ni kile kinachoitwa upanuzi wa kivinjari (kawaida upanuzi wa Chrome na Firefox ulioandikwa katika JavaScript), ambayo huingiliana na sehemu ya pili - ugani wa binary unaotekelezea utendaji tunaohitaji. Inapaswa kutajwa kuwa tunaandika matoleo 3 ya upanuzi wa binary - kwa Windows, Linux na MacOS. Kiendelezi cha binary hutolewa kama sehemu ya 1C:Enterprise jukwaa na kinapatikana kwenye seva ya programu ya 1C. Inapoitwa kwa mara ya kwanza kutoka kwa mteja wa wavuti, inapakuliwa kwa kompyuta ya mteja na kusakinishwa kwenye kivinjari.

Wakati wa kufanya kazi katika Safari, viendelezi vyetu hutumia NPAPI; wakati wa kufanya kazi katika Internet Explorer, hutumia teknolojia ya ActiveX. Microsoft Edge bado haitumii viendelezi, kwa hivyo mteja wa wavuti ndani yake hufanya kazi na vizuizi.

Maendeleo zaidi

Mojawapo ya kazi za timu ya ukuzaji wa mteja wa wavuti ni ukuzaji zaidi wa utendakazi. Utendakazi wa mteja wa wavuti unapaswa kufanana na utendakazi wa mteja mwembamba; utendakazi wote mpya unatekelezwa kwa wakati mmoja katika wateja wembamba na wa wavuti.

Kazi zingine ni pamoja na kukuza usanifu, kurekebisha tena, kuboresha utendaji na kuegemea. Kwa mfano, moja ya maelekezo ni harakati zaidi kuelekea mfano wa kazi wa asynchronous. Baadhi ya utendakazi wa mteja wa wavuti kwa sasa umejengwa juu ya modeli ya kuingiliana na seva. Mtindo wa asynchronous sasa unakuwa muhimu zaidi katika vivinjari (na sio tu kwenye vivinjari), na hii inatulazimisha kurekebisha mteja wa wavuti kwa kuchukua nafasi ya simu zinazosawazishwa na zile za asynchronous (na kuweka tena nambari ipasavyo). Mpito wa polepole kwa mfano wa asynchronous unaelezewa na hitaji la kuunga mkono suluhisho zilizotolewa na urekebishaji wao wa taratibu.

Chanzo: mapenzi.com

Kuongeza maoni