Платформа "1С: Підприємство" - що під капотом?

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

Платформа "1С: Підприємство" - що під капотом?

Чому ми вважаємо, що це цікаво? По-перше, тому що платформа «1С:Підприємство 8» - це велике (більше 10 мільйонів рядків коду) додаток на C++ (клієнт, сервер і т.д.), JavaScript (веб-клієнт), і, з недавніх пір ще і Java. Великі проекти бувають цікаві хоча б через масштаб, адже питання, непомітні в маленькій кодовій базі, в таких проектах постають на повне зростання. По-друге, «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
Об'єкти, які прикладні розробники використовують для побудови бухгалтерського обліку (плани рахунків та регістри бухгалтерії)

bsl
Двигун виконання вбудованої мови

nuke
Власна реалізація аллокатора пам'яті

dbeng8
Двигун файлової бази. Проста файл-серверна машина баз даних, заснована на ISAM, що включає також простий SQL-процесор

wbase
Містить базові класи та функції для реалізації інтерфейсу Windows — віконні класи, доступ до GDI і т.п.

Поділ на безліч компонентів корисний з кількох точок зору:

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

Всі необхідні для цього варіанта запуску компоненти завантажуються при старті програми. Це, зокрема, потрібно для реєстрації SCOM-класів, про які піде нижче.

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 (Об’єкти передачі даних).
Ці зміни дозволили створити веб-клієнт «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, а ще ми використовуємо:

  • cURL для роботи з HTTP та FTP.
  • OpenSSL для роботи з криптографією та встановлення TLS з'єднань
  • libxml2 та libxslt для аналізу XML
  • libetpan для роботи з поштовими протоколами (POP3, SMTP, IMAP)
  • міметик для аналізу повідомлень електронної пошти
  • sqllite для зберігання журналів роботи користувачів
  • СІС для інтернаціоналізації

Список ще можна продовжувати.
Крім того, ми використовуємо сильно модифіковану версію Тест Google и Google Mock розробки юніт-тестів.
Бібліотеки зажадали адаптації для сумісності з SCOM-моделлю організації компонентів.
Поширеність 1С робить платформу відмінною перевіркою на міцність для бібліотек, що використовуються в ній. Різноманітність користувачів і сценаріїв швидко виявляє помилки навіть у рідкісних ділянках коду. Ми виправляємо їх у себе та намагаємося віддавати назад авторам бібліотек. Досвід взаємодії виявляється дуже різним.
Розробники cURL и libetpan швидко відгукуються на pull-request, але патч, наприклад, OpenSSL нам так і не вдалося віддати.

Висновок

У статті торкнулися кількох основних аспектів розробки платформи «1С: Підприємство». В обмеженому обсязі статті ми торкнулися лише деяких цікавих, на наш погляд, аспектів.
Загальний опис різних механізмів платформи можна переглянути тут.
Які теми були б цікаві Вам у наступних статтях?

Як реалізовано мобільну платформу 1С?
Опис внутрішнього пристрою веб-клієнта?
Або, можливо, Вам цікавий процес вибору фіч для нових релізів, розробки та тестування?

Пишіть у коментарях!

Джерело: habr.com

Додати коментар або відгук