Platform "1C: Enterprise" - apa yang ada di bawah tudung?

Hai Habr!
Dalam artikel ini kita akan memulakan cerita tentang cara ia berfungsi di dalam platform "1C:Enterprise 8" dan apakah teknologi yang digunakan dalam pembangunannya.

Platform "1C: Enterprise" - apa yang ada di bawah tudung?

Mengapa kami fikir ini menarik? Pertama, kerana platform 1C:Enterprise 8 ialah aplikasi besar (lebih daripada 10 juta baris kod) dalam C++ (pelanggan, pelayan, dll.), JavaScript (pelanggan web), dan, lebih baru-baru ini, Dan Java. Projek besar boleh menjadi menarik sekurang-kurangnya kerana skalanya, kerana isu yang tidak dapat dilihat dalam asas kod kecil timbul secara kuat dalam projek tersebut. Kedua, "1C:Enterprise" ialah produk "berkotak" yang boleh ditiru, dan terdapat sangat sedikit artikel tentang perkembangan sedemikian di HabrΓ©. Ia juga sentiasa menarik untuk mengetahui bagaimana kehidupan dalam pasukan dan syarikat lain.

Jadi mari kita mulakan. Dalam artikel ini kami akan memberikan gambaran keseluruhan tentang beberapa teknologi yang digunakan dalam platform dan menggariskan landskap, tanpa menyelami pelaksanaannya. Sesungguhnya, untuk banyak mekanisme, cerita terperinci memerlukan artikel yang berasingan, dan untuk sesetengahnya, sebuah buku keseluruhan!
Sebagai permulaan, adalah berbaloi untuk membuat keputusan tentang perkara asas - apakah platform 1C:Enterprise dan komponen yang terdiri daripadanya. Jawapan kepada soalan ini tidak begitu mudah, kerana istilah "Platform" (untuk ringkasnya, kami akan memanggilnya seperti itu) merujuk kepada cara untuk membangunkan aplikasi perniagaan, persekitaran masa jalan dan alatan pentadbiran. Komponen berikut boleh dibezakan secara kasar:

  • kluster pelayan
  • Pelanggan "nipis" yang mampu menyambung ke pelayan melalui http dan protokol binarinya sendiri
  • pelanggan untuk bekerja dalam seni bina dua peringkat dengan pangkalan data yang terletak pada cakera keras atau folder rangkaian
  • pelanggan web
  • alat pentadbiran pelayan aplikasi
  • persekitaran pembangunan (dikenali sebagai Configurator)
  • persekitaran masa jalan untuk iOS, Android dan Windows Phone (platform mudah alih 1C)

Semua bahagian ini, kecuali klien web, ditulis dalam C++. Selain itu, terdapat yang diumumkan baru-baru ini Konfigurator generasi baharu, ditulis dalam bahasa Jawa.

Apl asli

C++03 digunakan untuk membangunkan aplikasi asli. Untuk Windows, Microsoft Visual C++ 12 (profil yang serasi dengan Windows XP) digunakan sebagai pengkompil, dan untuk Linux dan Android - gcc 4.8, untuk iOS - clang 5.0. Pustaka standard yang digunakan adalah sama untuk semua sistem pengendalian dan penyusun - STLPort. Penyelesaian ini mengurangkan kemungkinan ralat khusus pelaksanaan STL. Kami sedang merancang untuk berhijrah kepada pelaksanaan STL yang dihantar dengan CLang, kerana STLPort telah dihentikan dan tidak serasi dengan mod didayakan C++11 gcc.
Pangkalan kod pelayan adalah 99% biasa, pelanggan - 95%. Lebih-lebih lagi, walaupun platform mudah alih menggunakan kod C++ yang sama seperti yang "besar", walaupun peratusan penyatuan di sana agak lebih rendah.
Seperti kebanyakan pengguna C++, kami tidak mendakwa menggunakan 100% keupayaan bahasa dan perpustakaannya. Jadi, kami boleh dikatakan tidak menggunakan Boost, dan salah satu ciri bahasa ialah pemutus jenis dinamik. Pada masa yang sama, kami secara aktif menggunakan:

  • STL (khususnya rentetan, bekas dan algoritma)
  • warisan berbilang, termasuk. warisan pelaksanaan berganda
  • Template
  • pengecualian
  • petunjuk pintar (pelaksanaan tersuai)

Dengan menggunakan pelbagai warisan antara muka (kelas abstrak sepenuhnya), model komponen menjadi mungkin, yang akan dibincangkan di bawah.

Komponen

Untuk memastikan modulariti, semua fungsi dibahagikan kepada komponen, iaitu perpustakaan dinamik (*.dll untuk Windows, *.so untuk Linux). Terdapat lebih daripada seratus lima puluh komponen secara keseluruhan; berikut adalah huraian beberapa daripadanya:

backend
Mengandungi enjin metadata platform

accnt
Objek yang digunakan oleh pembangun aplikasi untuk membina rekod perakaunan (carta akaun dan daftar perakaunan)

bsl
Enjin pelaksanaan bahasa terbenam

nuke
Pelaksanaan tersuai pengagih ingatan

dbeng8
Enjin pangkalan data fail. Enjin pangkalan data pelayan fail ringkas berdasarkan ISAM, yang juga termasuk pemproses SQL mudah

wbase
Mengandungi kelas asas dan fungsi untuk melaksanakan antara muka pengguna Windows - kelas tetingkap, akses GDI, dsb.

Membahagikan kepada berbilang komponen berguna dari beberapa sudut pandangan:

  • Pemisahan menggalakkan reka bentuk yang lebih baik, khususnya pengasingan kod yang lebih baik
  • Daripada satu set komponen, anda boleh memasang pilihan penghantaran yang berbeza secara fleksibel:
    • Contohnya, pemasangan thin client akan mengandungi wbase, tetapi tidak akan mempunyai backend
    • tetapi pada pelayan wbase, sebaliknya, ia tidak akan berlaku
    • kedua-dua pilihan sudah tentu akan mengandungi nuke dan bsl

Semua komponen yang diperlukan untuk pilihan pelancaran ini dimuatkan apabila program bermula. Ini, khususnya, adalah perlu untuk mendaftar kelas SCOM, yang akan dibincangkan di bawah.

SCOM

Untuk penguraian pada tahap yang lebih rendah, sistem SCOM digunakan, perpustakaan yang serupa dalam ideologi kepada ATL. Bagi mereka yang belum bekerja dengan ATL, kami menyenaraikan secara ringkas keupayaan dan ciri utama.
Untuk kelas SCOM yang direka khas:

  • Menyediakan kaedah kilang yang membolehkan anda mencipta kelas daripada komponen lain hanya mengetahui namanya (tanpa mendedahkan pelaksanaan)
  • Menyediakan infrastruktur penunjuk pintar mengira rujukan. Seumur hidup kelas SCOM tidak perlu dipantau secara manual
  • Membolehkan anda untuk mengetahui sama ada objek melaksanakan antara muka tertentu dan secara automatik menukar penuding kepada objek kepada penuding kepada antara muka
  • Buat objek perkhidmatan yang sentiasa boleh diakses melalui kaedah get_service, dsb.

Sebagai contoh, anda boleh menerangkan kelas untuk membaca JSON (contohnya, JSONStreamReader) dalam komponen json.dll.
Kelas dan kejadian boleh dibuat daripada komponen lain; mereka perlu didaftarkan dalam mesin SCOM:

SCOM_CLASS_ENTRY(JSONStreamReader)

Makro ini akan menerangkan kelas perakam statik khas, yang pembinanya akan dipanggil apabila komponen dimuatkan ke dalam memori.
Selepas ini, anda boleh mencipta contoh dalam komponen lain:

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

Untuk menyokong perkhidmatan, SCOM menawarkan infrastruktur tambahan yang agak kompleks. Intinya ialah konsep proses SCOM, yang berfungsi sebagai wadah untuk menjalankan perkhidmatan (iaitu, memainkan peranan Pencari Perkhidmatan), dan juga mengandungi pengikatan kepada sumber setempat. Proses SCOM terikat pada benang OS. Terima kasih kepada ini, di dalam aplikasi anda boleh menerima perkhidmatan seperti ini:

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

Selain itu, dengan menukar proses logik (SCOM) yang terikat pada benang, anda boleh mendapatkan aplikasi yang boleh dikatakan bebas dari sudut pandangan ruang maklumat, berjalan dalam rangkaian yang sama. Beginilah cara klien nipis kami berfungsi dengan pangkalan data fail - dalam satu proses OS terdapat dua proses SCOM, satu berkaitan dengan klien dan yang kedua dengan pelayan. Pendekatan ini membolehkan kami menyatukan penulisan kod yang akan berfungsi pada pangkalan data fail tempatan dan dalam versi pelayan pelanggan "sebenar". Harga untuk keseragaman sedemikian adalah overhed, tetapi amalan menunjukkan bahawa ia berbaloi.

Berdasarkan model komponen SCOM, kedua-dua logik perniagaan dan bahagian antara muka 1C: Perusahaan dilaksanakan.

Antaramuka pengguna

Dengan cara ini, mengenai antara muka. Kami tidak menggunakan kawalan Windows standard; kawalan kami dilaksanakan secara langsung pada API Windows. Untuk versi Linux, lapisan telah dibuat yang berfungsi melalui perpustakaan wxWidgets.
Pustaka kawalan tidak bergantung pada bahagian lain 1C:Enterprise dan digunakan oleh kami dalam beberapa utiliti dalaman kecil yang lain.

