Platforma "1C: Müəssisə" - kapotun altında nə var?

Hey Habr!
Bu yazıda içəridə necə işlədiyinə dair bir hekayəyə başlayacağıq 1C: Enterprise 8 platforması və onun hazırlanmasında hansı texnologiyalardan istifadə olunur.

Platforma "1C: Müəssisə" - kapotun altında nə var?

Niyə biz bunu maraqlı hesab edirik? Birincisi, ona görə ki, 1C: Enterprise 8 platforması C++ (müştəri, server və s.), JavaScript (veb müştəri) və daha yaxınlarda yazılmış böyük (10 milyon sətirdən çox kod) proqramdır. Java. Böyük layihələr yalnız miqyasına görə maraqlıdır, çünki kiçik kod bazasında görünməyən məsələlər belə layihələrdə tam hündürlüyünə yüksəlir. İkincisi, 1C: Enterprise təkrarlanan, "qutulu" məhsuldur və Habré-də bu cür inkişaflar haqqında çox az məqalə var. Və onların digər komanda və firmalarda necə yaşadıqlarını öyrənmək həmişə maraqlıdır.

Beləliklə, başlayaq. Bu yazıda biz platformada istifadə olunan bəzi texnologiyalar haqqında ümumi məlumat verəcəyik, tətbiqi dərinləşdirmədən mənzərəni təsvir edəcəyik. Həqiqətən, bir çox mexanizmlər üçün ətraflı bir hekayə ayrı bir məqaləyə, bəziləri üçün isə bütöv bir kitaba çəkiləcəkdir!
Başlamaq üçün əsas şeylərə qərar verməyə dəyər - 1C: Enterprise platforması nədir və hansı komponentlərdən ibarətdir. Bu sualın cavabı o qədər də sadə deyil, çünki “Platforma” termini (qısaca olaraq, biz onu belə adlandıracağıq) biznes proqramlarının hazırlanması üçün alət, icra mühiti və idarəetmə vasitələri kimi başa düşülür. Şərti olaraq aşağıdakı komponentləri ayırd etmək olar:

  • server klasteri
  • http və öz binar protokolu vasitəsilə serverə qoşula bilən "nazik" müştəri
  • sabit diskdə və ya şəbəkə qovluğunda yerləşən verilənlər bazası ilə iki səviyyəli arxitekturada işləmək üçün müştəri
  • veb müştəri
  • proqram serverinin idarəetmə vasitələri
  • inkişaf mühiti (konfiqurator kimi tanınır)
  • iOS, Android və Windows Phone üçün icra mühiti (mobil platforma 1C)

Veb müştəri istisna olmaqla, bütün bu hissələr C++ dilində yazılmışdır. Bundan əlavə, bu yaxınlarda açıqlanan var Yeni nəsil konfiqurator, Java dilində yazılmışdır.

Doğma proqramlar

C++ 03 yerli proqramları inkişaf etdirmək üçün istifadə olunur. Windows altında Microsoft Visual C++ 12 (Windows XP ilə uyğun profil) kompilyator kimi, Linux və Android sistemlərində gcc 4.8, iOS üçün isə clang 5.0 istifadə olunur. İstifadə olunan standart kitabxana bütün əməliyyat sistemləri və kompilyatorlar üçün eynidir - STLPort. Bu həll STL-nin həyata keçirilməsinə xas olan səhvlərin olma ehtimalını azaldır. Biz hal-hazırda CLang ilə təmin edilən STL tətbiqinə keçməyi planlaşdırırıq, çünki STLPort köhnəlib və gcc-in aktivləşdirilmiş C++11 dəstək rejimi ilə uyğun gəlmir.
Serverin kod bazası 99% ümumidir, müştəri - 95%. Üstəlik, hətta mobil platforma "böyük" ilə eyni C++ kodundan istifadə edir, baxmayaraq ki, birləşmə faizi orada bir qədər aşağıdır.
Əksər C++ istifadəçiləri kimi biz də dilin və onun kitabxanalarının 100%-dən istifadə etməyi iddia etmirik. Beləliklə, biz Boost-dan praktiki olaraq istifadə etmirik və dilin imkanlarından - dinamik tipli tökmə. Bunu edərkən biz fəal şəkildə istifadə edirik:

  • STL (xüsusilə sətirlər, konteynerlər və alqoritmlər)
  • çoxlu miras, o cümlədən. çoxlu icra mirası
  • şablonları
  • istisnalar
  • ağıllı göstəricilər (doğma tətbiq)

İnterfeyslərin çoxsaylı irsiyyətindən (tamamilə mücərrəd siniflər) istifadə etməklə, aşağıda müzakirə olunacaq komponent modeli mümkün olur.

Components

Modulluğu təmin etmək üçün bütün funksionallıq dinamik kitabxanalar olan komponentlərə bölünür (Windows altında *.dll, *.so - Linux altında). Ümumilikdə yüz yarımdan çox komponent var, onlardan bəzilərinin təsvirini verəcəyik:

backend
Platforma metadatasının "mühərrikini" ehtiva edir

