Платформа 1С: Прадпрыемства што пад капотам?

Прывітанне, Хабр!
У гэтым артыкуле мы пачнем аповяд аб тым, як уладкованая ўсярэдзіне платформа «1С:Прадпрыемства 8» і якія тэхналогіі выкарыстоўваюцца пры яе распрацоўцы.

Платформа 1С: Прадпрыемства што пад капотам?

Чаму мы лічым, што гэта цікава? Па-першае, таму што платформа «1С:Прадпрыемства 8» – гэта вялікае (больш за 10 мільёнаў радкоў кода) прыкладанне на C++ (кліент, сервер і г.д.), JavaScript (вэб-кліент), і, з нядаўніх часоў яшчэ і ява. Вялікія праекты бываюць цікавыя хаця б у сілу маштабу, бо пытанні, незаўважныя ў маленькай кодавай базе, у такіх праектах устаюць у поўны рост. Па-другое, «1С:Прадпрыемства» - гэта тыражуемы, «скрынкавы» прадукт, а артыкулаў пра такія распрацоўкі на Хабры зусім няшмат. А яшчэ заўсёды цікава даведацца, як там жывуць у іншых камандах і фірмах.

Такім чынам, прыступім. У гэтым артыкуле мы дамо агляд некаторых тэхналогій, якія прымяняюцца ў платформе, абмалюем ландшафт, без глыбокага апускання ў рэалізацыю. Бо для шматлікіх механізмаў падрабязнае апавяданне пацягне на асобны артыкул, а для некаторых — на цэлую кнігу!
Для пачатку варта вызначыцца з базавымі рэчамі - што такое платформа "1С: Прадпрыемства" і з якіх кампанентаў яна складаецца. Адказ на гэтае пытанне не такі просты, бо пад тэрмінам «Платформа» (для сцісласці будзем называць яе менавіта так) разумеюць і сродак распрацоўкі бізнес-прыкладанняў, і асяроддзе выканання, і сродкі адміністравання. Умоўна можна вылучыць наступныя складнікі:

  • кластар сервераў
  • "тонкі" кліент, здольны падлучацца да сервера па http і ўласным бінарным пратаколе
  • кліент для працы ў двухзвенной архітэктуры з БД, размешчанай на цвёрдым дыску або сеткавай тэчцы
  • вэб-кліент
  • сродкі адміністравання сервера прыкладанняў
  • асяроддзе распрацоўкі (вядомая як Канфігуратар)
  • асяроддзе выканання для iOS, Android і Windows Phone (мабільная платформа 1С)

Усе гэтыя часткі, за выключэннем вэб-кліента, напісаны на C++. Акрамя таго, існуе нядаўна анансаваны Канфігуратар новага пакалення, напісаны на Java.

Натыўныя прыкладанні

Для распрацоўкі натыўных прыкладанняў выкарыстоўваецца C++03. Пад Windows у якасці кампілятара выкарыстоўваецца Microsoft Visual C++ 12 (профіль сумяшчальны з Windows XP), а пад Linux і Android – gcc 4.8, для iOS – clang 5.0. Стандартная бібліятэка выкарыстоўваецца адзіная для ўсіх АС і кампілятараў - STLPort. Гэтае рашэнне дазваляе зменшыць верагоднасць памылак, спецыфічных для рэалізацыі STL. Цяпер мы плануем пераход на рэалізацыю STL, якая пастаўляецца з CLang, бо STLPort спыніў сваё развіццё і несумяшчальны з уключаным рэжымам падтрымкі C++11 у gcc.
Кодавая база сервера пры гэтым агульная на 99%, кліента - працэнтаў на 95%. Больш за тое, нават мабільная платформа выкарыстоўвае той жа C++ код, што і "вялікая", хоць там працэнт уніфікацыі некалькі ніжэй.
Як большасць карыстальнікаў С++ мы не прэтэндуем на выкарыстанне 100% магчымасцей мовы і яе бібліятэк. Так, у нас практычна не выкарыстоўваецца Boost, а з магчымасцяў мовы - дынамічнае прывядзенне тыпаў. Пры гэтым мы актыўна ўжываем:

  • STL (у прыватнасці, радкі, кантэйнеры і алгарытмы)
  • множнае ўспадкоўванне, у т.л. множнае ўспадкоўванне рэалізацыі
  • шаблоны
  • выключэння
  • разумныя паказальнікі (уласная рэалізацыя)

За кошт выкарыстання множнага ўспадкоўвання інтэрфейсаў (цалкам абстрактных класаў) становіцца магчымай кампанентная мадэль, гаворка пра якую пойдзе ніжэй.

Кампаненты

Для забеспячэння модульнасці ўвесь функцыянал падзелены на кампаненты, уяўлялыя з сябе дынамічныя бібліятэкі (*.dll пад Windows, *.so - пад Linux). Усяго кампанентаў больш за паўтары сотні, прывядзем апісанні некаторых з іх:

