Integrasi cepat dengan 1C: Enterprise

Pada artikel ini saya akan berbicara tentang cara paling sederhana, menurut saya, untuk mengintegrasikan aplikasi pihak ketiga dengan konfigurasi 1C. Artikel ini akan menarik terutama untuk pengembang yang menulis di .Net Core , PHP dan Python .

Ada banyak cara untuk berintegrasi dengan 1C, artikel bagus dari 1C sendiri bahkan dikhususkan untuk ini. Dari sini Anda akan belajar secara khusus bahwa 1C mendukung mekanisme layanan web, yang berarti kami dapat mengimplementasikan layanan kami sendiri di sisi 1C, dan, sebagai hasilnya, perpustakaan ORM kami sendiri di sisi aplikasi klien. Salah satu perpustakaan ini akan dibahas nanti.

Deskripsi teknik secara umum


Di sisi 1C


Semuanya dimulai dengan fakta bahwa ekstensi "Brom" ditambahkan ke konfigurasi 1C, menambahkan layanan web baru. Ekstensi ini tersedia secara bebas dan berlisensi (MIT). Ekstensi itu sendiri tidak terikat pada model data tertentu, dan karenanya dapat diinstal pada konfigurasi apa pun dengan dukungan untuk mode kompatibilitas 8.3.10 atau lebih tinggi.

Setelah ekstensi diinstal, Anda harus mengonfigurasi hak pengguna yang akan memiliki akses ke metode layanan web, serta menerbitkan konfigurasi pada server web sehingga layanan tambahan dapat diakses melalui protokol http (s). Di sisi 1C, tidak diperlukan lagi.

Di sisi klien


Di sisi klien, paket Brom terhubung, misalnya, untuk .Net Core ini dapat dilakukan dengan perintah:

Install-Package Brom -Version 1.0.1-beta08 

Atau untuk Python:

 pip install brome 

Setelah menginstal paket, cukup untuk membuat objek klien melalui mana interaksi dengan konfigurasi 1C jarak jauh akan dilakukan. Selanjutnya saya akan memberikan kode dalam C #, tetapi dalam PHP dan Python sama. Jadi, Anda dapat membuat klien dengan satu perintah:

 dynamic  = new (@"  = http://mydomain.com/publication_name;  = 1c_user_name;  = 1c_user_pass "); 

Dalam konstruktor, cukup untuk menunjukkan alamat konfigurasi 1C yang dipublikasikan, dan data pengguna yang kami berikan hak aksesnya ke ekstensi. Segera setelah klien dibuat, kami dapat melanjutkan ke yang paling menarik.

Panggilan prosedur dan fungsi 1C


Melalui klien bromine yang dibuat, kita dapat memanggil prosedur dan fungsi yang didefinisikan dalam 1C. Dalam hal ini, metode yang dipanggil harus sisi server dan dimasukkan baik dalam konteks global atau dalam modul server (modul umum atau modul manajer). Misalnya, ini adalah bagaimana pemanggilan fungsi konteks global "Number Prescription" terlihat seperti:

 string  = .(2547, " = fr_FR"); 

Parameter kedua adalah string format yang menunjukkan lokalisasi (Prancis). Parameter ditransfer dalam bentuk alami dan tidak memerlukan konversi atau kemasan tambahan.

Dan inilah yang akan menjadi panggilan fungsi Find By Code dari modul direktori manager:

 var  = ...(840); 

Di sini kita memanggil fungsi melalui direktori manajer modul "Mata Uang". Hasil panggilan akan menjadi objek dari tipe "DirectoryReference". Sekarang tautan yang dihasilkan ke objek dapat dikirimkan sebagai parameter ke fungsi lain:

 var  = ..(, DateTime.Today); 

Kali ini kami beralih ke modul umum "Bekerja dengan Mata Uang" dan menyelamatkan metodenya "Dapatkan Mata Uang Kursus".

Perpustakaan mendukung bekerja dengan tipe data yang kompleks, sehingga dimungkinkan untuk memanggil metode yang mengambil input atau kembali: Tautan, Array, Struktur, Tabel Nilai, Pohon Nilai, pencacahan sistem, dll. ... Beberapa kelas secara khusus diterapkan di perpustakaan klien untuk mempermudah bekerja dengan 1C.

Cakupan metode jarak jauh dapat dikonfigurasi secara fleksibel dengan menetapkannya dalam pengaturan. Jadi, misalnya, jika Anda menentukan area "Direktori. *. Cari Menurut Kode", maka hanya metode "Temukan Menurut Kode" yang akan tersedia di semua direktori konfigurasi. Dengan demikian, Anda dapat dengan jelas menunjukkan metode mana yang dapat digunakan aplikasi terintegrasi.

Bekerja dengan tautan


Referensi ke objek memungkinkan tidak hanya untuk mentransfer pointer ke objek 1C, tetapi juga untuk menerima data dari objek itu sendiri. Bekerja dengan tautan di sisi klien semudah di 1C. Sebagai contoh:

 var  = ...("00-000018", new Date(2017, 1, 1)); var  = .; var  = .; var  = ..; foreach (var  in .) { Console.WriteLine((., .)); } 