acnt
Proqram tərtibatçılarının mühasibat uçotu yaratmaq üçün istifadə etdiyi obyektlər (hesab planları və mühasibat registrləri)

bsl
Daxili Dil İcra Mühərriki

nuke
Yaddaş ayırıcısının öz tətbiqi

dbeng8
Fayl bazası mühərriki. Sadə SQL prosessorunu ehtiva edən sadə ISAM əsaslı fayl server verilənlər bazası mühərriki

wbase
Windows istifadəçi interfeysini həyata keçirmək üçün əsas sinifləri və funksiyaları ehtiva edir - pəncərə sinifləri, GDI girişi və s.

Bir çox komponentə bölmək bir neçə cəhətdən faydalıdır:

  • Ayrılma daha yaxşı dizaynı, xüsusən də daha yaxşı kod izolyasiyasını təşviq edir
  • Komponentlər dəstindən müxtəlif çatdırılma variantlarını çevik şəkildə yığa bilərsiniz:
    • Məsələn, nazik müştəri quraşdırması wbase-dən ibarət olacaq, lakin heç bir arxa uç yoxdur
    • və wbase serverində, əksinə, olmayacaq
    • hər ikisində əlbəttə ki, nüvə və bsl olacaq

Bu işə salma seçimi üçün tələb olunan bütün komponentlər proqram başlayanda yüklənir. Bu, xüsusilə, aşağıda müzakirə olunacaq SCOM siniflərinin qeydiyyatı üçün lazımdır.

SCOM

Daha aşağı səviyyədə parçalanma üçün SCOM sistemi istifadə olunur - ideologiyada ATL-ə bənzər bir kitabxana. ATL ilə işləməmişlər üçün əsas xüsusiyyətləri və xüsusiyyətləri qısaca sadalayın.
Fərdi üslublu SCOM sinfi üçün:

  • Yalnız adını bilən başqa bir komponentdən bir sinif yaratmağa imkan verən zavod üsullarını təmin edir (tətbiqini açıqlamadan)
  • İstinad sayılan ağıllı göstərici infrastrukturunu təmin edir. SCOM sinifinin ömrünü əl ilə izləmək lazım deyil
  • Obyektin xüsusi interfeysi tətbiq edib-etmədiyini öyrənməyə imkan verir və avtomatik olaraq obyektin göstəricisini interfeysin göstəricisinə göndərir.
  • Get_service metodu ilə həmişə mövcud olan xidmət obyekti yaradın və s.

Məsələn, json.dll komponentində JSON (məsələn, JSONStreamReader) oxumaq üçün sinif müəyyən edə bilərsiniz.
Siniflər, nümunələr digər komponentlərdən yaradıla bilər, SCOM maşınında qeydiyyatdan keçməlisiniz:

SCOM_CLASS_ENTRY(JSONStreamReader)

Bu makro komponent yaddaşa yükləndikdə konstruktoru çağırılacaq xüsusi statik qeydiyyatçı sinfini təsvir edəcək.
Bundan sonra, başqa bir komponentdə onun nümunəsini yarada bilərsiniz:

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

Xidmətləri dəstəkləmək üçün SCOM əlavə, kifayət qədər mürəkkəb infrastruktur təklif edir. Bunun mərkəzində xidmətlər üçün konteyner rolunu oynayan (yəni Xidmət Lokatoru kimi çıxış edən) və həmçinin lokallaşdırıla bilən resurslara bağlanan SCOM prosesi konsepsiyası dayanır. SCOM prosesi OS ipinə bağlıdır. Bunun sayəsində proqram daxilində bu kimi xidmətlər əldə edə bilərsiniz:

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

Bundan əlavə, ipə əlavə edilmiş məntiqi (SCOM) prosesləri dəyişdirməklə, siz informasiya məkanı baxımından praktiki olaraq müstəqil olan və eyni ip daxilində işləyən proqramları əldə edə bilərsiniz. Bizim nazik müştərimiz fayl bazası ilə belə işləyir - bir OS prosesinin içərisində iki SCOM prosesi var, biri müştəriyə, ikincisi isə serverə bağlıdır. Bu yanaşma həm yerli fayl bazasında, həm də "real" müştəri-server versiyasında işləyəcək kodun yazılmasını birləşdirməyə imkan verir. Belə vahidliyin qiyməti yüksəkdir, lakin təcrübə göstərir ki, buna dəyər.

SCOM komponent modeli əsasında 1C: Enterprise proqramının həm biznes məntiqi, həm də interfeys hissəsi həyata keçirilir.

İstifadəçi interfeysi

Yeri gəlmişkən, interfeyslər haqqında. Biz standart Windows nəzarətlərindən istifadə etmirik, bizim idarəetmələrimiz birbaşa Windows API-də həyata keçirilir. Linux versiyası üçün wxWidgets kitabxanası vasitəsilə işləyən təbəqə hazırlanmışdır.
İdarəetmə kitabxanası 1C: Enterprise-ın digər hissələrindən asılı deyil və bizim tərəfimizdən bir neçə digər kiçik daxili yardım proqramlarında istifadə olunur.

