Ngeunaan klien wéb 1C

Salah sahiji fitur anu saé tina 1C: Téknologi Perusahaan nyaéta solusi aplikasi, dikembangkeun nganggo téknologi formulir anu diurus, tiasa diluncurkeun dina klien ipis (eksekusi) pikeun Windows, Linux, MacOS X, sareng salaku klien wéb pikeun 5 browser - Chrome, Internet Explorer, Firefox, Safari, Edge, sareng sadaya ieu tanpa ngarobih kode sumber aplikasi. Leuwih ti éta, externally aplikasi dina klien ipis jeung dina fungsi browser sarta kasampak ampir identik.
Manggihan 10 bédana (2 gambar handapeun cut):

Jandéla klien tipis dina Linux:

Ngeunaan klien wéb 1C

Jandéla anu sami dina klien wéb (dina browser Chrome):

Ngeunaan klien wéb 1C

Naha urang ngadamel klien wéb? Pikeun nempatkeun éta rada pathetically, waktos parantos nyetél tugas sapertos kitu pikeun urang. Gawé dina Internét parantos lami janten prasyarat pikeun aplikasi bisnis. Kahiji, urang ditambahkeun kamampuhan pikeun digawé via Internet pikeun klien ipis urang (sababaraha pesaing urang, ku jalan kitu, dieureunkeun di dinya; batur, sabalikna, ditinggalkeun klien ipis jeung ngawatesan diri pikeun nerapkeun hiji klien web). Kami mutuskeun pikeun masihan pangguna kasempetan pikeun milih pilihan klien anu paling cocog pikeun aranjeunna.

Ngeunaan klien wéb 1C

Nambahkeun kamampuan basis wéb ka klien ipis mangrupikeun proyék ageung kalayan parobihan lengkep dina arsitektur klien-server. Nyiptakeun klien wéb mangrupikeun proyék énggal, mimitian ti mimiti.

Ngarumuskeun masalah

Janten, sarat proyék: klien wéb kedah sami sareng thin client, nyaéta:

  1. Témbongkeun panganteur pamaké
  2. Jalankeun kode klien anu ditulis dina basa 1C

Antarbeungeut pamaké dina 1C dijelaskeun dina redaktur visual, tapi sacara déklaratif, tanpa susunan elemen piksel-demi-piksel; Sakitar tilu belasan jinis elemen antarmuka dianggo - tombol, widang input (téks, angka, tanggal / waktos), daptar, tabel, grafik, jsb.

Kode klien dina basa 1C tiasa ngandung telepon server, damel sareng sumber daya lokal (file, jsb.), percetakan, sareng seueur deui.

Boh klien ipis (nalika damel via wéb) sareng klien wéb nganggo set jasa wéb anu sami pikeun komunikasi sareng server aplikasi 1C. Palaksanaan klien, tangtosna, béda - klien ipis ditulis dina C ++, klien wéb ditulis dina JavaScript.

A sajarah saeutik

Proyék klien wéb dimimitian taun 2006, kalayan tim (rata-rata) 5 urang. Dina sababaraha tahapan proyék, pamekar aub pikeun nerapkeun fungsionalitas khusus (dokumen spreadsheet, diagram, jsb.); Sakumaha aturan, ieu mangrupikeun pamekar anu sami anu ngalaksanakeun fungsi ieu dina klien ipis. Jelema. pamekar ulang nulis komponén dina JavaScript yén maranéhna sempet saméméhna dijieun dina C ++.

Ti mimiti pisan, urang nampik ide naon waé otomatis (sanajan parsial) konversi kode klien tipis C ++ kana klien wéb JavaScript kusabab bédana konseptual anu kuat antara dua basa; klien web ieu ditulis dina JavaScript ti scratch.

Dina iterations mimiti proyek, klien web ngarobah kodeu klien dina diwangun-di 1C basa langsung kana JavaScript. Klién ipis tindakan béda - kodeu dina basa 1C diwangun-di disusun kana bytecode, teras bytecode ieu diinterpretasi dina klien. Salajengna, klien wéb mimiti ngalakukeun hal anu sami - kahiji, éta masihan kauntungan kinerja, sareng kadua, ngamungkinkeun pikeun ngahijikeun arsitéktur klien ipis sareng wéb.