Di sini kami menemukan tautan ke dokumen melalui modul manajer dan mendapatkan nilai dari bidang dokumen dan bagian tabularnya "Produk". Setelah akses pertama ke bidang objek, semua datanya diunduh dari server 1C dan disimpan pada klien hingga tautan dihapus oleh pengumpul sampah.

Tautan ke objek juga dapat diperoleh di sisi klien tanpa mengakses server. Untuk melakukan ini, cukup ketahui pengenal unik objek:

 var  = ...(new Guid("5a32b6ab-4661-11e9-912a-38d547755ef7")); 

Anda juga bisa mendapatkan tautan ke item koleksi yang telah ditentukan:

 var  = ...18_118; 


Mengedit Objek


Memiliki tautan ke objek, kita dapat mengedit data objek. Untuk melakukan ini, cukup buat konteks objek:

 var  = .(); . = DateTime.Today; . = "00-000055"; ..(); var  = ..() . = ...("000000104"); . = 3; .(.); 

Dalam contoh ini, kami membuat konteks dokumen melalui tautan ke dokumen, mengisi beberapa bidang, menambahkan baris ke bagian tabular β€œProduk” dan mencatat dokumen dalam mode pengiriman.

Jika Anda perlu membuat objek baru, maka ini juga memungkinkan:

 //     var  = ...(); . = " "; .(); //     var  = ...(); . = .; . = " "; . = "T-00012321"; //    .(); //      var  = .; 

Di sini kami membuat grup baru di direktori "Nomenklatur", lalu membuat elemen direktori dan menempatkannya di grup yang dibuat.

Sampling


Seperti halnya ORM yang layak, klien bromine memungkinkan Anda membuat sampel dari berbagai koleksi objek 1C. Seleksi adalah kumpulan referensi ke objek koleksi yang memenuhi serangkaian kondisi pemilihan. Untuk membuat pilihan, cukup buat objek "Selector":

 var  = ...(""); var  = ...(); . (", , , ."). ("", false). ("", , .). (""). ("", .); foreach (var  in ) { Console.WriteLine(": {0}; : {1}, : {2}; : {3}", ., ., ., .. ); } //         var  = .(); 

Dalam contoh ini, kami mendapat sampel yang berisi elemen direktori "Nomenklatur", yang secara hierarkis berada di grup "Mebel". Kami menunjukkan bahwa selain tautan itu sendiri, perlu memuat data dari beberapa bidang. Karena ini, data bidang ini akan dimuat dengan satu permintaan, dan akses ke sana tidak akan mengarah ke panggilan server tambahan.

Eksekusi query


Paling sering, data yang disimpan dalam satu koleksi menjadi tidak mencukupi, dan kita perlu mendapatkan data yang dihasilkan oleh kueri yang kompleks. Untuk memenuhi permintaan, "Permintaan" kelas khusus disediakan di perpustakaan klien. Bekerja dengan permintaan di sisi klien sangat mirip dengan bekerja di sisi 1C:

 var  = .(@"  .  , .  , .    .    . = & "); .("", "-0001"); var  = .(); foreach (var  in ) { Console.WriteLine((., .)); } 

Di sini kami membuat kueri sederhana dengan parameter yang memilih data dari direktori "Nomenklatur". Sebagai parameter, kami melewati artikel string elemen. Dalam kasus umum, nilai parameter juga bisa berupa tautan, enumerasi sistem, dan bahkan array. Sebagai hasil dari kueri, kami mengembalikan "Tabel Nilai", kelas ini diimplementasikan pada sisi klien. Dalam contoh ini, kami menyimpulkan bidang baris tabel menggunakan loop.

Di sisi 1C, semua permintaan dieksekusi melalui pembuat kueri, jadi Anda dapat menentukan tidak hanya permintaan yang sudah jadi sebagai teks, tetapi juga templat permintaan yang berisi markup untuk pembuat:

 var = .(@"   5 .  , .  , .   { .*}  ..( {(&)}, { ().*, ().*} )   { .} {  .*, .*} "); //         .("..", ""); //      .("", 100, .); //       .("."); .("", .); var  = .(.); 

Dalam contoh ini, kami menetapkan permintaan standar, pengaturan yang dapat diubah secara dinamis di sisi klien sesuai kebutuhan. Karena ini, bidang, pilihan dan penyortiran dapat ditunjukkan dalam tubuh kode program utama, dan tidak di dalam tubuh permintaan.

Metode Jalankan menerima parameter opsional "jenis perayapan hasil." Jika Anda menentukan jenis perayapan "Dengan pengelompokan" atau "Dengan pengelompokan dengan hierarki", maka alih-alih tabel nilai, metode akan mengembalikan pohon nilai.

