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

Hei Habr!
Pada artikel ini kita akan memulai cerita tentang cara kerjanya di dalam platform "1C:Perusahaan 8" dan teknologi apa yang digunakan dalam pengembangannya.

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

Mengapa menurut kami ini menarik? Pertama, karena platform 1C:Enterprise 8 adalah aplikasi besar (lebih dari 10 juta baris kode) dalam C++ (klien, server, dll.), JavaScript (klien web), dan, yang terbaru, Dan Jawa. Proyek besar bisa menarik setidaknya karena skalanya, karena masalah yang tidak terlihat dalam basis kode kecil muncul dengan kekuatan penuh dalam proyek tersebut. Kedua, “1C:Enterprise” adalah produk “kotak” yang dapat direplikasi, dan hanya ada sedikit artikel tentang perkembangan semacam itu di Habré. Selalu menarik juga untuk mengetahui bagaimana kehidupan di tim dan perusahaan lain.

Jadi mari kita mulai. Pada artikel ini kami akan memberikan gambaran umum tentang beberapa teknologi yang digunakan dalam platform dan menguraikan lanskapnya, tanpa mendalami implementasinya. Memang, untuk banyak mekanisme, cerita yang mendetail memerlukan artikel terpisah, dan untuk beberapa mekanisme, sebuah buku utuh!
Untuk memulainya, ada baiknya memutuskan hal-hal mendasar - apa itu platform 1C:Enterprise dan komponen apa saja yang ada di dalamnya. Jawaban atas pertanyaan ini tidak sesederhana itu, karena istilah “Platform” (untuk singkatnya, kami akan menyebutnya demikian) mengacu pada sarana untuk mengembangkan aplikasi bisnis, lingkungan runtime, dan alat administrasi. Komponen-komponen berikut secara kasar dapat dibedakan:

  • cluster server
  • Klien "tipis" yang mampu terhubung ke server melalui http dan protokol binernya sendiri
  • klien untuk bekerja dalam arsitektur dua tingkat dengan database yang terletak di hard drive atau folder jaringan
  • klien web
  • alat administrasi server aplikasi
  • lingkungan pengembangan (dikenal sebagai Configurator)
  • lingkungan runtime untuk iOS, Android dan Windows Phone (platform seluler 1C)

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

Aplikasi asli

C++03 digunakan untuk mengembangkan aplikasi asli. Untuk Windows, Microsoft Visual C++ 12 (profil yang kompatibel dengan Windows XP) digunakan sebagai kompiler, dan untuk Linux dan Android - gcc 4.8, untuk iOS - dentang 5.0. Pustaka standar yang digunakan sama untuk semua sistem operasi dan kompiler - STLPort. Solusi ini mengurangi kemungkinan kesalahan spesifik implementasi STL. Saat ini kami berencana untuk bermigrasi ke implementasi STL yang dikirimkan bersama CLang, karena STLPort telah dihentikan dan tidak kompatibel dengan mode aktif C++11 gcc.
Basis kode server 99% umum, klien - 95%. Selain itu, bahkan platform seluler menggunakan kode C++ yang sama dengan kode “besar”, meskipun persentase penyatuannya agak lebih rendah.
Seperti kebanyakan pengguna C++, kami tidak mengklaim menggunakan 100% kemampuan bahasa dan pustakanya. Jadi, kami praktis tidak menggunakan Boost, dan salah satu fitur bahasanya adalah casting tipe dinamis. Pada saat yang sama, kami secara aktif menggunakan:

  • STL (khususnya string, container, dan algoritma)
  • warisan berganda, termasuk. beberapa warisan implementasi
  • Pola
  • pengecualian
  • pointer cerdas (implementasi khusus)

Dengan menggunakan pewarisan berganda antarmuka (kelas yang sepenuhnya abstrak), model komponen menjadi mungkin, yang akan dibahas di bawah.

Komponen

Untuk memastikan modularitas, semua fungsionalitas dibagi menjadi beberapa komponen, yaitu perpustakaan dinamis (*.dll untuk Windows, *.so untuk Linux). Totalnya ada lebih dari seratus lima puluh komponen; berikut penjelasan beberapa di antaranya:

backend
Berisi mesin metadata platform

akun
Objek yang digunakan pengembang aplikasi untuk membuat catatan akuntansi (bagan akun dan register akuntansi)

bsl
Mesin eksekusi bahasa tertanam