Versi munggaran tina platform 1C: Enterprise kalayan dukungan klien wéb dirilis dina 2009. Klién wéb dina waktos éta ngadukung 2 panyungsi - Internet Explorer sareng Firefox. Rencana aslina kaasup rojongan pikeun Opera, tapi alatan masalah insurmountable dina waktos anu sareng pawang nutup aplikasi dina Opera (teu mungkin pikeun ngalacak kalawan 100% kapastian yén aplikasi ieu nutup, sarta dina waktos anu sareng ngalaksanakeun prosedur disconnection ti. server aplikasi 1C) tina rencana ieu kedah ditinggalkeun.

Struktur proyék

Dina total, platform 1C: Enterprise ngagaduhan 4 proyék anu ditulis dina JavaScript:

  1. WebTools - perpustakaan dibagikeun dipaké ku proyék séjén (urang ogé kaasup Perpustakaan Google nutup).
  2. Unsur kontrol FormattedDocument (dilaksanakeun dina JavaScript dina klien ipis sareng klien wéb)
  3. Unsur kontrol Penjadwal (dilaksanakeun dina JavaScript dina klien ipis sareng klien wéb)
  4. Klién wéb

Struktur unggal proyék nyarupaan struktur proyék Java (atawa .NET proyék - whichever leuwih deukeut); Simkuring gaduh namespaces, sarta unggal namespace aya dina folder misah. Di jero polder aya file sareng kelas namespace. Aya kira-kira 1000 file dina proyék klien wéb.

Sacara stuktur, klien wéb umumna dibagi kana subsistem ieu:

  • panganteur aplikasi klien junun
    • Antarmuka aplikasi umum (menu sistem, panel)
    • Antarmuka bentuk anu diurus, kalebet, antara anu sanés, sakitar 30 kontrol (tombol, sababaraha jinis widang input - téks, angka, tanggal / waktos, jsb., tabél, daptar, grafik, jsb.)

  • Model obyék anu sayogi pikeun pamekar dina klien (jumlahna langkung ti 400 jinis: modél obyék antarmuka anu diurus, setélan perenah data, gaya kondisional, jsb.)
  • Juru basa 1C anu diwangun
  • Ekstensi browser (dipaké pikeun fungsionalitas teu dirojong dina JavaScript)
    • Gawe sareng kriptografi
    • Gawe sareng file
    • Téknologi komponén éksternal, ngamungkinkeun aranjeunna dianggo dina klien ipis sareng wéb

Fitur Pangwangunan

Ngalaksanakeun sadayana di luhur dina JavaScript henteu gampang. Panginten klien wéb 1C mangrupikeun salah sahiji aplikasi sisi klien panggedéna anu ditulis dina JavaScript - sakitar 450.000 garis. Urang aktip ngagunakeun pendekatan obyék-berorientasi dina kode klien web, nu simplifies gawé bareng proyék badag misalna.

Pikeun ngaleutikan ukuran kode klien, urang mimiti ngagunakeun obfuscator urang sorangan, sarta dimimitian ku versi platform 8.3.6 (Oktober 2014) urang mimitian nganggo. Google Closure Compiler. Pangaruh pamakéan dina angka - ukuran kerangka klien web sanggeus obfuscation:

  • Obfuscator sorangan - 1556 kb
  • Google Closure Compiler - 1073 kb

Ngagunakeun Google Closure Compiler mantuan kami ngaronjatkeun kinerja klien web ku 30% dibandingkeun obfuscator urang sorangan. Salaku tambahan, jumlah mémori anu dikonsumsi ku aplikasi parantos turun ku 15-25% (gumantung kana browser).

Google Closure Compiler berpungsi saé pisan sareng kode berorientasi obyék, ku kituna efisiensina pikeun klien wéb saluhur-luhurna. Closure Compiler ngalakukeun sababaraha hal anu hadé pikeun urang:

  • Mariksa tipe statik dina tahap ngawangun proyék (ngajamin yén urang nutupan kodeu sareng anotasi JSDoc). Hasilna nyaéta ketikan statik, caket pisan tingkat pikeun ngetik dina C ++. Ieu ngabantuan nyekel persentase kasalahan anu cukup ageung dina tahap kompilasi proyék.
  • Ngurangan ukuran kode ngaliwatan obfuscation
  • Sajumlah optimasi kode anu dieksekusi, contona, sapertos:
    • substitusi fungsi inline. Nyauran fungsi dina JavaScript mangrupikeun operasi anu lumayan mahal, sareng substitusi inline tina metode leutik anu sering dianggo sacara signifikan nyepetkeun kodeu.
    • Ngitung konstanta dina waktos kompilasi. Lamun hiji éksprési gumantung kana konstanta, nilai sabenerna konstanta bakal diganti kana eta