Selain itu, alih-alih metode Jalankan, Anda dapat memanggil metode Jalankan Paket (untuk menjalankan beberapa permintaan sekaligus). Dalam hal ini, array tabel atau array pohon akan dikembalikan, tergantung pada jenis traversal.

Eksekusi potongan kode


Dalam beberapa kasus eksotis, Anda mungkin perlu menjalankan bagian kode tertentu langsung di sisi 1C. Untuk melakukan ini, klien Brom menyediakan metode "Jalankan". Metode ini mengambil input teks yang berisi kode yang dapat dieksekusi dan satu parameter opsional, yang akan tersedia dalam kode dalam variabel "Parameter":

 var  = .(@"  = 0;        =  + ; ; ", new double[] { 45, 67, 12.56, 11.9 }); 

Dalam contoh ini, kami mengeksekusi sepotong kode yang menjumlahkan angka dalam array. Array itu sendiri dilewatkan sebagai parameter dan ditempatkan dalam variabel "Parameter". Hasil perhitungan ditempatkan dalam variabel "Hasil". Jika variabel dengan nama ini diisi dengan kode yang dapat dieksekusi, maka nilainya pada saat eksekusi berakhir dikembalikan sebagai hasil dari fungsi "Jalankan".

Kemampuan untuk mengeksekusi fragmen kode diatur oleh peran akses terpisah dalam ekstensi. Disarankan untuk mengaktifkan peran ini hanya untuk tujuan pengujian, dan pastikan untuk menonaktifkannya dalam draft kerja, karena Ini adalah kerentanan yang jelas.

Keuntungan kelemahan teknik


Keuntungan dari metodologi yang dideskripsikan tentunya harus mencakup:

  • Lintas-platform . Semua interaksi didasarkan pada protokol SOAP dan HTTP, dan implementasinya pada semua platform pengembangan populer;
  • Kesederhanaan kode . Kode di sisi aplikasi klien hampir identik dengan kode di sisi 1C;
  • Mekanisme serialisasi bawaan . Kita tidak perlu mengemas dan membongkar data untuk menukarnya dengan 1C;
  • Dukungan untuk bekerja dengan tautan . Kami memiliki akses mudah ke objek 1C melalui tautan;
  • Dukungan untuk tipe data khusus 1C . Kita dapat bertukar dengan tabel 1C, pohon, struktur dan struktur kompleks lainnya;
  • Akses ke konteks aplikasi . Kami memiliki akses tidak hanya ke data basis data, tetapi juga memiliki kemampuan untuk memanggil metode yang ditentukan di sisi 1C, dan juga memiliki akses ke status sesi.

Kerugian dari teknik ini juga tersedia:

  • Kecepatan data rendah . Karena protokol SOAP didasarkan pada serialisasi XML, transfer data dalam jumlah besar membutuhkan waktu untuk pertukaran kelebihan lalu lintas, serta untuk mengemas dan membongkar data. Komunikasi melalui koneksi COM tampaknya lebih disukai dalam konteks ini;
  • Klien yang nyaman tidak tersedia di semua platform . Jika Anda bukan .Net Core, PHP atau programmer Python, maka Anda harus mengimplementasikan klien bromine sendiri menggunakan mekanisme SOAP, yang, secara umum, memakan waktu;
  • Keterbatasan bahasa permintaan 1C . Karena semua pekerjaan dengan database terjadi melalui mekanisme permintaan 1C, ada beberapa batasan. Misalnya, Anda tidak dapat menerapkan pagination data klasik, karena dalam bahasa query 1C tidak ada mekanisme untuk paging.

Perbandingan dengan OData


Dari artikel 1C tersebut di atas, Anda dapat mengetahui bahwa di 1C: Akses perusahaan ke data diimplementasikan menggunakan protokol OData standar. Karena alasan ini, bodoh juga untuk tidak menyebutkannya.
Berikut ini adalah bagan perbandingan singkat:
BromOData
Memperoleh data pengumpulan dengan pemilihan kompleks dan kondisi penyortiran++
Halaman keluaran dari data koleksi+
Menambah dan mengedit data++
Dukungan untuk bekerja dengan tipe 1C: Perusahaan (tautan, tabel, pohon, dll.)+
Melakukan kueri yang sewenang-wenang+
Memanggil prosedur dan fungsi server+
Eksekusi kode server sewenang-wenang+
Alat visualisasi siap pakai / antarmuka pengguna+
Transfer data JSON+

Dapat dilihat bahwa metode ini memiliki kelebihan dan kekurangan dan, dalam kasus umum, tidak dapat dipertukarkan.

Kesimpulan


Saya harap artikel ulasan ini akan membantu Anda di masa depan dengan cepat dan mudah membuat portal, akun pribadi, dan layanan yang terintegrasi erat dengan sistem akuntansi berdasarkan 1C: Enterprise. Anda dapat menemukan informasi terperinci tentang komponen bromin dalam dokumentasi resmi, di sini hanya gambaran singkat dari fitur utama.

Source: https://habr.com/ru/post/id462453/


All Articles