nuklir
Implementasi khusus pengalokasi memori

dbeng8
Mesin basis data file. Mesin database server file sederhana berdasarkan ISAM, yang juga mencakup prosesor SQL sederhana

dasar w
Berisi kelas dasar dan fungsi untuk mengimplementasikan antarmuka pengguna Windows - kelas jendela, akses GDI, dll.

Membagi menjadi beberapa komponen berguna dari beberapa sudut pandang:

  • Pemisahan mendorong desain yang lebih baik, khususnya isolasi kode yang lebih baik
  • Dari sekumpulan komponen, Anda dapat secara fleksibel merakit berbagai opsi pengiriman:
    • Misalnya, instalasi klien tipis akan berisi wbase, tetapi tidak memiliki backend
    • tetapi di server wbase, sebaliknya, tidak akan terjadi
    • kedua opsi tersebut tentu saja akan berisi nuke dan bsl

Semua komponen yang diperlukan untuk opsi peluncuran ini dimuat saat program dimulai. Hal ini, khususnya, diperlukan untuk mendaftarkan kelas SCOM, yang akan dibahas di bawah.

SCOM

Untuk dekomposisi di tingkat yang lebih rendah, digunakan sistem SCOM, perpustakaan yang ideologinya mirip dengan ATL. Bagi mereka yang belum pernah bekerja dengan ATL, kami mencantumkan secara singkat kemampuan dan fitur utama.
Untuk kelas SCOM yang dirancang khusus:

  • Menyediakan metode pabrik yang memungkinkan Anda membuat kelas dari komponen lain hanya dengan mengetahui namanya (tanpa mengungkapkan implementasinya)
  • Menyediakan infrastruktur penunjuk cerdas penghitungan referensi. Seumur hidup kelas SCOM tidak perlu dipantau secara manual
  • Memungkinkan Anda mengetahui apakah suatu objek mengimplementasikan antarmuka tertentu dan secara otomatis mengonversi penunjuk ke objek menjadi penunjuk ke antarmuka
  • Buat objek layanan yang selalu dapat diakses melalui metode get_service, dll.

Misalnya, Anda dapat mendeskripsikan kelas untuk membaca JSON (misalnya, JSONStreamReader) di komponen json.dll.
Kelas dan instance dapat dibuat dari komponen lain; mereka harus didaftarkan di mesin SCOM:

SCOM_CLASS_ENTRY(JSONStreamReader)

Makro ini akan mendeskripsikan kelas perekam statis khusus, yang konstruktornya akan dipanggil saat komponen dimuat ke dalam memori.
Setelah ini, Anda dapat membuat instance-nya di komponen lain:

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

Untuk mendukung layanan, SCOM menawarkan infrastruktur tambahan yang agak kompleks. Inti dari hal ini adalah konsep proses SCOM, yang berfungsi sebagai wadah untuk menjalankan layanan (yaitu, memainkan peran Service Locator), dan juga berisi pengikatan ke sumber daya lokal. Proses SCOM terikat pada thread OS. Berkat ini, di dalam aplikasi Anda dapat menerima layanan seperti ini:

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

Selain itu, dengan mengalihkan proses logis (SCOM) yang diikat ke sebuah thread, Anda bisa mendapatkan aplikasi yang praktis independen dari sudut pandang ruang informasi, berjalan dalam thread yang sama. Beginilah cara klien tipis kami bekerja dengan basis data file - di dalam satu proses OS terdapat dua proses SCOM, satu terkait dengan klien, dan yang kedua dengan server. Pendekatan ini memungkinkan kita untuk menyatukan penulisan kode yang akan bekerja baik pada database file lokal dan dalam versi server-klien “nyata”. Harga untuk keseragaman seperti itu memang mahal, namun praktik menunjukkan bahwa hal itu sepadan.

Berdasarkan model komponen SCOM, logika bisnis dan bagian antarmuka 1C:Enterprise diimplementasikan.

Antarmuka pengguna

Berbicara tentang antarmuka. Kami tidak menggunakan kontrol Windows standar; kontrol kami diterapkan langsung pada Windows API. Untuk versi Linux, telah dibuat lapisan yang berfungsi melalui perpustakaan wxWidgets.
Pustaka kontrol tidak bergantung pada bagian lain dari 1C:Enterprise dan kami gunakan di beberapa utilitas internal kecil lainnya.

