Platforma "1C: Enterprise" - čo je pod kapotou?

Čau Habr!
V tomto článku začneme príbeh o tom, ako to funguje vo vnútri platforma "1C:Enterprise 8" a aké technológie sa používajú pri jeho vývoji.

Platforma "1C: Enterprise" - čo je pod kapotou?

Prečo si myslíme, že je to zaujímavé? Po prvé, pretože platforma 1C:Enterprise 8 je veľká (viac ako 10 miliónov riadkov kódu) aplikácia v jazyku C++ (klient, server atď.), JavaScript (webový klient) a najnovšie aj Jáva. Veľké projekty môžu byť zaujímavé prinajmenšom svojim rozsahom, pretože problémy, ktoré sú v malej kódovej základni neviditeľné, sa v takýchto projektoch objavujú v plnej sile. Po druhé, „1C:Enterprise“ je replikovateľný, „krabicový“ produkt a na Habré je len veľmi málo článkov o takomto vývoji. Vždy je tiež zaujímavé vedieť, ako sa žije v iných tímoch a spoločnostiach.

Tak poďme na to. V tomto článku poskytneme prehľad niektorých technológií, ktoré sa používajú v platforme, a načrtneme krajinu bez toho, aby sme sa hlboko ponorili do implementácie. Skutočne, pre mnohé mechanizmy by si podrobný príbeh vyžadoval samostatný článok a pre niektoré aj celú knihu!
Na začiatok sa oplatí rozhodnúť o základných veciach – čo je platforma 1C:Enterprise a z akých komponentov pozostáva. Odpoveď na túto otázku nie je taká jednoduchá, pretože pojem „platforma“ (pre stručnosť ju budeme nazývať tak) označuje prostriedok na vývoj podnikových aplikácií, runtime prostredia a nástrojov na správu. Je možné zhruba rozlíšiť tieto komponenty:

  • serverový klaster
  • „tenký“ klient schopný pripojiť sa k serveru cez http a vlastný binárny protokol
  • klient pre prácu v dvojvrstvovej architektúre s databázou umiestnenou na pevnom disku alebo sieťovom priečinku
  • webového klienta
  • nástroje na správu aplikačného servera
  • vývojové prostredie (známe ako konfigurátor)
  • runtime prostredie pre iOS, Android a Windows Phone (mobilná platforma 1C)

Všetky tieto časti, s výnimkou webového klienta, sú napísané v C++. Okrem toho je tu nedávno oznámený Konfigurátor novej generácie, napísaný v jazyku Java.

Natívne aplikácie

C++03 sa používa na vývoj natívnych aplikácií. Pre Windows sa ako kompilátor používa Microsoft Visual C++ 12 (profil kompatibilný s Windows XP) a pre Linux a Android - gcc 4.8, pre iOS - clang 5.0. Použitá štandardná knižnica je rovnaká pre všetky operačné systémy a kompilátory – STLPort. Toto riešenie znižuje pravdepodobnosť chýb špecifických pre implementáciu STL. V súčasnosti plánujeme migráciu na implementáciu STL dodávanú s CLang, pretože STLPort bol ukončený a nie je kompatibilný s režimom povoleným v jazyku C++11 v gcc.
Základ kódu servera je z 99 % bežný, klientsky - 95 %. Navyše aj mobilná platforma používa rovnaký kód C++ ako tá „veľká“, hoci percento zjednotenia je tam o niečo nižšie.
Ako väčšina používateľov C++, ani my netvrdíme, že využívame 100 % možností jazyka a jeho knižníc. Boost teda prakticky nepoužívame a jednou z jazykových funkcií je dynamické pretypovanie. Zároveň aktívne využívame:

  • STL (konkrétne reťazce, kontajnery a algoritmy)
  • viacnásobné dedičstvo, vr. viacnásobné implementačné dedičstvo
  • Šablóny
  • výnimky
  • inteligentné ukazovatele (vlastná implementácia)

Použitím viacnásobného dedenia rozhraní (úplne abstraktné triedy) sa stáva možným komponentový model, o ktorom sa bude diskutovať nižšie.

Komponenty

Pre zabezpečenie modularity je všetka funkcionalita rozdelená do komponentov, ktorými sú dynamické knižnice (*.dll pre Windows, *.so pre Linux). Celkovo existuje viac ako stopäťdesiat komponentov; tu sú popisy niektorých z nich:

backend
Obsahuje nástroj metadát platformy

accnt
Objekty, ktoré vývojári aplikácií používajú na vytváranie účtovných záznamov (účtovné schémy a účtovné registre)

bsl
Vstavaný nástroj na vykonávanie jazyka

Nuke
Vlastná implementácia alokátora pamäte

dbeng8
Databázový stroj súborov. Jednoduchý databázový stroj súborového servera založený na ISAM, ktorý obsahuje aj jednoduchý SQL procesor

wbase
Obsahuje základné triedy a funkcie pre implementáciu používateľského rozhrania Windows – triedy okien, GDI prístup atď.

Rozdelenie do viacerých komponentov je užitočné z niekoľkých hľadísk:

  • Oddelenie podporuje lepší dizajn, najmä lepšiu izoláciu kódu
  • Zo sady komponentov môžete flexibilne zostaviť rôzne možnosti dodávky:
    • Napríklad inštalácia tenkého klienta bude obsahovať wbase, ale nebude mať backend
    • ale na serveri wbase to naopak nebude
    • obe možnosti budú samozrejme obsahovať nuke a bsl

Všetky komponenty potrebné pre túto možnosť spustenia sa načítajú pri spustení programu. Toto je potrebné najmä na registráciu tried SCOM, o ktorých sa bude diskutovať nižšie.

SCOM

Na rozklad na nižšej úrovni sa používa systém SCOM, ideológiou podobná knižnica ako ATL. Pre tých, ktorí s ATL nepracovali, stručne uvádzame hlavné možnosti a funkcie.
Pre špeciálne navrhnutú triedu SCOM:

  • Poskytuje výrobné metódy, ktoré vám umožňujú vytvoriť triedu z iného komponentu, ktorý pozná iba jej názov (bez odhalenia implementácie)
  • Poskytuje infraštruktúru inteligentných ukazovateľov na počítanie referencií. Životnosť triedy SCOM nie je potrebné monitorovať manuálne
  • Umožňuje vám zistiť, či objekt implementuje špecifické rozhranie a automaticky previesť ukazovateľ na objekt na ukazovateľ na rozhranie
  • Vytvorte objekt služby, ktorý je vždy prístupný prostredníctvom metódy get_service atď.

Môžete napríklad opísať triedu na čítanie JSON (napríklad JSONStreamReader) v komponente json.dll.
Triedy a inštancie môžu byť vytvorené z iných komponentov; musia byť zaregistrované v počítači SCOM:

SCOM_CLASS_ENTRY(JSONStreamReader)

Toto makro bude popisovať špeciálnu triedu statického zapisovača, ktorej konštruktor sa zavolá pri načítaní komponentu do pamäte.
Potom môžete vytvoriť jeho inštanciu v inom komponente:

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

Na podporu služieb ponúka SCOM dodatočnú, pomerne komplexnú infraštruktúru. Ústredným prvkom je koncept procesu SCOM, ktorý slúži ako kontajner pre spustenie služieb (t. j. hrá úlohu Service Locator) a obsahuje aj väzbu na lokalizované zdroje. Proces SCOM je viazaný na vlákno OS. Vďaka tomu môžete v rámci aplikácie prijímať služby, ako sú tieto:

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

Navyše prepínaním logických (SCOM) procesov viazaných na vlákno môžete získať aplikácie, ktoré sú prakticky nezávislé z pohľadu informačného priestoru, bežiace v rámci toho istého vlákna. Takto náš tenký klient pracuje s databázou súborov – v rámci jedného procesu operačného systému sú dva procesy SCOM, jeden spojený s klientom a druhý so serverom. Tento prístup nám umožňuje zjednotiť písanie kódu, ktorý bude fungovať tak v lokálnej databáze súborov, ako aj v „skutočnej“ klient-server verzii. Cena za takúto uniformitu je síce réžia, ale prax ukazuje, že to stojí za to.

Na základe modelu komponentov SCOM je implementovaná obchodná logika aj časť rozhrania 1C: Enterprise.

Používateľské rozhranie

Mimochodom, o rozhraniach. Nepoužívame štandardné ovládacie prvky Windows, naše ovládacie prvky sú implementované priamo na Windows API. Pre verziu pre Linux bola vytvorená vrstva, ktorá funguje prostredníctvom knižnice wxWidgets.
Knižnica ovládacích prvkov nezávisí od iných častí 1C:Enterprise a používame ju v niekoľkých ďalších malých interných nástrojoch.

