Habari Habr!
Katika makala hii tutaanza hadithi kuhusu jinsi inavyofanya kazi ndani jukwaa "1C:Enterprise 8" na ni teknolojia gani zinazotumika katika maendeleo yake.
Kwa nini tunafikiri hii inavutia? Kwanza, kwa sababu jukwaa la 1C:Enterprise 8 ni programu kubwa (zaidi ya milioni 10 ya mistari ya msimbo) katika C++ (mteja, seva, n.k.), JavaScript (mteja wa wavuti), na, hivi karibuni zaidi, Na. Java. Miradi mikubwa inaweza kuvutia angalau kwa sababu ya kiwango chao, kwa sababu masuala ambayo hayaonekani katika msingi mdogo wa kanuni hutokea kwa nguvu kamili katika miradi hiyo. Pili, "1C:Enterprise" ni bidhaa inayoweza kuigwa, "iliyowekwa kwenye sanduku", na kuna nakala chache sana kuhusu maendeleo kama haya kwenye Habre. Pia inafurahisha kila wakati kujua jinsi maisha yalivyo katika timu na kampuni zingine.
Basi hebu tuanze. Katika makala hii tutatoa muhtasari wa baadhi ya teknolojia zinazotumiwa kwenye jukwaa na kuelezea mazingira, bila kupiga mbizi kwa undani katika utekelezaji. Hakika, kwa taratibu nyingi, hadithi ya kina ingehitaji makala tofauti, na kwa baadhi, kitabu kizima!
Kwa kuanzia, inafaa kuamua kuhusu mambo ya msingi - 1C:Jukwaa la Biashara ni nini na linajumuisha vipengele vipi. Jibu la swali hili si rahisi sana, kwa sababu neno "Jukwaa" (kwa ufupi, tutaliita hivyo) linamaanisha njia ya kuendeleza maombi ya biashara, mazingira ya wakati wa kukimbia, na zana za utawala. Vipengele vifuatavyo vinaweza kutofautishwa takriban:
kundi la seva
mteja "nyembamba" anayeweza kuunganisha kwenye seva kupitia http na itifaki yake ya binary
mteja kwa kufanya kazi katika usanifu wa ngazi mbili na hifadhidata iko kwenye gari ngumu au folda ya mtandao
mteja wa wavuti
zana za usimamizi wa seva ya programu
mazingira ya maendeleo (inayojulikana kama Configurator)
mazingira ya wakati wa kukimbia kwa iOS, Android na Windows Phone (jukwaa la rununu 1C)
Sehemu hizi zote, isipokuwa mteja wa wavuti, zimeandikwa kwa C++. Zaidi ya hayo, kuna iliyotangazwa hivi karibuni Kisanidi cha kizazi kipya, iliyoandikwa kwa Java.
Programu asili
C++03 inatumika kutengeneza programu asilia. Kwa Windows, Microsoft Visual C++ 12 (wasifu unaoendana na Windows XP) hutumiwa kama mkusanyaji, na kwa Linux na Android - gcc 4.8, kwa iOS - clang 5.0. Maktaba ya kawaida inayotumiwa ni sawa kwa mifumo yote ya uendeshaji na wakusanyaji - STLPort. Suluhisho hili linapunguza uwezekano wa makosa mahususi ya utekelezaji wa STL. Kwa sasa tunapanga kuhamia utekelezaji wa STL iliyosafirishwa kwa Clang, kwa kuwa STLPort imekomeshwa na haioani na hali ya kuwezesha ya gcc ya C++11.
Msingi wa nambari ya seva ni 99% ya kawaida, mteja - 95%. Zaidi ya hayo, hata jukwaa la rununu hutumia msimbo sawa wa C++ kama ule "kubwa", ingawa asilimia ya kuunganishwa huko ni ndogo kwa kiasi fulani.
Kama watumiaji wengi wa C++, hatudai kuwa tunatumia 100% ya uwezo wa lugha na maktaba zake. Kwa hivyo, kwa kweli hatutumii Boost, na mojawapo ya vipengele vya lugha ni utumaji wa aina unaobadilika. Wakati huo huo, tunatumia kikamilifu:
STL (haswa kamba, vyombo na algoriti)
urithi nyingi, ikiwa ni pamoja na. urithi wa utekelezaji nyingi
mifumo
isipokuwa
viashiria smart (utekelezaji maalum)
Kwa kutumia urithi mwingi wa miingiliano (madarasa ya kufikirika kabisa), muundo wa sehemu unawezekana, ambao utajadiliwa hapa chini.
Vipengele
Ili kuhakikisha urekebishaji, utendakazi wote umegawanywa katika vipengele, ambavyo ni maktaba zinazobadilika (*.dll kwa Windows, *.so kwa Linux). Kuna zaidi ya vipengele mia moja na hamsini kwa jumla; hapa kuna maelezo ya baadhi yao:
nyuma
Ina injini ya metadata ya jukwaa
accnt
Vitu ambavyo wasanidi programu hutumia kuunda rekodi za uhasibu (chati za akaunti na rejista za uhasibu)
bsl
Injini ya utekelezaji wa lugha iliyopachikwa
nuke
Utekelezaji maalum wa kigawa kumbukumbu
dbeng8
Injini ya hifadhidata ya faili. Injini rahisi ya hifadhidata ya seva ya faili kulingana na ISAM, ambayo pia inajumuisha kichakataji rahisi cha SQL
wbase
Ina madarasa ya msingi na kazi za kutekeleza kiolesura cha mtumiaji wa Windows - madarasa ya dirisha, ufikiaji wa GDI, nk.
Kugawanya katika vipengele vingi ni muhimu kutoka kwa maoni kadhaa:
Utengano hukuza muundo bora, haswa utengaji bora wa msimbo
Kutoka kwa seti ya vifaa unaweza kukusanya chaguzi tofauti za uwasilishaji kwa urahisi:
Kwa mfano, usakinishaji mwembamba wa mteja utakuwa na wbase, lakini hautakuwa na backend
lakini kwenye seva ya wbase, kinyume chake, haitakuwa
chaguzi zote mbili bila shaka zitakuwa na nuke na bsl
Vipengele vyote vinavyohitajika kwa chaguo hili la uzinduzi hupakiwa wakati programu inapoanza. Hii, hasa, ni muhimu kwa kusajili madarasa ya SCOM, ambayo yatajadiliwa hapa chini.
SCOM
Kwa mtengano katika kiwango cha chini, mfumo wa SCOM hutumiwa, maktaba sawa katika itikadi na ATL. Kwa wale ambao hawajafanya kazi na ATL, tunaorodhesha kwa ufupi uwezo na vipengele kuu.
Kwa darasa maalum la SCOM:
Hutoa njia za kiwanda zinazokuruhusu kuunda darasa kutoka kwa sehemu nyingine ukijua jina lake tu (bila kufichua utekelezaji)
Hutoa miundombinu ya kielekezi mahiri cha kuhesabu marejeleo. Muda wa maisha wa darasa la SCOM hauhitaji kufuatiliwa kwa mikono
Inakuruhusu kujua kama kitu kinatumia kiolesura maalum na kubadilisha kiatomati kielekezi hadi kitu hadi kielekezi hadi kiolesura.
Unda kitu cha huduma ambacho kinapatikana kila wakati kupitia get_service mbinu, n.k.
Kwa mfano, unaweza kuelezea darasa la kusoma JSON (kwa mfano, JSONStreamReader) katika kijenzi cha json.dll.
Madarasa na matukio yanaweza kuundwa kutoka kwa vipengele vingine; yanahitaji kusajiliwa katika mashine ya SCOM:
SCOM_CLASS_ENTRY(JSONStreamReader)
Macro hii itaelezea darasa maalum la kinasa sauti, mjenzi ambaye ataitwa wakati sehemu hiyo imefungwa kwenye kumbukumbu.
Baada ya hayo, unaweza kuunda mfano wake katika sehemu nyingine:
Ili kusaidia huduma, SCOM inatoa miundombinu ya ziada, badala tata. Muhimu kwake ni dhana ya mchakato wa SCOM, ambayo hutumika kama chombo cha kuendesha huduma (yaani, ina jukumu la Kipata Huduma), na pia ina mshikamano kwa rasilimali zilizojanibishwa. Mchakato wa SCOM umefungwa kwenye uzi wa OS. Shukrani kwa hili, ndani ya programu unaweza kupokea huduma kama hii:
SCOM_Process* process = core::current_process();
if (process)
return get_service<IMyService>(process);
Zaidi ya hayo, kwa kubadili michakato ya kimantiki (SCOM) iliyofungwa kwenye thread, unaweza kupata programu ambazo zinajitegemea kivitendo kutoka kwa mtazamo wa nafasi ya habari, zinazoendesha ndani ya thread sawa. Hivi ndivyo mteja wetu mwembamba anavyofanya kazi na hifadhidata ya faili - ndani ya mchakato mmoja wa OS kuna michakato miwili ya SCOM, moja inayohusishwa na mteja, na ya pili na seva. Mbinu hii inaturuhusu kuunganisha uandishi wa msimbo ambao utafanya kazi kwenye hifadhidata ya faili za ndani na katika toleo la "halisi" la seva ya mteja. Bei ya usawa kama huo ni ya juu, lakini mazoezi yanaonyesha kuwa inafaa.
Kulingana na muundo wa kipengele cha SCOM, mantiki ya biashara na sehemu ya kiolesura ya 1C: Enterprise inatekelezwa.
Usanidi wa mtumiaji
Kwa njia, kuhusu interfaces. Hatutumii vidhibiti vya kawaida vya Windows; vidhibiti vyetu vinatekelezwa moja kwa moja kwenye API ya Windows. Kwa toleo la Linux, safu imetengenezwa ambayo inafanya kazi kupitia maktaba ya wxWidgets.
Maktaba ya vidhibiti haitegemei sehemu zingine za 1C:Enterprise na hutumiwa na sisi katika huduma zingine kadhaa ndogo za ndani.
Kwa miaka mingi ya maendeleo ya 1C:Enterprise, kuonekana kwa udhibiti kumebadilika, lakini mabadiliko makubwa katika kanuni yalitokea mara moja tu, mwaka wa 2009, na kutolewa kwa toleo la 8.2 na ujio wa "fomu zilizosimamiwa". Mbali na kubadilisha mwonekano, kanuni ya mpangilio wa fomu imebadilika kimsingi - kulikuwa na kukataliwa kwa nafasi ya pixel-na-pixel ya vipengele kwa ajili ya mpangilio wa mtiririko wa vipengele. Kwa kuongeza, katika mtindo mpya, udhibiti haufanyi kazi moja kwa moja na vitu vya kikoa, lakini kwa DTO maalum (Vitu vya Kuhamisha Data).
Mabadiliko haya yalifanya iwezekane kuunda mteja wa wavuti wa 1C:Enterprise ambao unaiga mantiki ya C++ ya vidhibiti vya JavaScript. Tunajaribu kudumisha usawa wa utendaji kati ya wateja nyembamba na wavuti. Katika hali ambapo hii haiwezekani, kwa mfano kutokana na mapungufu ya API ya JavaScript inapatikana (kwa mfano, uwezo wa kufanya kazi na faili ni mdogo sana), mara nyingi tunatekeleza utendaji muhimu kwa kutumia viendelezi vya kivinjari vilivyoandikwa katika C ++. Kwa sasa tunaauni Internet Explorer na Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows na Linux) na Safari (MacOS).
Kwa kuongeza, teknolojia ya fomu zinazosimamiwa hutumiwa kuunda kiolesura cha programu za simu kwenye jukwaa la 1C. Kwenye vifaa vya rununu, utoaji wa vidhibiti hutekelezwa kwa kutumia teknolojia asilia ya mfumo wa uendeshaji, lakini kwa mantiki ya mpangilio wa fomu na majibu ya kiolesura, msimbo sawa unatumika kama katika "jukwaa kubwa" la 1C:Enterprise.
1C interface kwenye Linux OS
1C interface kwenye simu ya mkononi
1C interface kwenye majukwaa mengine 1C interface kwenye Windows OS
Kiolesura cha 1C - mteja wa wavuti
wazi chanzo
Ingawa hatutumii maktaba ya kawaida kwa wasanidi wa C++ chini ya Windows (MFC, vidhibiti kutoka WinAPI), hatuandiki vipengele vyote sisi wenyewe. Maktaba tayari imetajwa WxWijeti, na pia tunatumia:
Orodha inaendelea.
Zaidi ya hayo, tunatumia toleo lililobadilishwa sana Google Test ΠΈ Google Mock wakati wa kuunda vipimo vya kitengo.
Maktaba zilihitaji urekebishaji ili kuendana na muundo wa shirika la sehemu ya SCOM.
Kuenea kwa 1C hufanya jukwaa kuwa jaribio bora la nguvu kwa maktaba zinazotumiwa ndani yake. Watumiaji na hali mbalimbali hufichua kwa haraka hitilafu katika sehemu za msimbo ambazo hazitumiwi sana. Tunazirekebisha sisi wenyewe na kujaribu kuzirejesha kwa waandishi wa maktaba. Uzoefu wa mwingiliano unageuka kuwa tofauti sana.
Waendelezaji cURL ΠΈ libertpan jibu haraka maombi ya kuvuta, lakini kiraka, kwa mfano, ndani OpenSSL Hatukuweza kurudisha.
Hitimisho
Katika makala tuligusa mambo kadhaa kuu ya maendeleo ya 1C: jukwaa la Biashara. Katika upeo mdogo wa makala, tuligusa baadhi tu ya kuvutia, kwa maoni yetu, vipengele.
Maelezo ya jumla ya mifumo mbalimbali ya jukwaa yanaweza kupatikana hapa.
Ni mada gani ambazo zingekuvutia katika makala zijazo?
Je, jukwaa la rununu la 1C linatekelezwa vipi?
Maelezo ya muundo wa ndani wa mteja wa wavuti?
Au labda una nia ya mchakato wa kuchagua vipengele vya matoleo mapya, kuendeleza na kupima?