1C veb-mijoz haqida

1C: Enterprise texnologiyasining yoqimli xususiyatlaridan biri shundaki, boshqariladigan shakllar texnologiyasidan foydalangan holda ishlab chiqilgan dastur yechimi Windows, Linux, MacOS X uchun nozik (bajariladigan) mijozda ham, 5 ta brauzer uchun veb-mijoz sifatida ham ishga tushirilishi mumkin - Chrome, Internet Explorer, Firefox, Safari, Edge va bularning barchasi dasturning manba kodini o'zgartirmasdan. Bundan tashqari, tashqi tomondan, dastur nozik mijoz va brauzerda ishlaydi va deyarli bir xil ko'rinadi.
10 ta farqni toping (kesim ostidagi 2 ta rasm):

Linuxda yupqa mijoz oynasi:

1C veb-mijoz haqida

Xuddi shu oyna veb-mijozda (Chrome brauzerida):

1C veb-mijoz haqida

Nima uchun biz veb-mijoz yaratdik? Bir oz achinarli qilib aytganda, vaqt oldimizga shunday vazifa qo'ygan. Internet orqali ishlash uzoq vaqtdan beri biznes ilovalari uchun zaruriy shart bo'lib kelgan. Birinchidan, biz nozik mijozimiz uchun Internet orqali ishlash qobiliyatini qo'shdik (aytmoqchi, bizning ba'zi raqobatchilarimiz buni to'xtatdilar; boshqalari, aksincha, nozik mijozdan voz kechib, veb-mijozni amalga oshirish bilan cheklanishdi). Biz foydalanuvchilarga o'zlariga mos keladigan mijoz variantini tanlash imkoniyatini berishga qaror qildik.

1C veb-mijoz haqida

Yupqa mijozga veb-ga asoslangan imkoniyatlarni qo'shish mijoz-server arxitekturasini to'liq o'zgartirish bilan katta loyiha edi. Veb-mijozni yaratish noldan boshlab butunlay yangi loyihadir.

Muammoni shakllantirish

Shunday qilib, loyiha talablari: veb-mijoz nozik mijoz bilan bir xil qilish kerak, xususan:

  1. Foydalanuvchi interfeysini ko'rsatish
  2. 1C tilida yozilgan mijoz kodini bajaring

1C-dagi foydalanuvchi interfeysi vizual muharrirda tasvirlangan, ammo deklarativ ravishda, elementlarning piksel-piksel joylashuvisiz; O'nga yaqin interfeys elementlaridan foydalaniladi - tugmalar, kiritish maydonlari (matn, raqamli, sana/vaqt), ro'yxatlar, jadvallar, grafiklar va boshqalar.

1C tilidagi mijoz kodi server qo'ng'iroqlari, mahalliy resurslar (fayllar va boshqalar) bilan ishlash, chop etish va boshqalarni o'z ichiga olishi mumkin.

Yupqa mijoz (veb orqali ishlaganda) ham, veb-mijoz ham 1C dastur serveri bilan bog'lanish uchun bir xil veb-xizmatlardan foydalanadi. Mijozlarni amalga oshirish, albatta, har xil - nozik mijoz C++ da, veb-mijoz JavaScript-da yozilgan.

Biroz tarix