бэкенд
Змяшчае «рухавічок» метададзеных платформы

accnt
Аб'екты, якія прыкладныя распрацоўшчыкі выкарыстоўваюць для пабудовы бухгалтарскага ўліку (планы рахункаў і рэгістры бухгалтэрыі)

бсл
Рухавічок выканання ўбудаванай мовы

ядзерную зброю
Уласная рэалізацыя алакатара памяці

dbeng8
Рухавічок файлавай базы. Простая файл-серверная машына баз дадзеных, заснаваная на ISAM, улучальная таксама просты SQL-працэсар

wbase
Змяшчае базавыя класы і функцыі для рэалізацыі карыстацкага інтэрфейсу Windows - аконныя класы, доступ да GDI і т. п.

Падзел на мноства кампанентаў карысна з некалькіх пунктаў гледжання:

  • Падзел спрыяе лепшаму праектаванню, у прыватнасці лепшай ізаляцыі кода
  • З набору кампанентаў можна гнутка збіраць розныя варыянты пастаўкі:
    • Напрыклад, усталёўка тонкага кліента будзе ўтрымоўваць wbase, але не будзе backend
    • а на серверы wbase, наадварот, не будзе
    • абодва варыянты будуць, вядома, змяшчаць nuke і bsl

Усе неабходныя для дадзенага варыянту запуску кампаненты загружаюцца пры старце праграмы. Гэта, у прыватнасці, трэба для рэгістрацыі SCOM-класаў, размова аб якіх пойдзе ніжэй.

СКОМ

Для дэкампазіцыі на ніжэйшым узроўні выкарыстоўваецца сістэма SCOM - падобная па ідэалогіі з ATL бібліятэка. Для тых, хто з ATL не працаваў, коратка пералічы асноўныя магчымасці і асаблівасці.
Для спецыяльна аформленага класа SCOM:

  • Дае фабрычныя метады, якія дазваляюць стварыць клас з іншай кампаненты ведаючы толькі яго назву (без раскрыцця рэалізацыі)
  • Дае інфраструктуру разумных паказальнікаў з падлікам спасылак. За часам жыцця SCOM-класа не трэба сачыць уручную
  • Дазваляе даведацца рэалізуе ці аб'ект канкрэтны інтэрфейс і аўтаматычна прывесці паказальнік на аб'ект да паказальніка на інтэрфейс
  • Стварыць аб'ект-сэрвіс, які заўсёды даступны праз метад get_service і г.д.

Напрыклад, можна апісаць у кампаненце json.dll клас для чытання JSON (напрыклад, JSONStreamReader).
Класы, асобнікі можна ствараць з іншых кампанентаў трэба зарэгістраваць у SCOM-машыне:

SCOM_CLASS_ENTRY(JSONStreamReader)

Гэты макрас апіша спецыяльны статычны клас-рэгістратар, канструктар якога будзе выкліканы пры загрузцы кампаненты ў памяць.
Пасля гэта можна стварыць яго асобнік у іншым кампаненце:

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

Для падтрымкі сэрвісаў SCOM прапануе дадатковую, дастаткова складаную інфраструктуру. Цэнтральным у ёй з'яўляецца паняцце SCOM-працэсу, які служыць кантэйнерам для запушчаных сэрвісаў (г.зн. выконвае ролю Service Locator), а таксама ўтрымоўвае прывязку да лакалізаваных рэсурсамі. SCOM працэс прывязваецца да патоку АС. Дзякуючы гэтаму ўнутры прыкладання можна вось так атрымліваць сэрвісы:

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

Больш, таго перамыкаючы лагічныя (SCOM) працэсы прывязаныя да струменя, можна атрымаць практычна незалежныя з пункта гледжання інфармацыйнай прасторы прыкладання, якія выконваюцца ў рамках аднаго струменя. Так уладкованы наш тонкі кліент, які працуе з файлавай базай – усярэдзіне аднаго працэсу АС знаходзяцца два SCOM-працэсу, адзін злучаны з кліентам, а другі – з серверам. Такі падыход дазваляе ўніфікаваць напісанні кода, які будзе працаваць як на лакальнай файлавай базе, так і ў "сапраўдным" кліент-серверным варыянце. Кошт за такую ​​аднастайнасць - накладныя выдаткі, але практыка паказвае, што яны таго каштуюць.

На аснове кампанентнай мадэлі SCOM рэалізавана і бізнес-логіка і інтэрфейсная частка 1С: Прадпрыемствы.

карыстацкі інтэрфейс

Дарэчы, аб інтэрфейсах. Мы не выкарыстоўваем стандартныя кантролі Windows, нашы элементы кіравання рэалізаваны напрамую на Windows API. Для Linux-версіі зроблена праслойка, якая працуе праз бібліятэку wxWidgets.
Бібліятэка элементаў кіравання не залежыць ад іншых частак "1С: Прадпрыемствы" і выкарыстоўваецца намі яшчэ ў некалькіх невялікіх унутраных утылітах.