Kami nganggo WebStorm salaku lingkungan pangembangan klien wéb kami.

Pikeun analisis kode kami nganggo soundQube, dimana urang ngahijikeun analis kode statik. Nganggo analisa, urang ngawas degradasi kualitas kode sumber JavaScript sareng nyobian nyegah éta.

Ngeunaan klien wéb 1C

Masalah naon anu urang rengsekeun?

Salila palaksanaan proyék, urang encountered sababaraha masalah metot nu urang kudu ngajawab.

Tukeur data sareng server sareng antara windows

Aya kaayaan dimana obfuscation kode sumber tiasa ngaganggu operasi sistem. Kode éksternal kana kode eksekusi klien wéb, kusabab obfuscation, tiasa gaduh fungsi sareng nami parameter anu béda ti anu diarepkeun ku kode eksekusi urang. Kode éksternal pikeun kami nyaéta:

  • Kode asalna tina server dina bentuk struktur data
  • Kode pikeun jandela aplikasi séjén

Pikeun ngahindarkeun obfuscation nalika berinteraksi sareng server, kami nganggo tag @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;
}

Sareng pikeun ngahindarkeun obfuscation nalika berinteraksi sareng windows anu sanés, kami nganggo anu disebut antarmuka anu diékspor (antarmuka dimana sadaya metode diékspor).

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

Kami nganggo Virtual DOM sateuacan janten mainstream)

Sapertos sadaya pamekar anu ngurus UI Wéb anu kompleks, urang gancang sadar yén DOM kirang cocog pikeun damel sareng antarmuka pangguna anu dinamis. Ampir langsung, analog Virtual DOM dilaksanakeun pikeun ngaoptimalkeun karya sareng UI. Salila ngolah acara, sadaya parobahan DOM disimpen dina mémori sareng, ngan nalika sadaya operasi réngsé, parobahan akumulasi diterapkeun kana tangkal DOM.

Ngaoptimalkeun klien wéb

Pikeun ngajantenkeun klien wéb kami langkung gancang, kami nyobian nganggo kamampuan browser standar (CSS, jsb.) sacara maksimal. Ku kituna, panel paréntah formulir (tempatna dina ampir unggal formulir aplikasi) rendered éksklusif ngagunakeun parabot browser, ngagunakeun perenah dinamis dumasar kana CSS.

Ngeunaan klien wéb 1C

Tés

Pikeun nguji fungsional sareng kinerja, kami nganggo alat proprietary (ditulis dina Java sareng C++), ogé sakumpulan tés anu diwangun di luhur selenium.

Alat kami universal - éta ngamungkinkeun anjeun pikeun nguji ampir sagala program windowed, ku kituna cocog pikeun nguji klien ipis sareng klien wéb. Alat ngarékam tindakan pangguna anu ngaluncurkeun solusi aplikasi 1C kana file skrip. Dina waktos anu sami, gambar daérah kerja layar-standar-dirékam. Nalika ngawaskeun versi anyar tina klien wéb, naskah dimaénkeun tanpa partisipasi pangguna. Dina kasus dimana Potret layar henteu cocog sareng rujukan dina léngkah naon waé, tés dianggap gagal, saatos éta spesialis kualitas ngalaksanakeun panalungtikan pikeun nangtukeun naha éta kasalahan atanapi perobahan anu direncanakeun dina paripolah sistem. Dina hal paripolah anu direncanakeun, standarna otomatis diganti ku anu anyar.

Alat ogé ngukur kinerja aplikasi kalayan akurasi nepi ka 25 milidetik. Dina sababaraha kasus, urang loop bagian tina naskah (contona, repeating entri urutan sababaraha kali) pikeun nganalisis degradasi waktu palaksanaan kana waktu. Hasil sadaya pangukuran kacatet dina log pikeun dianalisis.

Ngeunaan klien wéb 1C
Alat tés sareng aplikasi kami nuju diuji

