"1C: Enterprise" platformasi - kaput ostida nima bor?

Hey Xabr!
Ushbu maqolada biz uning ichida qanday ishlashi haqida hikoyani boshlaymiz platformasi "1C: Enterprise 8" va uni ishlab chiqishda qanday texnologiyalardan foydalaniladi.

"1C: Enterprise" platformasi - kaput ostida nima bor?

Nima uchun biz bu qiziqarli deb o'ylaymiz? Birinchidan, chunki 1C: Enterprise 8 platformasi C++ (mijoz, server va h.k.), JavaScript (veb-mijoz) va yaqinda katta (10 million satr kodli) ilovadir. Java. Katta loyihalar hech bo'lmaganda ularning ko'lami tufayli qiziqarli bo'lishi mumkin, chunki kichik kod bazasida ko'rinmaydigan muammolar bunday loyihalarda to'liq kuchga kiradi. Ikkinchidan, "1C: Enterprise" - bu takrorlanadigan, "qutili" mahsulot va Habré-da bunday ishlanmalar haqida juda kam maqolalar mavjud. Boshqa jamoalar va kompaniyalarda qanday hayot borligini bilish har doim qiziq.

Shunday qilib, keling, boshlaylik. Ushbu maqolada biz platformada qo'llaniladigan ba'zi texnologiyalar haqida umumiy ma'lumot beramiz va amalga oshirishga chuqur kirmasdan landshaftni tasvirlaymiz. Darhaqiqat, ko'plab mexanizmlar uchun batafsil hikoya alohida maqolani, ba'zilari uchun esa butun kitobni talab qiladi!
Boshlash uchun asosiy narsalarni - 1C: Enterprise platformasi nima ekanligini va u qanday tarkibiy qismlardan iboratligini hal qilish kerak. Bu savolning javobi unchalik oddiy emas, chunki “Platforma” atamasi (qisqalik uchun biz uni shunday deb ataymiz) biznes ilovalarini ishlab chiqish, ish vaqti muhiti va boshqaruv vositalarini anglatadi. Quyidagi tarkibiy qismlarni taxminan ajratish mumkin:

  • server klasteri
  • Serverga http va o'zining ikkilik protokoli orqali ulanishga qodir "nozik" mijoz
  • qattiq diskda yoki tarmoq papkasida joylashgan ma'lumotlar bazasi bilan ikki darajali arxitekturada ishlash uchun mijoz
  • veb-mijoz
  • dastur serverini boshqarish vositalari
  • ishlab chiqish muhiti (Konfigurator sifatida tanilgan)
  • iOS, Android va Windows Phone uchun ish vaqti muhiti (mobil platformasi 1C)

Bu barcha qismlar, veb-mijozdan tashqari, C++ da yozilgan. Bundan tashqari, yaqinda e'lon qilingan Yangi avlod konfigurator, Java tilida yozilgan.

Mahalliy ilovalar

C++ 03 mahalliy ilovalarni ishlab chiqish uchun ishlatiladi. Windows uchun kompilyator sifatida Microsoft Visual C++ 12 (Windows XP bilan mos profil), Linux va Android uchun - gcc 4.8, iOS uchun - clang 5.0 ishlatiladi. Amaldagi standart kutubxona barcha operatsion tizimlar va kompilyatorlar uchun bir xil - STLPort. Ushbu yechim STLni amalga oshirishga xos xatolar ehtimolini kamaytiradi. Biz hozirda CLang bilan birga yuborilgan STL ilovasiga o‘tishni rejalashtirmoqdamiz, chunki STLPort to‘xtatilgan va gcc C++11 yoqilgan rejimiga mos kelmaydi.
Serverning kod bazasi 99% keng tarqalgan, mijozniki - 95%. Bundan tashqari, hatto mobil platforma ham "katta" bilan bir xil C++ kodidan foydalanadi, garchi u erda birlashish foizi biroz pastroq.
Aksariyat C++ foydalanuvchilari singari, biz til va uning kutubxonalari imkoniyatlaridan 100% foydalanishga daʼvo qilmaymiz. Shunday qilib, biz Boost-dan deyarli foydalanmaymiz va til xususiyatlaridan biri bu dinamik tipdagi quyma. Shu bilan birga, biz faol foydalanamiz:

  • STL (ayniqsa satrlar, konteynerlar va algoritmlar)
  • bir nechta meros, shu jumladan. bir nechta amalga oshirish merosi
  • andozalar
  • istisnolar
  • aqlli ko'rsatkichlar (maxsus amalga oshirish)