Selama bertahun-tahun pengembangan 1C:Enterprise, tampilan kontrol telah berubah, namun perubahan prinsip yang serius hanya terjadi sekali, pada tahun 2009, dengan dirilisnya versi 8.2 dan munculnya “formulir terkelola”. Selain mengubah tampilan, prinsip tata letak bentuk telah berubah secara mendasar - ada penolakan terhadap pemosisian elemen piksel demi piksel demi tata letak aliran elemen. Selain itu, dalam model baru, kontrol tidak bekerja secara langsung dengan objek domain, tetapi dengan DTO khusus (Objek Transfer Data).
Perubahan ini memungkinkan pembuatan klien web 1C:Enterprise yang mereplikasi logika C++ kontrol JavaScript. Kami mencoba mempertahankan kesetaraan fungsional antara klien tipis dan web. Dalam kasus di mana hal ini tidak memungkinkan, misalnya karena keterbatasan API JavaScript yang tersedia (misalnya, kemampuan untuk bekerja dengan file sangat terbatas), kami sering mengimplementasikan fungsionalitas yang diperlukan menggunakan ekstensi browser yang ditulis dalam C++. Saat ini kami mendukung Internet Explorer dan Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows dan Linux) dan Safari (MacOS).

Selain itu, teknologi formulir terkelola digunakan untuk membuat antarmuka aplikasi seluler pada platform 1C. Pada perangkat seluler, rendering kontrol diimplementasikan menggunakan teknologi asli sistem operasi, tetapi untuk logika tata letak formulir dan respons antarmuka, kode yang sama digunakan seperti pada platform 1C:Enterprise "besar".

Platform "1C: Enterprise" - apa yang ada di baliknya?
Antarmuka 1C pada OS Linux

Platform "1C: Enterprise" - apa yang ada di baliknya?
Antarmuka 1C pada perangkat seluler

Antarmuka 1C pada platform lain Platform "1C: Enterprise" - apa yang ada di baliknya?
Antarmuka 1C pada OS Windows

Platform "1C: Enterprise" - apa yang ada di baliknya?
Antarmuka 1C - klien web

Open source

Meskipun kami tidak menggunakan pustaka standar untuk pengembang C++ di Windows (MFC, kontrol dari WinAPI), kami tidak menulis semua komponen sendiri. Perpustakaan telah disebutkan wxWidget, dan kami juga menggunakan:

  • keriting untuk bekerja dengan HTTP dan FTP.
  • OpenSSL untuk bekerja dengan kriptografi dan membuat koneksi TLS
  • libxml2 dan libxslt untuk penguraian XML
  • libetpan untuk bekerja dengan protokol email (POP3, SMTP, IMAP)
  • mimesis untuk mengurai pesan email
  • sqlite untuk menyimpan log pengguna
  • ICU untuk internasionalisasi

Daftarnya terus berlanjut.
Selain itu, kami menggunakan versi yang sangat dimodifikasi Tes Google и Google Tiruan saat mengembangkan tes unit.
Perpustakaan memerlukan adaptasi agar kompatibel dengan model organisasi komponen SCOM.
Prevalensi 1C menjadikan platform ini sebagai uji kekuatan yang sangat baik bagi perpustakaan yang digunakan di dalamnya. Berbagai pengguna dan skenario dengan cepat mengungkapkan kesalahan bahkan di area kode yang paling jarang digunakan. Kami memperbaikinya sendiri dan mencoba mengembalikannya kepada penulis perpustakaan. Pengalaman interaksinya ternyata sangat berbeda.
Pengembang keriting и libetpan merespons dengan cepat permintaan tarik, tetapi tambalan, misalnya, masuk OpenSSL Kami tidak pernah berhasil mengembalikannya.

Kesimpulan

Dalam artikel tersebut kami menyentuh beberapa aspek utama pengembangan platform 1C:Enterprise. Dalam cakupan artikel yang terbatas, kami hanya menyinggung beberapa aspek yang menurut kami menarik.
Gambaran umum tentang berbagai mekanisme platform dapat ditemukan di sini.
Topik apa yang menarik bagi Anda di artikel mendatang?

Bagaimana platform seluler 1C diimplementasikan?
Deskripsi struktur internal klien web?
Atau mungkin Anda tertarik dengan proses pemilihan fitur untuk rilis baru, pengembangan, dan pengujian?

Tulis di komentar!

Sumber: www.habr.com

Tambah komentar