Selama bertahun-tahun pembangunan 1C:Enterprise, rupa kawalan telah berubah, tetapi perubahan serius dalam prinsip berlaku hanya sekali, pada tahun 2009, dengan keluaran versi 8.2 dan kemunculan "borang terurus". Di samping mengubah rupa, prinsip susun atur bentuk telah berubah secara asasnya - terdapat penolakan kedudukan piksel demi piksel elemen yang memihak kepada susun atur aliran elemen. Di samping itu, dalam model baharu, kawalan tidak berfungsi secara langsung dengan objek domain, tetapi dengan DTO khas (Objek Pemindahan Data).
Perubahan ini memungkinkan untuk mencipta klien web 1C:Enterprise yang mereplikasi logik C++ bagi kawalan JavaScript. Kami cuba mengekalkan kesetaraan fungsi antara pelanggan nipis dan web. Dalam kes di mana ini tidak mungkin, contohnya disebabkan oleh pengehadan API JavaScript yang tersedia (contohnya, keupayaan untuk bekerja dengan fail adalah sangat terhad), kami sering melaksanakan fungsi yang diperlukan menggunakan sambungan penyemak imbas yang ditulis dalam C++. Pada masa ini kami menyokong Internet Explorer dan Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows dan Linux) dan Safari (MacOS).

Selain itu, teknologi borang terurus digunakan untuk mencipta antara muka untuk aplikasi mudah alih pada platform 1C. Pada peranti mudah alih, pemaparan kawalan dilaksanakan menggunakan teknologi asli kepada sistem pengendalian, tetapi untuk logik reka letak bentuk dan tindak balas antara muka, kod yang sama digunakan seperti dalam platform 1C:Enterprise "besar".

Platform "1C: Enterprise" - apa yang ada di bawah tudung?
Antara muka 1C pada OS Linux

Platform "1C: Enterprise" - apa yang ada di bawah tudung?
Antara muka 1C pada peranti mudah alih

Antara muka 1C pada platform lain Platform "1C: Enterprise" - apa yang ada di bawah tudung?
Antara muka 1C pada OS Windows

Platform "1C: Enterprise" - apa yang ada di bawah tudung?
Antara muka 1C - pelanggan web

Sumber terbuka

Walaupun kami tidak menggunakan perpustakaan standard untuk pembangun C++ di bawah Windows (MFC, kawalan daripada WinAPI), kami tidak menulis semua komponen sendiri. Perpustakaan telah pun disebut wxWidgets, dan kami juga menggunakan:

  • Curl untuk bekerja dengan HTTP dan FTP.
  • OpenSSL untuk bekerja dengan kriptografi dan mewujudkan sambungan TLS
  • libxml2 dan libxslt untuk penghuraian XML
  • libetpan untuk bekerja dengan protokol mel (POP3, SMTP, IMAP)
  • meniru untuk menghuraikan mesej e-mel
  • sqllite untuk menyimpan log pengguna
  • ICU untuk pengantarabangsaan

Senarai itu diteruskan.
Selain itu, kami menggunakan versi yang sangat diubah suai Ujian Google ΠΈ Google Mock apabila membangunkan ujian unit.
Perpustakaan memerlukan penyesuaian agar serasi dengan model organisasi komponen SCOM.
Kelaziman 1C menjadikan platform ujian kekuatan yang sangat baik untuk perpustakaan yang digunakan di dalamnya. Pelbagai pengguna dan senario dengan cepat mendedahkan ralat dalam kawasan kod yang paling jarang digunakan. Kami membetulkannya sendiri dan cuba memberikannya kembali kepada pengarang perpustakaan. Pengalaman interaksi ternyata sangat berbeza.
Pemaju Curl ΠΈ libetpan bertindak balas dengan cepat kepada permintaan tarik, tetapi tampalan, sebagai contoh, masuk OpenSSL Kami tidak pernah berjaya mengembalikannya.

Kesimpulan

Dalam artikel itu kami menyentuh beberapa aspek utama pembangunan 1C: platform Perusahaan. Dalam skop artikel yang terhad, kami hanya menyentuh beberapa aspek yang menarik, pada pendapat kami.
Penerangan umum tentang pelbagai mekanisme platform boleh didapati di sini.
Apakah topik yang akan menarik minat anda dalam artikel akan datang?

Bagaimanakah platform mudah alih 1C dilaksanakan?
Penerangan tentang struktur dalaman pelanggan web?
Atau mungkin anda berminat dengan proses memilih ciri untuk keluaran baharu, membangun dan menguji?

Tulis dalam komen!

Sumber: www.habr.com

Tambah komen