Hej, Habr!
I den hÀr artikeln börjar vi berÀtta om hur den Àr strukturerad inuti och vilka teknologier som anvÀnds vid dess utveckling.

Varför anser vi att detta Àr intressant? För det första eftersom plattformen "1C:Enterprise 8" Àr en stor (mer Àn 10 miljoner kodrader) applikation skriven i C++ (klient, server osv.), JavaScript (webbklient), och, nyligen Àven . Stora projekt kan vara intressanta just pÄ grund av sin omfattning, Àven om frÄgor som gÄr obemÀrkt förbi i en liten kodbas blir framtrÀdande i sÄdana projekt. För det andra Àr "1C:Enterprise" en reproducerbar, "boxad" produkt, och det finns inte mÄnga artiklar om sÄdana utvecklingar pÄ Habré. Dessutom Àr det alltid intressant att veta hur det gÄr till i andra team och företag.
SĂ„, lĂ„t oss börja. I den hĂ€r artikeln ger vi en översikt över vissa teknologier som anvĂ€nds pĂ„ plattformen, vi skisserar landskapet utan att gĂ„ djupt in i implementationen. MĂ„nga mekanismer skulle krĂ€va en detaljerad berĂ€ttelse som skulle fylla en egen artikel, och för vissa â en hel bok!
För att börja mĂ„ste vi klargöra grundlĂ€ggande saker â vad Ă€r plattformen "1C:Enterprise" och av vilka komponenter bestĂ„r den? Svaret pĂ„ denna frĂ„ga Ă€r inte sĂ„ enkelt, eftersom termen "Plattform" (för kort kommer vi att kalla den sĂ„) omfattar bĂ„de verktyget för att utveckla affĂ€rsapplikationer, runtime-miljön, och administrationsverktygen. Man kan grovt dela upp följande komponenter:
- kluster av servrar
- "tunn" klient som kan ansluta till servern via http och eget binÀrt protokoll
- klient för arbete i en tvÄledsarkitektur med en databas, placerad pÄ hÄrddisken eller i en nÀtverksmapp
- webbklient
- administrationsverktyg för applikationsservern
- utvecklingsmiljö (kÀnd som Konfigurator)
- körmiljö för iOS, Android och Windows Phone (mobil plattform 1C)
Alla dessa delar, förutom webbklienten, Àr skrivna i C++. Dessutom finns det en nyligen tillkÀnnagiven , skriven i Java.
Inbyggda applikationer
För utvecklingen av inhemska applikationer anvÀnds C++03. PÄ Windows anvÀnds Microsoft Visual C++ 12 som kompilator (profil som Àr kompatibel med Windows XP), medan gcc 4.8 anvÀnds för Linux och Android, och clang 5.0 anvÀnds för iOS. Den standardbibliotek som anvÀnds Àr gemensamt för alla OS och kompilatorer - STLPort. Detta beslut minskar sannolikheten för fel som Àr specifika för STL-implementeringen. För nÀrvarande planerar vi att övergÄ till den STL-implementation som levereras med CLang, eftersom STLPort har upphört att utvecklas och Àr inkompatibel med det aktiverade C++11-stödet i gcc.
Serverns kodbas Ă€r gemensam till 99 %, medan klienten Ă€r gemensam till cirka 95 %. Dessutom anvĂ€nder Ă€ven mobilplattformen samma C++-kod som âden storaâ, Ă€ven om graden av enhetlighet Ă€r nĂ„got lĂ€gre.
Precis som de flesta C++-anvÀndare gör vi inte ansprÄk pÄ att anvÀnda 100 % av sprÄkets och dess bibliotekens möjligheter. Vi anvÀnder till exempel praktiskt taget inte Boost, och av sprÄkets möjligheter anvÀnder vi dynamisk typkonvertering. Samtidigt tillÀmpar vi aktivt:
- STL (i synnerhet strÀngar, behÄllare och algoritmer)
- flertÀrning, inklusive flertÀrning av implementeringar
- mallar
- hot swap av kod
- kloka pekare (egen implementation)
Genom att anvÀnda flertÀrning av grÀnssnitt (helt abstrakta klasser) blir det möjligt med en komponentmodell, som vi kommer att diskutera nedan.
Komponenter
För att sÀkerstÀlla modularitet Àr all funktionalitet uppdelad i komponenter, som representerar dynamiska bibliotek (*.dll för Windows, *.so - för Linux). Det finns över ett och ett halvt hundra komponenter, och vi ger en beskrivning av nÄgra av dem:
backend
InnehÄller plattformens metadata "motor".
accnt
Objekt som applikationsutvecklare anvÀnder för att bygga bokföring (kontoplaner och redovisningsregister)
bsl
Motor för exekvering av det inbyggda sprÄket.
nuke
Egen implementation av minnesallokator.
dbeng8
Filbaserad databasmotor. En enkel filserverdatabas, baserad pÄ ISAM, som ocksÄ inkluderar en enkel SQL-processor.
wbase
InnehĂ„ller grundklasser och funktioner för att implementera anvĂ€ndargrĂ€nssnittet i Windows â fönsterklasser, Ă„tkomst till GDI, osv.
Uppdelningen i flera komponenter Àr fördelaktig ur flera synvinklar:
- Uppdelningen frÀmjar bÀttre design, sÀrskilt bÀttre kodisolering.
- FrÄn uppsÀttningen av komponenter kan man flexibelt sammanstÀlla olika leveransalternativ:
- Till exempel kommer installationen av en tunn klient att innehÄlla wbase, men inte backend.
- Och pÄ servern kommer wbase Ä sin sida inte att finnas.
- BÄda alternativen kommer sjÀlvklart att innehÄlla nuke och bsl.
Alla komponenter som behövs för detta startalternativ laddas vid programstart. Detta Àr sÀrskilt viktigt för registrering av SCOM-klasser, som vi kommer att diskutera nedan.
SCOM
För dekomponering pĂ„ en lĂ€gre nivĂ„ anvĂ€nds SCOM-systemet â liknande i ideologi med ATL-biblioteket. För dem som inte har arbetat med ATL, hĂ€r Ă€r en kort sammanstĂ€llning av de viktigaste möjligheterna och funktionerna.
För en sÀrskilt utformad SCOM-klass:
- Ger fabriksmetoder som gör att man kan skapa en klass frÄn en annan komponent, med endast namnet kÀnt (utan avslöjande av implementationen).
- Ger infrastruktur för smarta pekare med referensrÀkning. Man behöver inte övervaka livslÀngden av SCOM-klassen manuellt.
- Möjliggör att samma objekt om det implementerar ett visst grÀnssnitt och automatiskt konverterar pekaren till objektet till en pekare pÄ grÀnssnittet.
- Skapa ett tjÀnsteobjekt som alltid Àr tillgÀngligt via metoden get_service osv.
Till exempel kan man i komponenten json.dll beskriva en klass för att lÀsa JSON (t.ex. JSONStreamReader).
Klasser, instanser kan skapas frÄn andra komponenter mÄste registreras i SCOM-maskinen:
SCOM_CLASS_ENTRY(JSONStreamReader)
Denna makro beskriver en sÀrskild statisk klassregistrator vars konstruktör kommer att anropas vid inlÀsning av komponenten i minnet.
Efter det kan man skapa dess instans i en annan komponent:
IJSONStreamReaderPtr jsonReader = create_instance(SCOM_CLSIDOF(JSONStreamReader));
För att stödja tjÀnster erbjuder SCOM en ytterligare, ganska komplex infrastruktur. Centralt i den Àr begreppet SCOM-process, som fungerar som en behÄllare för aktiva tjÀnster (dvs. fungerar som en Service Locator) samt innehÄller bindning till lokaliserade resurser. SCOM-processen binds till OS-trÄden. Tack vare detta kan man sÄ hÀr fÄ tjÀnster inuti applikationen:
SCOM_Process* process = core::current_process();
if (process)
return get_service(process);
Dessutom, genom att vĂ€xla logiska (SCOM) processer kopplade till flödet kan man fĂ„ nĂ€stan oberoende applikationer, sett ur informationsutrymmets perspektiv, som körs inom ett och samma flöde. SĂ„ hĂ€r Ă€r vĂ„r tunna klient utformad, som arbetar med en filbas â inom en OS-process finns det tvĂ„ SCOM-processer, en kopplad till klienten och den andra till servern. Denna metod möjliggör en enhetlig kodning, som fungerar bĂ„de pĂ„ den lokala filbasen och i den "Ă€kta" klient-server-versionen. Kostnaden för sĂ„dan enhetlighet Ă€r overhead, men praktiken visar att det Ă€r vĂ€rt det.
Baserat pÄ komponentmodellen för SCOM har bÄde affÀrslogik och grÀnssnittets del av 1C: Företaget implementerats.
AnvÀndargrÀnssnitt
Förresten, angÄende grÀnssnitt. Vi anvÀnder inte standardkontrollerna frÄn Windows; vÄra kontroller Àr direkt implementerade via Windows API. För Linux-versionen anvÀnds ett lager som fungerar genom biblioteket wxWidgets.
Biblioteket med kontroller Àr oberoende av andra delar av "1C: Företaget" och anvÀnds ocksÄ i flera andra interna verktyg.
Under Ă„ren har utseendet pĂ„ kontrollerna i 1C: Företaget förĂ€ndrats, men en signifikant förĂ€ndring i principerna har intrĂ€ffat endast en gĂ„ng, Ă„r 2009, med lanseringen av version 8.2 och introduktionen av "styrda formulĂ€r". Förutom förĂ€ndringen av utseendet har principen för formkomposition grundligt förĂ€ndrats â man har övergivit pixelpositionering till förmĂ„n för flödeskomposition av elementen. Dessutom, i den nya modellen arbetar kontrollerna inte direkt med domĂ€nobjekten, utan med speciella DTO ().
Dessa förÀndringar har gjort det möjligt att skapa webbklienten för "1C: Företaget", som Äterspeglar C++-logiken för kontroller i JavaScript. Vi försöker upprÀtthÄlla funktionell likvÀrdighet mellan den tunna och webbklienten. NÀr detta inte Àr möjligt, till exempel pÄ grund av begrÀnsningar i det tillgÀngliga JavaScript API (till exempel Àr möjligheterna att arbeta med filer mycket begrÀnsade), implementerar vi ofta den nödvÀndiga funktionaliteten genom webblÀsartillÀgg skrivna i C++. För nÀrvarande stödjer vi Internet Explorer och Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows och Linux) och Safari (MacOS).
Dessutom anvÀnds teknologin för hanterade formulÀr för att skapa mobilapplikationsgrÀnssnitt pÄ 1C-plattformen. PÄ mobila enheter renderas kontroller med hjÀlp av 'inhemska' teknologier för operativsystemet, men samma kod anvÀnds för logiken för formulÀrlayout och grÀnssnittets reaktioner, som i den 'stora' plattformen '1C:Enterprise'.