Alat urang sareng Selenium silih pelengkap; contona, lamun sababaraha tombol dina salah sahiji layar geus robah lokasina, Selenium bisa jadi teu ngalacak ieu, tapi alat urang bakal aya bewara, sabab ngajadikeun ngabandingkeun piksel-demi-piksel tina screenshot kalawan standar. Alatna ogé tiasa ngalacak masalah sareng ngolah input tina keyboard atanapi beurit, sabab éta leres-leres ngahasilkeun deui.

Tés dina duanana parabot (urang jeung Selenium) ngajalankeun skenario gawé has tina solusi aplikasi urang. Tés sacara otomatis diluncurkeun saatos ngawangun poean 1C: platform Perusahaan. Lamun naskah leuwih laun (dibandingkeun jeung wangunan saméméhna), urang nalungtik tur ngabéréskeun ngabalukarkeun slowdown nu. Kriteria kami saderhana - wangunan anyar kedah dianggo henteu langkung laun tibatan anu sateuacana.

Pamekar ngagunakeun parabot béda pikeun nalungtik insiden slowdown; utamana dipaké Dynatrace AJAX Edition pausahaan produksi DynaTrace. Log palaksanaan operasi bermasalah dina wangunan saméméhna sareng énggal dirékam, teras log dianalisis. Dina waktu nu sarua, waktu palaksanaan operasi tunggal (dina milliseconds) bisa jadi teu jadi faktor decisive - prosés layanan kayaning kempelan sampah périodik dibuka dina browser, aranjeunna tiasa tumpang tindih jeung waktu palaksanaan fungsi jeung distort gambar. Parameter anu langkung relevan dina hal ieu nyaéta jumlah paréntah JavaScript anu dieksekusi, jumlah operasi atom dina DOM, jsb. Lamun jumlah parentah / operasi dina Aksara sarua geus ngaronjat dina versi anyar, ieu ampir sok hartina serelek dina kinerja anu kudu dilereskeun.

Ogé, salah sahiji alesan turunna kinerja bisa jadi Google Closure Compiler pikeun sababaraha alesan teu bisa ngalakukeun substitusi inline sahiji fungsi (contona, sabab fungsi rekursif atawa virtual). Dina hal ieu, urang nyobian ngabenerkeun kaayaan ku nulis balik kodeu sumber.

Ekstensi browser

Nalika solusi aplikasi peryogi fungsionalitas anu henteu sayogi dina JavaScript, kami nganggo ekstensi browser:

Ekstensi kami diwangun ku dua bagian. Bagian kahiji nyaéta naon anu disebut extension browser (biasana ekstensi pikeun Chrome jeung Firefox ditulis dina JavaScript), nu interaksi jeung bagian kadua - a extension binér nu implements pungsionalitas urang kudu. Perlu disebatkeun yén urang nyerat 3 versi ekstensi binér - pikeun Windows, Linux sareng MacOS. Ekstensi binér disayogikeun salaku bagian tina platform 1C: Enterprise sareng ayana dina server aplikasi 1C. Lamun disebut pikeun kahiji kalina ti klien web, eta diundeur ka komputer klien tur dipasang dina browser nu.

Nalika ngajalankeun di Safari, ekstensi kami nganggo NPAPI; nalika ngajalankeun dina Internet Explorer, aranjeunna nganggo téknologi ActiveX. Microsoft Tepi henteu acan ngadukung ekstensi, janten klien wéb di dinya tiasa dianggo kalayan larangan.

Kamekaran salajengna

Salah sahiji tugas pikeun tim pangembangan klien wéb nyaéta ngembangkeun fungsionalitas salajengna. Pungsi klién wéb kedah sami sareng pungsionalitas thin client; sadaya pungsi énggal dilaksanakeun sakaligus dina klien ipis sareng wéb.

Tugas sanésna kalebet ngembangkeun arsitéktur, refactoring, ningkatkeun kinerja sareng reliabilitas. Salaku conto, salah sahiji arah nyaéta gerakan salajengna ka arah modél kerja asinkron. Sababaraha pungsionalitas klien wéb ayeuna diwangun dina modél interaksi sinkron sareng server. Modél asynchronous ayeuna janten langkung relevan dina browser (sareng henteu ngan dina browser), sareng ieu maksakeun urang ngarobih klien wéb ku cara ngagentos sauran sinkron sareng asynchronous (sareng refactoring kode anu sasuai). Transisi bertahap kana modél asinkron dijelaskeun ku kabutuhan pikeun ngadukung solusi anu dileupaskeun sareng adaptasi bertahapna.

sumber: www.habr.com

Tambahkeun komentar