1C: Enterprise-in inkişafı illərində idarəetmə vasitələrinin görünüşü dəyişdi, lakin prinsiplərdə ciddi dəyişiklik yalnız bir dəfə, 2009-cu ildə 8.2 versiyasının buraxılması və "idarə olunan formaların" meydana gəlməsi ilə baş verdi. Görünüşün dəyişdirilməsi ilə yanaşı, formaların düzülüşü prinsipi əsaslı şəkildə dəyişdi - elementlərin axın düzümü lehinə elementlərin piksel-piksel yerləşdirilməsi rədd edildi. Bundan əlavə, yeni modeldə idarəetmə birbaşa domen obyektləri ilə deyil, xüsusi DTO-larla işləyir (Məlumat ötürmə obyektləri).
Bu dəyişikliklər JavaScript-də C++ idarəetmə məntiqini təkrarlayan 1C:Enterprise veb-klientini yaratmağa imkan verdi. Biz nazik və veb müştərilər arasında funksional ekvivalentliyi qorumağa çalışırıq. Bu mümkün olmadıqda, məsələn, JavaScript API-də mövcud olan məhdudiyyətlərə görə (məsələn, fayllarla işləmək imkanı çox məhduddur) biz tez-tez C++ dilində yazılmış brauzer genişləndirmələrindən istifadə edərək istənilən funksionallığı həyata keçiririk. Hazırda biz Internet Explorer və Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows və Linux) və Safari (MacOS) dəstəkləyirik.

Bundan əlavə, 1C platformasında mobil proqramların interfeysini yaratmaq üçün idarə olunan formalar texnologiyasından istifadə olunur. Mobil cihazlarda idarəetmə vasitələrinin rəsmiləşdirilməsi əməliyyat sisteminə xas olan texnologiyalardan istifadə etməklə həyata keçirilir, lakin eyni kod "böyük" 1C: Enterprise platformasında olduğu kimi forma düzümü məntiqi və interfeys cavabı üçün istifadə olunur.

Platforma "1C: Müəssisə" - kapotun altında nə var?
Linux OS-də 1C interfeysi

Platforma "1C: Müəssisə" - kapotun altında nə var?
Mobil cihazda 1C interfeysi

Digər platformalarda 1C interfeysi Platforma "1C: Müəssisə" - kapotun altında nə var?
Windows OS-də 1C interfeysi

Platforma "1C: Müəssisə" - kapotun altında nə var?
İnterfeys 1C - veb müştəri

Açıq mənbə

Windows altında C++ tərtibatçıları üçün standart kitabxanalardan istifadə etməsək də (MFC, WinAPI-dən idarələr), biz bütün komponentləri özümüz yazmırıq. Kitabxana artıq qeyd olunub. wxWidjetlərvə biz də istifadə edirik:

  • cURL HTTP və FTP ilə işləmək.
  • OpenSSL kriptoqrafiya ilə işləmək və TLS əlaqələrini qurmaq üçün
  • libxml2 və libxslt XML təhlili üçün
  • libetpan poçt protokolları ilə işləmək (POP3, SMTP, IMAP)
  • mimetik e-poçt mesajlarını təhlil etmək üçün
  • sqlite istifadəçi qeydlərini saxlamaq üçün
  • ICU beynəlmiləlləşmə üçün

Siyahını hələ də davam etdirmək olar.
Bundan əlavə, biz çox dəyişdirilmiş versiyadan istifadə edirik Google Testi и Google Mock vahid testləri hazırlayarkən.
Kitabxanalar SCOM komponentinin təşkili modelinə uyğun olmaq üçün uyğunlaşma tələb edirdi.
1C-nin yayılması platformanı istifadə olunan kitabxanalar üçün əla güc testinə çevirir. Müxtəlif istifadəçilər və skriptlər kodun ən nadir istifadə olunan hissələrində belə səhvləri tez tapırlar. Biz onları evdə düzəldirik və kitabxanaların müəlliflərinə qaytarmağa çalışırıq. Qarşılıqlı əlaqə təcrübəsi çox fərqlidir.
Yaradıcılar cURL и libetpan tez bir çəkmə sorğusuna cavab verin, lakin yamaq, məsələn, in OpenSSL heç vaxt geri qaytara bilmərik.

Nəticə

Məqalədə biz 1C: Enterprise platformasının inkişafının bir neçə əsas aspektinə toxunduq. Məqalənin məhdud həcmində biz yalnız bəzi maraqlı, fikrimizcə, məqamlara toxunduq.
Platformanın müxtəlif mexanizmlərinin ümumi təsvirinə baxmaq olar burada.
Gələcək məqalələrdə hansı mövzular sizi maraqlandıracaq?

1C mobil platforması necə həyata keçirilir?
Veb müştərinin daxili cihazının təsviri?
Və ya bəlkə yeni buraxılışlar, inkişaf və sınaq üçün xüsusiyyət seçimi prosesi ilə maraqlanırsınız?

Şərhlərdə yazın!

Mənbə: www.habr.com

Добавить комментарий