Veb-mijoz loyihasi 2006 yilda (o'rtacha) 5 kishidan iborat jamoa bilan boshlangan. Loyihaning muayyan bosqichlarida ishlab chiquvchilar muayyan funksionallikni (elektron jadval hujjati, diagrammalar va boshqalar) amalga oshirish uchun jalb qilingan; qoida tariqasida, bu nozik mijozda ushbu funktsiyani amalga oshirgan bir xil ishlab chiquvchilar edi. Bular. Ishlab chiquvchilar avval C++ da yaratgan komponentlarini JavaScript-da qayta yozishdi.

Ikki til o'rtasidagi kuchli kontseptual tafovutlar tufayli biz boshidanoq C++ yupqa mijoz kodini JavaScript veb mijoziga avtomatik (hatto qisman) aylantirish g'oyasini rad etdik; veb-mijoz JavaScript-da noldan yozilgan.

Loyihaning birinchi iteratsiyasida veb-mijoz o'rnatilgan 1C tilidagi mijoz kodini to'g'ridan-to'g'ri JavaScript-ga o'zgartirdi. Yupqa mijoz boshqacha harakat qiladi - o'rnatilgan 1C tilidagi kod bayt-kodga kompilyatsiya qilinadi va keyin bu bayt-kod mijozda talqin qilinadi. Keyinchalik, veb-mijoz ham xuddi shunday qila boshladi - birinchidan, u ishlash samaradorligini oshirdi, ikkinchidan, bu nozik va veb-mijozlarning arxitekturasini birlashtirishga imkon berdi.

Veb-mijozlarni qo'llab-quvvatlashga ega 1C: Enterprise platformasining birinchi versiyasi 2009 yilda chiqarilgan. O'sha paytda veb-mijoz ikkita brauzerni qo'llab-quvvatlagan - Internet Explorer va Firefox. Dastlabki rejalar Opera-ni qo'llab-quvvatlashni o'z ichiga olgan, ammo o'sha paytda Opera-da dasturni yopish ishlov beruvchilari bilan hal qilib bo'lmaydigan muammolar tufayli (ilova yopilganligini 2% ishonch bilan kuzatib bo'lmaydi va o'sha paytda o'chirish jarayoni amalga oshirilmadi. 100C dastur serveri) ushbu rejalardan voz kechish kerak edi.

Loyiha tuzilishi