Interfeyslarning bir nechta merosxo'rligi (to'liq mavhum sinflar) yordamida quyida ko'rib chiqiladigan komponent modeli mumkin bo'ladi.

komponentlar

Modullilikni ta'minlash uchun barcha funksionallik komponentlarga bo'linadi, ular dinamik kutubxonalardir (Windows uchun *.dll, Linux uchun *.so). Hammasi bo'lib bir yuz ellikdan ortiq tarkibiy qismlar mavjud, ulardan ba'zilarining tavsifi:

backend
Platforma metadata mexanizmini o'z ichiga oladi

accnt
Ilova ishlab chiquvchilari buxgalteriya yozuvlarini yaratish uchun foydalanadigan ob'ektlar (hisob jadvallari va buxgalteriya registrlari)

bsl
O'rnatilgan tilni bajarish mexanizmi

yadro
Xotirani taqsimlash moslamasini moslashtirish

dbeng8
Fayl ma'lumotlar bazasi mexanizmi. ISAM-ga asoslangan oddiy fayl serveri ma'lumotlar bazasi mexanizmi, shuningdek, oddiy SQL protsessorini ham o'z ichiga oladi

wbase
Windows foydalanuvchi interfeysini amalga oshirish uchun asosiy sinflar va funktsiyalarni o'z ichiga oladi - oyna sinflari, GDI kirish va boshqalar.

Bir nechta komponentlarga bo'linish bir necha nuqtai nazardan foydalidir:

  • Ajratish yaxshiroq dizaynni, xususan, kodni yaxshiroq izolyatsiya qilishni ta'minlaydi
  • Komponentlar to'plamidan siz turli xil etkazib berish variantlarini moslashuvchan tarzda yig'ishingiz mumkin:
    • Misol uchun, yupqa mijoz o'rnatilishi wbase-ni o'z ichiga oladi, lekin backend bo'lmaydi
    • lekin wbase serverida, aksincha, bo'lmaydi
    • har ikkala variantda albatta nuke va bsl bo'ladi

Ushbu ishga tushirish opsiyasi uchun zarur bo'lgan barcha komponentlar dastur boshlanganda yuklanadi. Bu, xususan, quyida muhokama qilinadigan SCOM sinflarini ro'yxatdan o'tkazish uchun zarurdir.

SCOM

Pastroq darajadagi parchalanish uchun SCOM tizimi, mafkurada ATLga o'xshash kutubxona ishlatiladi. ATL bilan ishlamaganlar uchun biz asosiy imkoniyatlar va xususiyatlarni qisqacha sanab o'tamiz.
Maxsus ishlab chiqilgan SCOM sinfi uchun:

  • Boshqa komponentdan faqat uning nomini bilgan holda sinf yaratishga imkon beruvchi zavod usullarini taqdim etadi (amalga oshirishni oshkor qilmasdan)
  • Malumotni hisoblaydigan aqlli ko'rsatgich infratuzilmasini taqdim etadi. SCOM sinfining ishlash muddati qo'lda kuzatilishi shart emas
  • Ob'ekt ma'lum bir interfeysni amalga oshiradimi yoki yo'qligini aniqlash va ob'ektga ko'rsatgichni interfeysga avtomatik ravishda aylantirish imkonini beradi.
  • Get_service usuli va boshqalar orqali har doim foydalanish mumkin bo'lgan xizmat ob'ektini yarating.

Masalan, json.dll komponentida JSON (masalan, JSONStreamReader) o'qish uchun sinfni tasvirlashingiz mumkin.
Sinflar va misollar boshqa komponentlardan yaratilishi mumkin, ular SCOM mashinasida ro'yxatdan o'tkazilishi kerak:

SCOM_CLASS_ENTRY(JSONStreamReader)

Ushbu makros maxsus statik magnitafon sinfini tavsiflaydi, uning konstruktori komponent xotiraga yuklanganda chaqiriladi.
Shundan so'ng siz boshqa komponentda uning namunasini yaratishingiz mumkin:

IJSONStreamReaderPtr jsonReader = create_instance<IJSONStreamReader>(SCOM_CLSIDOF(JSONStreamReader));

Xizmatlarni qo'llab-quvvatlash uchun SCOM qo'shimcha, ancha murakkab infratuzilmani taklif qiladi. Uning markazida SCOM jarayoni kontseptsiyasi mavjud bo'lib, u xizmatlarni ishga tushirish uchun konteyner bo'lib xizmat qiladi (ya'ni, Xizmatlarni aniqlash rolini o'ynaydi), shuningdek, mahalliylashtirilgan resurslar bilan bog'lanishni o'z ichiga oladi. SCOM jarayoni OS tizimiga bog'langan. Buning yordamida ilova ichida siz quyidagi xizmatlarni olishingiz mumkin:

SCOM_Process* process = core::current_process();
if (process)
         return get_service<IMyService>(process);

Bundan tashqari, ipga bog'langan mantiqiy (SCOM) jarayonlarni almashtirish orqali siz ma'lumot maydoni nuqtai nazaridan deyarli mustaqil bo'lgan, bir xil ip ichida ishlaydigan ilovalarni olishingiz mumkin. Bizning nozik mijozimiz fayl ma'lumotlar bazasi bilan shunday ishlaydi - bitta OS jarayoni ichida ikkita SCOM jarayoni mavjud, biri mijoz bilan, ikkinchisi server bilan. Ushbu yondashuv mahalliy fayl ma'lumotlar bazasida va "haqiqiy" mijoz-server versiyasida ishlaydigan kod yozishni birlashtirishga imkon beradi. Bunday bir xillikning narxi ortiqcha, ammo amaliyot shuni ko'rsatadiki, bunga arziydi.

SCOM komponent modeli asosida 1C: Enterprise ning biznes mantig'i ham, interfeys qismi ham amalga oshirildi.

Foydalanuvchi interfeysi

Aytgancha, interfeyslar haqida. Biz standart Windows boshqaruv vositalaridan foydalanmaymiz; bizning boshqaruvimiz to'g'ridan-to'g'ri Windows API-da amalga oshiriladi. Linux versiyasi uchun wxWidgets kutubxonasi orqali ishlaydigan qatlam yaratilgan.
Boshqaruv kutubxonasi 1C: Enterprise ning boshqa qismlariga bog'liq emas va biz tomonidan boshqa bir nechta kichik ichki yordamchi dasturlarda foydalaniladi.

1C: Enterprise-ning rivojlanish yillari davomida boshqaruv elementlarining ko'rinishi o'zgardi, ammo printsiplarning jiddiy o'zgarishi faqat bir marta, 2009 yilda, 8.2 versiyasining chiqarilishi va "boshqariladigan shakllar" ning paydo bo'lishi bilan sodir bo'ldi. Tashqi ko'rinishini o'zgartirish bilan bir qatorda, shaklni joylashtirish printsipi tubdan o'zgardi - elementlarning oqim tartibi foydasiga elementlarning piksel-piksel joylashuvi rad etildi. Bundan tashqari, yangi modelda boshqaruv elementlari to'g'ridan-to'g'ri domen ob'ektlari bilan emas, balki maxsus DTOlar bilan ishlaydi (Ma'lumotlarni uzatish ob'ektlari).
Ushbu o'zgarishlar JavaScript boshqaruv elementlarining C++ mantiqini takrorlaydigan 1C: Enterprise veb-mijozini yaratish imkonini berdi. Biz nozik va veb-mijozlar o'rtasida funktsional ekvivalentlikni saqlashga harakat qilamiz. Bu mumkin bo'lmagan hollarda, masalan, mavjud JavaScript API cheklovlari tufayli (masalan, fayllar bilan ishlash qobiliyati juda cheklangan), biz ko'pincha C++ da yozilgan brauzer kengaytmalari yordamida kerakli funksiyalarni amalga oshiramiz. Hozirda biz Internet Explorer va Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows va Linux) va Safari (MacOS) qo'llab-quvvatlaymiz.