За гады развіцця 1С: Прадпрыемства вонкавы выгляд кантроляў змяняўся, але сур'ёзная змена прынцыпаў адбылося толькі адзін раз, у 2009 году, з вынахадам версіі 8.2 і з'яўленнем «кіраваных формаў». Апроч змены вонкавага выгляду, фундаментальна змяніўся прынцып кампаноўкі формы - адбылася адмова ад попиксельного пазіцыянавання элементаў у карысць flow-кампаноўкі элементаў. Акрамя таго, у новай мадэлі элементы кіравання працуюць не напрамую з даменнымі аб'ектамі, а са спецыяльнымі DTO (Data Transfer Objects).
Гэтыя змены дазволілі стварыць вэб-кліент "1С: Прадпрыемствы", які паўтарае З++ логіку кантроляў на JavaScript. Мы стараемся падтрымліваць функцыянальную эквівалентнасць паміж тонкім і вэб кліентамі. У тым выпадку, калі гэта немагчыма, напрыклад, з-за абмежаванняў даступных з JavaScript API (напрыклад, магчымасці працы з файламі вельмі абмежаваныя), мы часта рэалізуем патрэбную функцыянальнасць пры дапамозе пашырэнняў браўзэраў, напісаных на C++. На дадзены момант мы падтрымліваем Internet Explorer і Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows і Linux) і Safari (MacOS).

Акрамя таго, тэхналогія кіраваных формаў выкарыстоўваецца для стварэння інтэрфейсу мабільных прыкладанняў на платформе 1С. На мабільных прыладах адмалёўка кантроляў рэалізавана з выкарыстаннем "родных" для аперацыйнай сістэмы тэхналогій, але ўжо для логікі кампаноўкі формы і рэакцыі інтэрфейсу выкарыстоўваецца той жа код, што і ў "вялікай" платформе "1С:Прадпрыемства".

Платформа 1С: Прадпрыемства што пад капотам?
Інтэрфейс 1С на АС Linux

Платформа 1С: Прадпрыемства што пад капотам?
Інтэрфейс 1С на мабільным прыладзе

Інтэрфейс 1С на іншых платформах Платформа 1С: Прадпрыемства што пад капотам?
Інтэрфейс 1С на АС Windows

Платформа 1С: Прадпрыемства што пад капотам?
Інтэрфейс 1С – вэб-кліент

Адкрыты зыходны код

Хоць мы і не выкарыстоўваем стандартныя для З++ распрацоўніка бібліятэкі пад Windows (MFC, кантролі з WinAPI), не ўсе кампаненты мы пішам самі. Ужо згадвалася бібліятэка wxWidgets, а яшчэ мы выкарыстоўваем:

  • завіць для працы з HTTP і FTP.
  • OpenSSL для працы з крыптаграфіяй і ўстаноўкі TLS злучэнняў
  • libxml2 і libxslt для разбору XML
  • libetpan для працы з паштовымі пратаколамі (POP3, SMTP, IMAP)
  • міметычны для разбору паведамленняў электроннай пошты
  • sqllite для захоўвання часопісаў працы карыстальнікаў
  • Сыстэмы для інтэрнацыяналізацыі

Спіс яшчэ можна працягваць.
Акрамя таго, мы выкарыстоўваем моцна мадыфікаваную версіі Google Test и Google Mock пры распрацоўцы юніт-тэстаў.
Бібліятэкі запатрабавалі адаптацыі для сумяшчальнасці са SCOM-мадэллю арганізацыі кампанент.
Распаўсюджанасць 1С робіць платформу выдатнай праверкай на трываласць для выкарыстоўваных у ёй бібліятэк. Разнастайнасць карыстальнікаў і сцэнарыяў хутка выяўляе памылкі нават у самых рэдка выкарыстоўваных участках кода. Мы выпраўляем іх у сябе і імкнемся аддаваць зваротна аўтарам бібліятэк. Вопыт узаемадзеяння аказваецца вельмі розны.
Распрацоўшчыкі завіць и libetpan хутка адгукаюцца на pull-request, але патч, напрыклад, у OpenSSL нам так і не ўдалося аддаць.

Заключэнне

У артыкуле мы закранулі некалькі асноўных аспектаў распрацоўкі платформы "1С: Прадпрыемства". У абмежаваным аб'ёме артыкула мы закранулі толькі некаторыя цікавыя, на наш погляд, аспекты.
Агульнае апісанне розных механізмаў платформы можна паглядзець тут.
Якія тэмы былі б цікавыя Вам у наступных артыкулах?

Як рэалізавана мабільная платформа 1С?
Апісанне ўнутранай прылады вэб-кліента?
Ці, можа быць, Вам цікавы працэс выбару фіч для новых рэлізаў, распрацоўкі і тэсціравання?

Пішыце ў каментарах!

Крыніца: habr.com

Дадаць каментар