Piattaforma "1C: Enterprise" - ciò chì hè sottu u cappucciu?

Ehi Habr!
In questu articulu avemu da principià a storia di cumu si travaglia in l'internu piattaforma "1C: Enterprise 8" è chì tecnulugia sò aduprate in u so sviluppu.

Piattaforma "1C: Enterprise" - ciò chì hè sottu u cappucciu?

Perchè pensemu chì questu hè interessante? Prima, perchè a piattaforma 1C:Enterprise 8 hè una grande applicazione (più di 10 milioni di linee di codice) in C++ (cliente, servitore, etc.), JavaScript (cliente web), è, più recentemente, E Java. I grandi prughjetti ponu esse interessanti, almenu per via di a so scala, perchè e prublemi chì sò invisibili in una basa di codice chjuca sorgenu in piena forza in tali prughjetti. Siconda, "1C: Enterprise" hè un pruduttu replicable, "boxed", è ci sò assai pochi articuli nantu à tali sviluppi nantu à Habré. Hè ancu sempre interessante per sapè cumu a vita hè in altre squadre è cumpagnie.

Allora cuminciamu. In questu articulu, daremu una panoramica di alcune di e tecnulugii chì sò aduprate in a piattaforma è delineamu u paisaghju, senza immersione in profondità in l'implementazione. Infatti, per parechji meccanismi, una storia detallata necessitava un articulu separatu, è per certi, un libru sanu !
Per principià, vale a pena decide nantu à e cose basi - ciò chì a piattaforma 1C:Enterprise hè è di quali cumpunenti hè custituitu. A risposta à sta quistione ùn hè micca cusì simplice, perchè u terminu "Piattaforma" (per brevità, a chjameremu cusì) si riferisce à un mezzu per u sviluppu di l'applicazioni cummerciale, un ambiente di runtime è e strumenti di amministrazione. I seguenti cumpunenti ponu esse distinti apprussimatamente:

  • cluster di servitori
  • Client "thin" capace di cunnette à u servitore via http è u so propiu protocolu binariu
  • cliente per travaglià in una architettura di dui livelli cù una basa di dati situata in un discu duru o cartulare di rete
  • cliente web
  • Strumenti di amministrazione di u servitore di applicazioni
  • ambiente di sviluppu (cunnisciutu cum'è Configuratore)
  • ambiente di runtime per iOS, Android è Windows Phone (piattaforma mobile 1C)

Tutte queste parti, cù l'eccezzioni di u cliente web, sò scritte in C++. Inoltre, ci hè l'annunziata recentemente Configuratore di nova generazione, scrittu in Java.

App nativu

C ++ 03 hè adupratu per sviluppà applicazioni native. Per Windows, Microsoft Visual C++ 12 (un prufilu cumpatibile cù Windows XP) hè utilizatu cum'è compilatore, è per Linux è Android - gcc 4.8, per iOS - clang 5.0. A libreria standard utilizata hè a stessa per tutti i sistemi operativi è compilatori - STLPort. Questa suluzione riduce a probabilità di errori specifichi di implementazione STL. Avemu attualmente pianificatu di migrà à l'implementazione STL spedita cù CLang, postu chì STLPort hè stata interrotta è hè incompatibile cù u modu attivatu C++ 11 di gcc.
A basa di codice di u servitore hè 99% cumuni, u cliente - 95%. Inoltre, ancu a piattaforma mobile usa u listessu codice C++ cum'è u "grande", ancu s'è u percentualità di unificazione ci hè un pocu più bassu.
Cum'è a maiò parte di l'utilizatori di C++, ùn dicemu micca di utilizà 100% di e capacità di a lingua è e so librerie. Dunque, praticamente ùn avemu micca aduprà Boost, è una di e caratteristiche di a lingua hè un casting di tipu dinamicu. À u listessu tempu, usemu attivamente:

  • STL (in particulare strings, cuntenituri è algoritmi)
  • eredità multipla, incl. eredità di implementazione multipla
  • modelli
  • eccezzioni
  • puntatori intelligenti (implementazione persunalizata)

Utilizendu l'eredi multipla di interfacce (classi cumpletamente astratti), un mudellu di cumpunenti diventa pussibule, chì serà discututu quì sottu.

Cumpunenti

Per assicurà a modularità, tutte e funziunalità sò spartuti in cumpunenti, chì sò biblioteche dinamiche (*.dll per Windows, *.so per Linux). Ci sò più di centu cinquanta cumpunenti in totale; eccu descrizzione di alcuni di elli:

backend
Contene u mutore di metadati di a piattaforma

accnt
Oggetti chì i sviluppatori di l'applicazioni utilizanu per custruisce i registri di cuntabilità (schemi di cuntatti è registri di cuntabilità)

BSL
Mutore di esecuzione di lingua integrata

nuke
Implementazione persunalizata di l'allocatore di memoria

dbeng8
Mutore di basa di dati di schedari. Un mutore di basa di dati di servitore di file simplice basatu annantu à ISAM, chì include ancu un semplice processore SQL

wbase
Contene e classi basi è e funzioni per implementà l'interfaccia d'utilizatore di Windows - classi di finestra, accessu GDI, etc.

A divisione in parechje cumpunenti hè utile da parechji punti di vista:

  • A separazione prumove un megliu disignu, in particulare un megliu isolamentu di codice
  • Da un inseme di cumpunenti pudete assemble in modu flessibile diverse opzioni di consegna:
    • Per esempiu, una stallazione di u cliente thin cuntene wbase, ma ùn hà micca backend
    • ma nantu à u servitore wbase, à u cuntrariu, ùn serà micca
    • tramindui l'opzioni di sicuru cuntenenu nuke è bsl

Tutti i cumpunenti necessarii per questa opzione di lanciamentu sò caricati quandu u prugramma principia. Questu, in particulare, hè necessariu per registrà e classi SCOM, chì seranu discututi quì sottu.

SCOM

Per a descomposizione à un livellu più bassu, hè utilizatu u sistema SCOM, una biblioteca simile in ideologia à ATL. Per quelli chì ùn anu micca travagliatu cù ATL, listemu brevemente e capacità è e caratteristiche principali.
Per una classe SCOM apposta:

  • Fornisce metudi di fabbrica chì permettenu di creà una classa da un altru cumpunente sapendu solu u so nome (senza revelà l'implementazione)
  • Fornisce una infrastruttura di puntatore intelligente chì conta i riferimenti. A vita di a classe SCOM ùn deve esse monitorata manualmente
  • Permette di sapè se un ughjettu implementa una interfaccia specifica è cunvertisce automaticamente un punteru à l'ughjettu in un punteru à l'interfaccia.
  • Crea un ughjettu di serviziu chì hè sempre accessibile attraversu u metudu get_service, etc.

Per esempiu, pudete discrive una classa per leghje JSON (per esempiu, JSONStreamReader) in u cumpunente json.dll.
Classi è istanze ponu esse creati da altri cumpunenti; anu da esse registrati in a macchina SCOM:

SCOM_CLASS_ENTRY(JSONStreamReader)

Questa macro descriverà una classa speciale di registratore staticu, u custruttore di quale serà chjamatu quandu u cumpunente hè caricatu in memoria.
Dopu questu, pudete creà una istanza di questu in un altru cumpunente:

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

Per sustene i servizii, SCOM offre una infrastruttura supplementaria, piuttostu cumplessa. U centru di questu hè u cuncettu di un prucessu SCOM, chì serve cum'è un cuntainer per i servizii di esecuzione (vale à dì, ghjucà u rolu di Service Locator), è cuntene ancu un ligame à risorse localizzate. U prucessu SCOM hè ligatu à u filu OS. Grazie à questu, in l'applicazione pudete riceve servizii cum'è questu:

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

Inoltre, cambiendu i prucessi lògichi (SCOM) ligati à un filu, pudete uttene applicazioni chì sò praticamenti indipindenti da u puntu di vista di u spaziu di l'infurmazioni, chì currenu in u stessu filu. Hè cusì chì u nostru cliente sottile travaglia cù una basa di dati di schedari - in un prucessu OS ci sò dui prucessi SCOM, unu assuciatu cù u cliente, è u sicondu cù u servitore. Stu approcciu ci permette di unificà a scrittura di codice chì travaglia sia nantu à a basa di dati di u schedariu locale è in a versione "veru" di u cliente-servitore. U prezzu per una tale uniformità hè sopra, ma a pratica mostra chì vale a pena.

Basatu nantu à u mudellu di cumpunenti SCOM, sia a logica cummerciale è a parte di l'interfaccia di 1C: Enterprise sò implementati.

Interfaccia d'utilizatore

A propositu di l'interfaccia. Ùn usemu micca cuntrolli standard di Windows; i nostri cuntrolli sò implementati direttamente nantu à l'API di Windows. Per a versione Linux, hè stata fatta una capa chì travaglia per a biblioteca wxWidgets.
A biblioteca di cuntrolli ùn dipende micca da altre parti di 1C: Enterprise è hè aduprata da noi in parechje altre utilità interne.

Nantu à l'anni di sviluppu di 1C: Enterprise, l'apparenza di cuntrolli hà cambiatu, ma un cambiamentu seriu in i principii hè accadutu solu una volta, in 2009, cù a liberazione di a versione 8.2 è l'avventu di "formi gestiti". In più di cambià l'apparenza, u principiu di u layout di forma hà cambiatu fundamentalmente - ci hè statu un rifiutu di u posizionamentu pixel per pixel di elementi in favore di u flussu di layout di elementi. Inoltre, in u novu mudellu, i cuntrolli ùn funzionanu micca direttamente cù l'uggetti di duminiu, ma cù DTO speciali (Oggetti di trasferimentu di dati).
Questi cambiamenti permettenu di creà un cliente web 1C: Enterprise chì replica a logica C++ di i cuntrolli JavaScript. Pruvemu di mantene l'equivalenza funziunale trà i clienti thin è web. In i casi induve questu ùn hè micca pussibule, per esempiu per via di limitazioni di l'API JavaScript dispunibule (per esempiu, a capacità di travaglià cù i schedari hè assai limitata), spessu implementemu a funziunalità necessaria cù l'estensioni di u navigatore scritte in C++. Attualmente supportemu Internet Explorer è Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows è Linux) è Safari (MacOS).

Inoltre, a tecnulugia di forme amministrate hè aduprata per creà una interfaccia per l'applicazioni mobili nantu à a piattaforma 1C. Nant'à i dispositi mobili, a prestazione di cuntrolli hè implementata cù tecnulugie native di u sistema operatore, ma per a logica di layout di forma è a risposta di l'interfaccia, u listessu codice hè utilizatu cum'è in a piattaforma "grande" 1C: Enterprise.

Piattaforma "1C: Enterprise" - ciò chì hè sottu u cappucciu?
Interfaccia 1C su Linux OS

Piattaforma "1C: Enterprise" - ciò chì hè sottu u cappucciu?
Interfaccia 1C nantu à un dispositivu mobile

Interfaccia 1C nantu à altre piattaforme Piattaforma "1C: Enterprise" - ciò chì hè sottu u cappucciu?
1C interfaccia nantu à u sistema operativu Windows

Piattaforma "1C: Enterprise" - ciò chì hè sottu u cappucciu?
Interfaccia 1C - cliente web

Open surghjenti

Ancu s'ellu ùn usemu micca biblioteche standard per i sviluppatori C++ sottu Windows (MFC, cuntrolli da WinAPI), ùn scrivemu micca tutti i cumpunenti. A biblioteca hè digià mintuvata wxWidgets, è avemu ancu aduprà:

  • CURL per travaglià cù HTTP è FTP.
  • OpenSSL per travaglià cù a criptografia è stabilisce cunnessione TLS
  • libxml2 è libxslt per l'analisi XML
  • libetpan per travaglià cù protokolli di mail (POP3, SMTP, IMAP)
  • mimeticu per analizà i missaghji email
  • sqllite per almacenà i logs di l'utilizatori
  • ICU per l'internazionalizazione

A lista cuntinueghja.
Inoltre, usemu una versione altamente mudificata Test di Google и Google Mock quandu si sviluppanu teste unità.
E biblioteche anu bisognu di adattazione per esse cumpatibili cù u mudellu d'urganizazione di cumpunenti SCOM.
A prevalenza di 1C face a piattaforma una prova eccellente di forza per e biblioteche usate in questu. Una varietà di utilizatori è scenarii rivela rapidamente errori ancu in i spazii di codice più raramenti usati. I curreghjemu noi stessi è pruvemu di rinvià à l'autori di a biblioteca. L'esperienza di l'interazzione hè assai diversa.
Sviluppori CURL и libetpan risponde prestu à pull-requests, ma u patch, per esempiu, in OpenSSL Ùn avemu mai riesciutu à dà torna.

cunchiusioni

In l'articulu avemu toccu parechji aspetti principali di u sviluppu di a piattaforma 1C: Enterprise. In u scopu limitatu di l'articulu, avemu toccu solu qualchi aspetti interessanti, in u nostru parè.
Una descrizzione generale di i varii meccanismi di a piattaforma pò esse truvata ccà.
Chì temi seranu d'interessu per voi in articuli futuri?

Cumu hè implementata a piattaforma mobile 1C?
Descrizzione di a struttura interna di u cliente web?
O forse site interessatu à u prucessu di selezziunà e funzioni per novi versioni, sviluppu è teste?

Scrivite in i cumenti!

Source: www.habr.com

Add a comment