Bundan tashqari, boshqariladigan shakllar texnologiyasi 1C platformasida mobil ilovalar uchun interfeys yaratish uchun ishlatiladi. Mobil qurilmalarda boshqaruv elementlarini ko'rsatish operatsion tizimga xos bo'lgan texnologiyalar yordamida amalga oshiriladi, ammo shakllar mantig'i va interfeysga javob berish uchun "katta" 1C: Enterprise platformasidagi kabi bir xil kod ishlatiladi.

"1C: Enterprise" platformasi - kaput ostida nima bor?
Linux operatsion tizimida 1C interfeysi

"1C: Enterprise" platformasi - kaput ostida nima bor?
Mobil qurilmada 1C interfeysi

Boshqa platformalarda 1C interfeysi "1C: Enterprise" platformasi - kaput ostida nima bor?
Windows operatsion tizimida 1C interfeysi

"1C: Enterprise" platformasi - kaput ostida nima bor?
Interfeys 1C - veb-mijoz

Open source

Biz Windows ostida C++ ishlab chiquvchilari uchun standart kutubxonalardan foydalanmasak ham (MFC, WinAPI dan boshqarish), biz barcha komponentlarni o'zimiz yozmaymiz. Kutubxona haqida allaqachon aytib o'tilgan wxVidjetlar, va biz ham foydalanamiz:

  • cURL HTTP va FTP bilan ishlash uchun.
  • OpenSSL kriptografiya bilan ishlash va TLS ulanishlarini o'rnatish uchun
  • libxml2 va libxslt XML tahlili uchun
  • libetpan pochta protokollari bilan ishlash uchun (POP3, SMTP, IMAP)
  • mimetik elektron pochta xabarlarini tahlil qilish uchun
  • sqllite foydalanuvchi jurnallarini saqlash uchun
  • ICU xalqarolashtirish uchun

Ro‘yxat davom etadi.
Bundan tashqari, biz juda o'zgartirilgan versiyadan foydalanamiz Google testi и Google Mock birlik testlarini ishlab chiqishda.
Kutubxonalar SCOM komponentlarini tashkil etish modeliga mos kelishi uchun moslashuvni talab qildi.
1C ning tarqalishi platformani unda ishlatiladigan kutubxonalar uchun ajoyib kuch sinoviga aylantiradi. Turli xil foydalanuvchilar va stsenariylar kodning eng kam ishlatiladigan sohalarida ham xatolarni tezda ochib beradi. Biz ularni o'zimiz tuzatamiz va kutubxona mualliflariga qaytarishga harakat qilamiz. O'zaro ta'sir qilish tajribasi juda boshqacha bo'lib chiqadi.
Ishlab chiquvchilar cURL и libetpan pull-so'rovlarga tezda javob beradi, lekin yamoq, masalan, ichida OpenSSL Biz uni hech qachon qaytarib bera olmadik.

xulosa

Maqolada biz 1C: Enterprise platformasini rivojlantirishning bir nechta asosiy jihatlariga to'xtaldik. Maqolaning cheklangan doirasida biz faqat ba'zi qiziqarli, bizning fikrimizcha, jihatlarga to'xtaldik.
Turli platforma mexanizmlarining umumiy tavsifini topish mumkin shu yerda.
Kelgusi maqolalarda qanday mavzular sizni qiziqtiradi?

1C mobil platformasi qanday amalga oshiriladi?
Veb-mijozning ichki tuzilishi tavsifi?
Yoki siz yangi versiyalar uchun xususiyatlarni tanlash, ishlab chiqish va sinovdan o'tkazish jarayoniga qiziqasizmi?

Izohlarda yozing!

Manba: www.habr.com

a Izoh qo'shish