V priebehu rokov vývoja 1C:Enterprise sa vzhľad ovládacích prvkov zmenil, ale k vážnej zmene princípov došlo iba raz, v roku 2009, s vydaním verzie 8.2 a príchodom „spravovaných formulárov“. Okrem zmeny vzhľadu sa zásadne zmenil princíp rozloženia formulára – došlo k odmietnutiu umiestňovania prvkov po pixeloch v prospech flow-layout prvkov. Okrem toho v novom modeli ovládacie prvky nepracujú priamo s objektmi domény, ale so špeciálnymi DTO (Objekty prenosu údajov).
Tieto zmeny umožnili vytvoriť webového klienta 1C:Enterprise, ktorý replikuje logiku C++ ovládacích prvkov JavaScriptu. Snažíme sa zachovať funkčnú ekvivalenciu medzi tenkými a webovými klientmi. V prípadoch, keď to nie je možné, napríklad kvôli obmedzeniam dostupného JavaScript API (napríklad možnosť práce so súbormi je veľmi obmedzená), často implementujeme potrebnú funkcionalitu pomocou rozšírení prehliadača napísaných v C++. V súčasnosti podporujeme Internet Explorer a Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows a Linux) a Safari (MacOS).

Okrem toho sa technológia riadených formulárov používa na vytvorenie rozhrania pre mobilné aplikácie na platforme 1C. Na mobilných zariadeniach sa vykresľovanie ovládacích prvkov implementuje pomocou technológií natívnych pre operačný systém, ale pre logiku rozloženia formulára a odozvu rozhrania sa používa rovnaký kód ako vo „veľkej“ platforme 1C:Enterprise.

Platforma "1C: Enterprise" - čo je pod kapotou?
Rozhranie 1C v operačnom systéme Linux

Platforma "1C: Enterprise" - čo je pod kapotou?
1C rozhranie na mobilnom zariadení

1C rozhranie na iných platformách Platforma "1C: Enterprise" - čo je pod kapotou?
Rozhranie 1C v operačnom systéme Windows

Platforma "1C: Enterprise" - čo je pod kapotou?
Rozhranie 1C - webový klient

open source

Aj keď pod Windowsom nepoužívame štandardné knižnice pre vývojárov C++ (MFC, ovládacie prvky z WinAPI), nepíšeme všetky komponenty sami. Knižnica už bola spomenutá wxWidgetya tiež používame:

  • cURL pre prácu s HTTP a FTP.
  • OpenSSL pre prácu s kryptografiou a nadväzovanie TLS spojení
  • libxml2 a libxslt pre analýzu XML
  • libetpan pre prácu s poštovými protokolmi (POP3, SMTP, IMAP)
  • mimetický analyzovať e-mailové správy
  • sqllite na ukladanie užívateľských denníkov
  • ICU pre internacionalizáciu

Zoznam pokračuje.
Okrem toho používame výrazne upravenú verziu Google Test и Google Mock pri vývoji jednotkových testov.
Knižnice vyžadovali úpravu, aby boli kompatibilné s modelom organizácie komponentov SCOM.
Prevalencia 1C robí z platformy vynikajúci test sily pre knižnice, ktoré sa v nej používajú. Množstvo používateľov a scenárov rýchlo odhalí chyby aj v tých zriedkavo používaných oblastiach kódu. Sami ich opravujeme a snažíme sa ich vrátiť autorom knižnice. Zážitok z interakcie sa ukazuje byť veľmi odlišný.
Vývojári cURL и libetpan rýchlo reagovať na požiadavky na stiahnutie, ale napríklad záplata v OpenSSL Nikdy sa nám to nepodarilo vrátiť.

Záver

V článku sme sa dotkli niekoľkých hlavných aspektov vývoja platformy 1C: Enterprise. V obmedzenom rozsahu článku sme sa dotkli len niektorých zaujímavých, podľa nás, aspektov.
Všeobecný popis rôznych mechanizmov platformy možno nájsť tu.
Aké témy by vás v budúcich článkoch zaujímali?

Ako sa implementuje mobilná platforma 1C?
Popis vnútornej štruktúry webového klienta?
Alebo vás možno zaujíma proces výberu funkcií pre nové vydania, vývoj a testovanie?

Napíšte do komentárov!

Zdroj: hab.com

Pridať komentár