Hammasi bo'lib 1C: Enterprise platformasida JavaScript-da yozilgan 4 ta loyiha mavjud:

  1. WebTools - boshqa loyihalar tomonidan ishlatiladigan umumiy kutubxonalar (biz ham o'z ichiga olamiz Google yopilish kutubxonasi).
  2. Boshqaruv Formatlangan hujjat (JavaScript-da nozik mijozda ham, veb-mijozda ham amalga oshiriladi)
  3. Boshqaruv Rejalashtiruvchi (JavaScript-da nozik mijozda ham, veb-mijozda ham amalga oshiriladi)
  4. Veb mijoz

Har bir loyihaning tuzilishi Java loyihalari (yoki .NET loyihalari - qaysi biri yaqinroq bo'lsa) tuzilishiga o'xshaydi; Bizda nomlar maydoni bor va har bir nom maydoni alohida papkada. Jildning ichida fayllar va nomlar maydoni sinflari mavjud. Veb-mijoz loyihasida 1000 ga yaqin fayl mavjud.

Tarkibiy jihatdan veb-mijoz asosan quyidagi quyi tizimlarga bo'linadi:

  • Boshqariladigan mijoz ilova interfeysi
    • Umumiy dastur interfeysi (tizim menyulari, panellar)
    • Boshqariladigan shakllar interfeysi, shu jumladan, 30 ga yaqin boshqaruv elementlari (tugmalar, har xil turdagi kiritish maydonlari - matn, raqam, sana/vaqt va boshqalar, jadvallar, ro'yxatlar, grafiklar va boshqalar).

  • Mijozda ishlab chiquvchilar uchun mavjud bo'lgan ob'ekt modeli (jami 400 dan ortiq turlar: boshqariladigan interfeys ob'ekti modeli, ma'lumotlarni joylashtirish sozlamalari, shartli uslublar va boshqalar).
  • O'rnatilgan 1C tilining tarjimoni
  • Brauzer kengaytmalari (JavaScript-da qo'llab-quvvatlanmaydigan funksiyalar uchun ishlatiladi)
    • Kriptografiya bilan ishlash
    • Fayllar bilan ishlash
    • Tashqi komponentlar texnologiyasi, ularni nozik va veb-mijozlarda ishlatishga imkon beradi

Rivojlanish xususiyatlari

Yuqoridagilarning barchasini JavaScript-da amalga oshirish oson emas. Ehtimol, 1C veb-mijozi JavaScript-da yozilgan eng katta mijoz ilovalaridan biri - taxminan 450.000 XNUMX satr. Biz veb-mijoz kodida ob'ektga yo'naltirilgan yondashuvdan faol foydalanamiz, bu esa bunday yirik loyiha bilan ishlashni osonlashtiradi.

Mijoz kodining hajmini minimallashtirish uchun biz birinchi navbatda o'z obfuscatorimizdan foydalandik va platformaning 8.3.6 versiyasidan (2014 yil oktyabr) foydalanishni boshladik. Google Closure Compiler. Raqamlarda foydalanishning ta'siri - chalkashlikdan keyin veb-mijoz ramkasining o'lchami:

  • O'z obfuscator - 1556 kb
  • Google Closure Compiler - 1073 kb

Google Closure Compiler-dan foydalanish veb-mijozning ish faoliyatini bizning obfuscatorimizga nisbatan 30% ga yaxshilashga yordam berdi. Bundan tashqari, dastur tomonidan iste'mol qilinadigan xotira hajmi 15-25% ga kamaydi (brauzerga qarab).

Google Closure Compiler ob'ektga yo'naltirilgan kod bilan juda yaxshi ishlaydi, shuning uchun veb-mijoz uchun uning samaradorligi iloji boricha yuqori. Closure Compiler biz uchun bir nechta yaxshi narsalarni qiladi:

  • Loyihani yaratish bosqichida statik turni tekshirish (kodni JSDoc izohlari bilan qoplashimizni ta'minlaydi). Natijada C++ da yozish darajasiga juda yaqin bo'lgan statik yozish. Bu loyihani tuzish bosqichida xatolarning juda katta foizini qo'lga kiritishga yordam beradi.
  • Xiralashtirish orqali kod hajmini kamaytirish
  • Bajarilgan kodning bir qator optimallashtirishlari, masalan:
    • inline funktsiyalarni almashtirish. JavaScript-da funktsiyani chaqirish juda qimmat operatsiya bo'lib, tez-tez ishlatiladigan kichik usullarni inline almashtirish kodni sezilarli darajada tezlashtiradi.
    • Kompilyatsiya vaqtida konstantalarni hisoblash. Agar ifoda doimiyga bog'liq bo'lsa, doimiyning haqiqiy qiymati unga almashtiriladi

Biz WebStorm-dan veb-mijozlarni ishlab chiqish muhiti sifatida foydalanamiz.

Kod tahlili uchun biz foydalanamiz SonarQube, bu erda biz statik kod analizatorlarini birlashtiramiz. Analizatorlar yordamida biz JavaScript manba kodining sifati yomonlashuvini kuzatamiz va uning oldini olishga harakat qilamiz.

1C veb-mijoz haqida

Biz qanday muammolarni hal qildik?

Loyihani amalga oshirish jarayonida biz hal qilishimiz kerak bo'lgan bir qator qiziqarli muammolarga duch keldik.

Server bilan va Windows o'rtasida ma'lumotlarni almashish

Manba kodini chalkashtirib yuborish tizimning ishlashiga xalaqit berishi mumkin bo'lgan holatlar mavjud. Veb-mijozning bajariladigan kodidan tashqaridagi kod chalkashlik tufayli bizning bajariladigan kodimiz kutganidan farq qiladigan funksiya va parametr nomlariga ega bo'lishi mumkin. Biz uchun tashqi kod:

  • Ma'lumotlar tuzilmalari shaklida serverdan keladigan kod
  • Boshqa dastur oynasi uchun kod

Server bilan ishlashda chalkashliklarga yo'l qo'ymaslik uchun @expose tegidan foydalanamiz:

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

Va boshqa oynalar bilan o'zaro aloqada bo'lishning oldini olish uchun biz eksport qilingan interfeyslardan foydalanamiz (barcha usullar eksport qilinadigan interfeyslar).

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

Biz Virtual DOM-dan asosiy oqimga aylanishidan oldin foydalandik)

Murakkab Web UI bilan shug'ullanadigan barcha ishlab chiquvchilar singari, biz tezda DOM dinamik foydalanuvchi interfeyslari bilan ishlashga juda mos emasligini angladik. Deyarli darhol UI bilan ishlashni optimallashtirish uchun Virtual DOM analogi amalga oshirildi. Hodisalarni qayta ishlash jarayonida barcha DOM o'zgarishlari xotirada saqlanadi va faqat barcha operatsiyalar tugallangandan so'ng, to'plangan o'zgarishlar DOM daraxtiga qo'llaniladi.

Veb-mijozni optimallashtirish

Veb-mijozimiz tezroq ishlashi uchun biz standart brauzer imkoniyatlaridan (CSS va boshqalar) maksimal darajada foydalanishga harakat qilamiz. Shunday qilib, forma buyruqlar paneli (dasturning deyarli barcha shakllarida joylashgan) faqat brauzer vositalaridan foydalangan holda, CSS-ga asoslangan dinamik tartib yordamida taqdim etiladi.

1C veb-mijoz haqida

Viktorina

Funktsional va unumdorlikni tekshirish uchun biz xususiy vositadan (Java va C++-da yozilgan), shuningdek, yuqorida tuzilgan testlar to'plamidan foydalanamiz. Selen.

Bizning vositamiz universaldir - u deyarli har qanday oynali dasturni sinab ko'rish imkonini beradi va shuning uchun ham nozik mijozni, ham veb-mijozni sinab ko'rish uchun javob beradi. Asbob skript faylida 1C ilova yechimini ishga tushirgan foydalanuvchining harakatlarini qayd etadi. Shu bilan birga, ekranning ish maydonining tasvirlari - standartlar - yozib olinadi. Veb-mijozning yangi versiyalarini kuzatishda skriptlar foydalanuvchi ishtirokisiz o'ynaladi. Agar skrinshot har qanday bosqichda mos yozuvlarga mos kelmasa, test muvaffaqiyatsiz deb hisoblanadi, shundan so'ng sifat bo'yicha mutaxassis bu xato yoki tizim xatti-harakatlaridagi rejalashtirilgan o'zgarish ekanligini aniqlash uchun tekshiruv o'tkazadi. Rejalashtirilgan xatti-harakatlar bo'lsa, standartlar avtomatik ravishda yangilari bilan almashtiriladi.

Asbob, shuningdek, 25 millisekundgacha bo'lgan aniqlik bilan dastur ish faoliyatini o'lchaydi. Ba'zi hollarda biz skript qismlarini aylantiramiz (masalan, buyurtma yozuvini bir necha marta takrorlash) vaqt o'tishi bilan bajarilish vaqtining degradatsiyasini tahlil qilish. Barcha o'lchovlar natijalari tahlil qilish uchun jurnalga yoziladi.

1C veb-mijoz haqida
Bizning sinov vositamiz va sinovdan o'tayotgan dastur

Bizning vositamiz va Selen bir-birini to'ldiradi; Masalan, agar ekranlardan biridagi biron bir tugma o'z joyini o'zgartirgan bo'lsa, Selenium buni kuzatmasligi mumkin, ammo bizning vositamiz buni sezadi, chunki skrinshotni standart bilan piksel bo'yicha taqqoslashni amalga oshiradi. Asbob shuningdek, klaviatura yoki sichqonchadan kiritilgan ma'lumotlarni qayta ishlash bilan bog'liq muammolarni kuzatishi mumkin, chunki u aynan shu narsani takrorlaydi.

Ikkala vositadagi testlar (bizning va Selenium) amaliy yechimlarimizdan odatiy ish stsenariylarini bajaradi. Sinovlar 1C: Enterprise platformasining kundalik tuzilishidan so'ng avtomatik ravishda ishga tushiriladi. Agar skriptlar sekinroq bo'lsa (oldingi tuzilishga nisbatan), biz sekinlashuv sababini tekshiramiz va hal qilamiz. Bizning mezonimiz oddiy - yangi tuzilma avvalgisidan sekin ishlamasligi kerak.

Ishlab chiquvchilar sekinlashuv hodisalarini tekshirish uchun turli xil vositalardan foydalanadilar; asosan ishlatiladi Dynatrace AJAX nashri ishlab chiqarish kompaniyasi DynaTrace. Oldingi va yangi tuzilmalar bo'yicha muammoli operatsiyani bajarish jurnallari qayd etiladi, keyin jurnallar tahlil qilinadi. Shu bilan birga, bitta operatsiyalarni bajarish vaqti (millisekundlarda) hal qiluvchi omil bo'lishi mumkin emas - axlat yig'ish kabi xizmat ko'rsatish jarayonlari vaqti-vaqti bilan brauzerda ishga tushiriladi, ular funktsiyalarni bajarish vaqti bilan mos kelishi va rasmni buzishi mumkin. Bu holatda ko'proq mos keladigan parametrlar bajarilgan JavaScript ko'rsatmalarining soni, DOMdagi atom operatsiyalari soni va boshqalar bo'ladi. Agar bitta skriptdagi ko'rsatmalar/operatsiyalar soni yangi versiyada ko'paygan bo'lsa, bu deyarli har doim tuzatilishi kerak bo'lgan ishlashning pasayishini anglatadi.

Bundan tashqari, unumdorlikning pasayishi sabablaridan biri Google Closure Compiler ba'zi sabablarga ko'ra funktsiyani inline almashtirishni amalga oshira olmaganligi bo'lishi mumkin (masalan, funktsiya rekursiv yoki virtual bo'lgani uchun). Bunday holda, biz manba kodini qayta yozish orqali vaziyatni tuzatishga harakat qilamiz.

Brauzer kengaytmalari

Ilova yechimi JavaScript-da mavjud bo'lmagan funksiyalarga muhtoj bo'lsa, biz brauzer kengaytmalaridan foydalanamiz:

  • fayllar bilan ishlash uchun
  • kriptografiya bilan ishlash uchun
  • bilan ishlash tashqi komponentlar

Bizning kengaytmalarimiz ikki qismdan iborat. Birinchi qism brauzer kengaytmasi (odatda JavaScript-da yozilgan Chrome va Firefox uchun kengaytmalar) deb ataladigan narsa bo'lib, ikkinchi qism bilan o'zaro ta'sir qiladi - bizga kerak bo'lgan funksionallikni amalga oshiradigan ikkilik kengaytma. Shuni ta'kidlash kerakki, biz ikkilik kengaytmalarning 3 ta versiyasini yozamiz - Windows, Linux va MacOS uchun. Ikkilik kengaytma 1C: Enterprise platformasining bir qismi sifatida taqdim etilgan va 1C dastur serverida joylashgan. Birinchi marta veb-mijozdan chaqirilganda, u mijoz kompyuteriga yuklab olinadi va brauzerga o'rnatiladi.

Safari-da ishlayotganda kengaytmalarimiz NPAPI-dan foydalanadi, Internet Explorer-da ishlayotganda esa ActiveX texnologiyasidan foydalanadi. Microsoft Edge hali kengaytmalarni qo'llab-quvvatlamaydi, shuning uchun undagi veb-mijoz cheklovlar bilan ishlaydi.

Keyingi rivojlanish

Veb-mijozlarni ishlab chiqish guruhining vazifalaridan biri bu funksionallikni yanada rivojlantirishdir. Veb-mijozning funksionalligi nozik mijozning funksionalligi bilan bir xil bo'lishi kerak; barcha yangi funksiyalar bir vaqtning o'zida nozik va veb-mijozlarda amalga oshiriladi.

Boshqa vazifalarga arxitekturani rivojlantirish, qayta ishlash, ishlash va ishonchlilikni oshirish kiradi. Masalan, yo'nalishlardan biri asinxron ish modeliga keyingi harakatdir. Veb-mijozning ba'zi funksiyalari hozirda server bilan o'zaro aloqaning sinxron modeliga qurilgan. Asinxron model endi brauzerlarda (va nafaqat brauzerlarda) dolzarb bo'lib bormoqda va bu bizni sinxron qo'ng'iroqlarni asinxronlarga almashtirish (va shunga mos ravishda kodni qayta tiklash) orqali veb-mijozni o'zgartirishga majbur qiladi. Asinxron modelga bosqichma-bosqich o'tish, chiqarilgan echimlarni qo'llab-quvvatlash va ularni bosqichma-bosqich moslashtirish zarurati bilan izohlanadi.

Manba: www.habr.com

a Izoh qo'shish