1C-grÀnssnitt pÄ Linux

1C-grÀnssnitt pÄ en mobil enhet
1C-grĂ€nssnitt pĂ„ andra plattformar 
1C-grÀnssnitt pÄ Windows

1C - webbklient
Ăppen kĂ€llkod
Ăven om vi inte anvĂ€nder standardbibliotek som Ă€r vanliga för C++-utvecklare pĂ„ Windows (MFC, kontroller frĂ„n WinAPI), skriver vi inte allt sjĂ€lva. Biblioteket som redan nĂ€mnts Ă€r , och vi anvĂ€nder ocksĂ„:
- för att arbeta med HTTP och FTP.
- för att arbeta med kryptografi och upprÀtta TLS-anslutningar
- för att bearbeta XML
- för att arbeta med e-postprotokoll (POP3, SMTP, IMAP)
- för att bearbeta e-postmeddelanden
- för att lagra anvÀndarens aktivitetsloggar
- för internationalisering
Listan skulle kunna fortsÀtta.
Dessutom anvÀnder vi en kraftigt modifierad version av och nÀr vi utvecklar enhetstester.
Biblioteken krÀvde anpassning för att vara kompatibla med SCOM-modellen för komponentorganisation.
Spridningen av 1C gör plattformen till ett utmÀrkt test för hÄllbarheten hos de bibliotek som anvÀnds. MÄngfalden av anvÀndare och scenarier avslöjar snabbt fel Àven i de mest sÀllan anvÀnda delarna av koden. Vi ÄtgÀrdar dem hos oss och försöker ge tillbaka till bibliotekens skapare. Erfarenheten av samarbetet varierar mycket.
Utvecklare och snabbt svarar pÄ pull-request, men patchen, till exempel, i kunde vi aldrig ge tillbaka.
Slutsats
I artikeln berörde vi nĂ„gra grundlĂ€ggande aspekter av utvecklingen av plattformen â1C: Enterpriseâ. I artikelns begrĂ€nsade omfattning har vi endast berört nĂ„gra intressanta aspekter, enligt vĂ„r mening.
En allmÀn beskrivning av olika mekanismer i plattformen kan ses .
Vilka Àmnen skulle intressera dig i kommande artiklar?
Hur Àr den mobila plattformen för 1C implementerad?
Beskrivning av webbklientens interna struktur?
Eller kanske Àr du intresserad av processen för att vÀlja funktioner för nya versioner, utveckling och testning?
Skriv i kommentarerna!
KĂ€lla: habr.com
