Kaedah penyepaduan dengan 1C

Apakah keperluan yang paling penting untuk aplikasi perniagaan? Beberapa tugas yang paling penting adalah seperti berikut:

  • Kemudahan menukar/menyesuaikan logik aplikasi untuk mengubah tugas perniagaan.
  • Penyepaduan mudah dengan aplikasi lain.

Cara tugasan pertama diselesaikan dalam 1C diterangkan secara ringkas dalam bahagian "Penyesuaian dan Sokongan". artikel ini; Kami akan kembali kepada topik menarik ini dalam artikel akan datang. Hari ini kita akan bercakap tentang tugas kedua, integrasi.

Tugasan integrasi

Tugas integrasi boleh berbeza. Untuk menyelesaikan beberapa masalah, pertukaran data interaktif yang mudah adalah mencukupi - sebagai contoh, untuk memindahkan senarai pekerja ke bank untuk mengeluarkan kad plastik gaji. Untuk tugas yang lebih kompleks, pertukaran data automatik sepenuhnya mungkin diperlukan, mungkin dengan merujuk kepada logik perniagaan sistem luaran. Terdapat tugas yang bersifat khusus, seperti penyepaduan dengan peralatan luaran (contohnya, peralatan runcit, pengimbas mudah alih, dsb.) atau dengan sistem warisan atau sangat khusus (contohnya, dengan sistem pengecaman tag RFID). Adalah sangat penting untuk memilih mekanisme penyepaduan yang paling sesuai untuk setiap tugas.

Pilihan penyepaduan dengan 1C

Terdapat pendekatan yang berbeza untuk melaksanakan penyepaduan dengan aplikasi 1C; yang mana satu untuk dipilih bergantung pada keperluan tugas.

  1. Berasaskan pelaksanaan mekanisme integrasidisediakan oleh platform, API khususnya sendiri pada bahagian aplikasi 1C (contohnya, satu set perkhidmatan Web atau HTTP yang akan memanggil aplikasi pihak ketiga untuk bertukar data dengan aplikasi 1C). Kelebihan pendekatan ini ialah rintangan API terhadap perubahan dalam pelaksanaan pada sisi aplikasi 1C. Keistimewaan pendekatan ini ialah perlu menukar kod sumber penyelesaian 1C standard, yang mungkin memerlukan usaha apabila menggabungkan kod sumber apabila beralih ke versi baharu konfigurasi. Dalam kes ini, fungsi progresif baharu boleh datang untuk menyelamatkan - sambungan konfigurasi. Sambungan, pada asasnya, mekanisme pemalam yang membolehkan anda membuat penambahan pada penyelesaian aplikasi tanpa mengubah penyelesaian aplikasi itu sendiri. Mengalihkan API penyepaduan ke dalam sambungan konfigurasi akan membolehkan anda mengelakkan kesukaran apabila menggabungkan konfigurasi apabila beralih ke versi baharu penyelesaian standard.
  2. Menggunakan mekanisme penyepaduan platform yang menyediakan akses luaran kepada model objek aplikasi dan tidak memerlukan pengubahsuaian aplikasi atau penciptaan sambungan. Kelebihan pendekatan ini ialah tidak perlu menukar aplikasi 1C. Tolak - jika aplikasi 1C telah diperbaiki, maka penambahbaikan mungkin diperlukan dalam aplikasi bersepadu. Contoh pendekatan ini ialah penggunaan protokol OData untuk penyepaduan, dilaksanakan pada sisi platform 1C:Enterprise (lebih lanjut mengenainya di bawah).
  3. Penggunaan protokol aplikasi siap sedia dilaksanakan dalam penyelesaian 1C standard. Banyak penyelesaian standard daripada 1C dan rakan kongsi melaksanakan protokol aplikasi mereka sendiri, memfokuskan pada tugas tertentu, berdasarkan mekanisme penyepaduan yang disediakan oleh platform. Apabila menggunakan mekanisme ini, tidak perlu menulis kod pada bahagian aplikasi 1C, kerana Kami menggunakan keupayaan standard penyelesaian aplikasi. Di bahagian aplikasi 1C, kami hanya perlu membuat tetapan tertentu.

Mekanisme integrasi dalam platform 1C:Enterprise

Import/eksport fail

Katakan kita berhadapan dengan tugas pertukaran data dua hala antara aplikasi 1C dan aplikasi sewenang-wenangnya. Sebagai contoh, kita perlu menyegerakkan senarai produk (direktori Nomenklatur) antara aplikasi 1C dan aplikasi sewenang-wenangnya.

Kaedah penyepaduan dengan 1C
Untuk menyelesaikan masalah ini, anda boleh menulis sambungan yang memuat turun direktori Nomenklatur ke dalam fail format tertentu (teks, XML, JSON, ...) dan boleh membaca format ini.

Platform ini melaksanakan mekanisme untuk menyerikan objek aplikasi dalam XML secara langsung, melalui kaedah konteks global WriteXML/ReadXML dan menggunakan objek tambahan XDTO (Objek Pemindahan Data XML).

Sebarang objek dalam sistem 1C:Enterprise boleh disirikan menjadi perwakilan XML dan sebaliknya.

Fungsi ini akan mengembalikan perwakilan XML objek:

Функция Объект_В_XML(Объект)
    ЗаписьXML = Новый ЗаписьXML();
    ЗаписьXML.УстановитьСтроку();
    ЗаписатьXML(ЗаписьXML, Объект);
    Возврат ЗаписьXML.Закрыть();
КонецФункции

Inilah yang akan kelihatan seperti mengeksport direktori Nomenclature ke XML menggunakan XDTO:

&НаСервере
Процедура ЭкспортXMLНаСервере()	
	НовыйСериализаторXDTO  = СериализаторXDTO;
	НоваяЗаписьXML = Новый ЗаписьXML();
	НоваяЗаписьXML.ОткрытьФайл("C:DataНоменклатура.xml", "UTF-8");
	
	НоваяЗаписьXML.ЗаписатьОбъявлениеXML();
	НоваяЗаписьXML.ЗаписатьНачалоЭлемента("СправочникНоменклатура");
	
	Выборка = Справочники.Номенклатура.Выбрать();
	
	Пока Выборка.Следующий() Цикл 
		ОбъектНоменклатура = Выборка.ПолучитьОбъект();
		НовыйСериализаторXDTO.ЗаписатьXML(НоваяЗаписьXML, ОбъектНоменклатура, НазначениеТипаXML.Явное);
	КонецЦикла;
	
	НоваяЗаписьXML.ЗаписатьКонецЭлемента();
	НоваяЗаписьXML.Закрыть();	
КонецПроцедуры

Dengan hanya mengubah suai kod, kami mengeksport direktori ke JSON. Produk akan ditulis pada tatasusunan; Untuk variasi, berikut ialah versi bahasa Inggeris sintaks:

&AtServer
Procedure ExportJSONOnServer()
	NewXDTOSerializer  = XDTOSerializer;
	NewJSONWriter = New JSONWriter();
	NewJSONWriter.OpenFile("C:DataНоменклатура.json", "UTF-8");
	
	NewJSONWriter.WriteStartObject();
	NewJSONWriter.WritePropertyName("СправочникНоменклатура");
	NewJSONWriter.WriteStartArray();
	
	Selection = Catalogs.Номенклатура.Select();	
	
	While Selection.Next() Do 
		NomenclatureObject = Selection.GetObject();
		
		NewJSONWriter.WriteStartObject();
		
		NewJSONWriter.WritePropertyName("Номенклатура");
		NewXDTOSerializer.WriteJSON(NewJSONWriter, NomenclatureObject, XMLTypeAssignment.Implicit);
		
		NewJSONWriter.WriteEndObject();
	EndDo;
	
	NewJSONWriter.WriteEndArray();
	NewJSONWriter.WriteEndObject();
	NewJSONWriter.Close();	
EndProcedure

Kemudian yang tinggal hanyalah memindahkan data kepada pengguna akhir. Platform 1C:Enterprise menyokong protokol Internet utama HTTP, FTP, POP3, SMTP, IMAP, termasuk versi selamatnya. Anda juga boleh menggunakan perkhidmatan HTTP dan/atau Web untuk memindahkan data.

HTTP dan perkhidmatan web

Kaedah penyepaduan dengan 1C

Aplikasi 1C boleh melaksanakan perkhidmatan HTTP dan web mereka sendiri, serta memanggil perkhidmatan HTTP dan web yang dilaksanakan oleh aplikasi pihak ketiga.

Antara muka REST dan protokol OData

Bermula dari versi 8.3.5, platform 1C:Enterprise boleh secara automatik buat antara muka REST untuk keseluruhan penyelesaian aplikasi. Sebarang objek konfigurasi (direktori, dokumen, daftar maklumat, dll.) boleh disediakan untuk menerima dan mengubah suai data melalui antara muka REST. Platform menggunakan protokol sebagai protokol akses OData versi 3.0. Penerbitan perkhidmatan OData dilakukan daripada menu Configurator "Pentadbiran -> Penerbitan pada pelayan web", kotak semak "Terbitkan antara muka OData standard" mesti ditandakan. Format Atom/XML dan JSON disokong. Selepas penyelesaian aplikasi diterbitkan pada pelayan web, sistem pihak ketiga boleh mengaksesnya melalui antara muka REST menggunakan permintaan HTTP. Untuk bekerja dengan aplikasi 1C melalui protokol OData, pengaturcaraan pada bahagian 1C tidak diperlukan.

Jadi, URL seperti http://<сервер>/<конфигурация>/odata/standard.odata/Catalog_Номенклатура akan mengembalikan kepada kami kandungan katalog Tatanama dalam format XML - koleksi elemen entri (tajuk mesej ditiadakan untuk ringkas):

<entry>
	<id>http://server/Config/odata/standard.odata/Catalog_Номенклатура(guid'35d1f6e4-289b-11e6-8ba4-e03f49b16074')</id>
	<category term="StandardODATA.Catalog_Номенклатура" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
	<title type="text"/>
	<updated>2016-06-06T16:42:17</updated>
	<author/>
	<summary/>
	<link rel="edit" href="Catalog_Номенклатура(guid'35d1f6e4-289b-11e6-8ba4-e03f49b16074')" title="edit-link"/>
	<content type="application/xml">
		<m:properties  >
			<d:Ref_Key>35d1f6e4-289b-11e6-8ba4-e03f49b16074</d:Ref_Key>
			<d:DataVersion>AAAAAgAAAAA=</d:DataVersion>
			<d:DeletionMark>false</d:DeletionMark>
			<d:Code>000000001</d:Code>
			<d:Description>Кондиционер Mitsubishi</d:Description>
			<d:Описание>Мощность 2,5 кВт, режимы работы: тепло/холод</d:Описание>
		</m:properties>
	</content>
</entry>
<entry>
	<id>http://server/Config/odata/standard.odata/Catalog_Номенклатура(guid'35d1f6e5-289b-11e6-8ba4-e03f49b16074')</id>
	<category term="StandardODATA.Catalog_Номенклатура" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
...

Dengan menambahkan rentetan "?$format=application/json" pada URL, kami mendapat kandungan katalog Tatanama dalam format JSON (URL borang http://<сервер>/<конфигурация>/odata/standard.odata/Catalog_Номенклатура?$format=application/json ):

{
"odata.metadata": "http://server/Config/odata/standard.odata/$metadata#Catalog_Номенклатура",
"value": [{
"Ref_Key": "35d1f6e4-289b-11e6-8ba4-e03f49b16074",
"DataVersion": "AAAAAgAAAAA=",
"DeletionMark": false,
"Code": "000000001",
"Description": "Кондиционер Mitsubishi",
"Описание": "Мощность 2,5 кВт, режимы работы: тепло/холод"
},{
"Ref_Key": "35d1f6e5-289b-11e6-8ba4-e03f49b16074",
"DataVersion": "AAAAAwAAAAA=",
"DeletionMark": false,
"Code": "000000002",
"Description": "Кондиционер Daikin",
"Описание": "Мощность 3 кВт, режимы работы: тепло/холод"
}, …

Sumber data luaran

Kaedah penyepaduan dengan 1C
Dalam beberapa kes, pertukaran data melalui sumber data luaran mungkin penyelesaian terbaik. Sumber data luaran ialah objek konfigurasi aplikasi 1C yang membolehkan anda berinteraksi dengan mana-mana pangkalan data serasi ODBC, baik untuk membaca dan menulis. Sumber data luaran tersedia pada Windows dan Linux.

Mekanisme pertukaran data

Mekanisme pertukaran data bertujuan untuk mencipta sistem yang diedarkan secara geografi berdasarkan 1C:Enterprise dan untuk mengatur pertukaran data dengan sistem maklumat lain yang tidak berdasarkan 1C:Enterprise.

Mekanisme ini digunakan secara aktif dalam pelaksanaan 1C, dan julat tugas yang diselesaikan dengan bantuannya adalah sangat luas. Ini termasuk pertukaran data antara aplikasi 1C yang dipasang di cawangan organisasi, dan pertukaran antara aplikasi 1C dan tapak web kedai dalam talian, dan pertukaran data antara aplikasi pelayan 1C dan pelanggan mudah alih (dicipta menggunakan platform mudah alih 1C:Enterprise), dan banyak lagi lebih.

Salah satu konsep utama dalam mekanisme pertukaran data ialah pelan pertukaran. Pelan pertukaran ialah jenis objek khas platform aplikasi 1C, yang menentukan, khususnya, komposisi data yang akan mengambil bahagian dalam pertukaran (direktori, dokumen, daftar, dll.). Pelan pertukaran juga mengandungi maklumat tentang peserta pertukaran (yang dipanggil nod pertukaran).
Komponen kedua mekanisme pertukaran data ialah mekanisme pendaftaran perubahan. Mekanisme ini secara automatik memantau sistem untuk perubahan dalam data yang mesti dipindahkan kepada pengguna akhir sebagai sebahagian daripada pelan pertukaran. Menggunakan mekanisme ini, platform menjejaki perubahan yang telah berlaku sejak penyegerakan terakhir dan membolehkan anda meminimumkan jumlah data yang dipindahkan semasa sesi penyegerakan seterusnya.

Pertukaran data berlaku menggunakan mesej XML struktur tertentu. Mesej mengandungi data yang telah berubah sejak penyegerakan terakhir dengan nod dan beberapa maklumat perkhidmatan. Struktur mesej menyokong penomboran mesej dan membolehkan anda menerima pengesahan daripada nod penerima bahawa mesej telah diterima. Pengesahan sedemikian terkandung dalam setiap mesej yang datang dari nod penerima, dalam bentuk nombor mesej terakhir diterima. Mesej penomboran membolehkan platform memahami data yang telah berjaya dihantar ke nod penerima, dan untuk mengelakkan penghantaran semula dengan menghantar hanya data yang telah berubah sejak nod penghantaran menerima mesej terakhir dengan resit untuk data yang diterima oleh nod penerima. Skim operasi ini memastikan penghantaran terjamin walaupun dengan saluran penghantaran yang tidak boleh dipercayai dan kehilangan mesej.

Komponen Luaran

Dalam beberapa kes, apabila menyelesaikan masalah penyepaduan, seseorang perlu berurusan dengan keperluan khusus, contohnya, protokol interaksi, format data, yang tidak disediakan dalam platform 1C:Enterprise. Untuk pelbagai tugas sedemikian, platform menyediakan teknologi komponen luaran, yang membolehkan anda mencipta modul pemalam secara dinamik yang mengembangkan fungsi 1C:Enterprise.

Contoh tipikal tugas dengan keperluan yang serupa ialah penyepaduan penyelesaian aplikasi 1C dengan peralatan runcit, daripada penimbang kepada daftar tunai dan pengimbas kod bar. Komponen luaran boleh disambungkan pada kedua-dua bahagian pelayan 1C:Enterprise dan pada bahagian klien (termasuk, tetapi tidak terhad kepada, klien web, serta versi seterusnya platform mudah alih 1C:Perusahaan). Teknologi komponen luaran menyediakan antara muka perisian (C++) yang agak mudah dan mudah difahami untuk interaksi komponen dengan platform 1C:Enterprise, yang mesti dilaksanakan oleh pembangun.

Kemungkinan yang terbuka apabila menggunakan komponen luaran sangat luas. Anda boleh melaksanakan interaksi menggunakan protokol pertukaran data khusus dengan peranti dan sistem luaran, membina algoritma khusus untuk memproses data dan format data, dsb.

Mekanisme penyepaduan yang lapuk

Platform ini menyediakan mekanisme penyepaduan yang tidak disyorkan untuk digunakan dalam penyelesaian baharu; mereka dibiarkan atas sebab keserasian ke belakang, dan juga sekiranya pihak lain tidak dapat bekerja dengan protokol yang lebih moden. Salah satunya bekerja dengan fail format DBF (disokong dalam bahasa terbina dalam menggunakan objek XBase).

Satu lagi mekanisme integrasi warisan ialah penggunaan teknologi COM (hanya tersedia pada platform Windows). Platform 1C:Enterprise menyediakan dua kaedah penyepaduan untuk Windows menggunakan teknologi COM: Pelayan automasi dan sambungan Luaran. Mereka sangat serupa, tetapi salah satu perbezaan asas ialah dalam kes pelayan Automasi, aplikasi pelanggan 1C:Enterprise 8 sepenuhnya dilancarkan, dan dalam kes sambungan luaran, COM dalam proses yang agak kecil. pelayan dilancarkan. Iaitu, jika anda bekerja melalui pelayan Automasi, anda boleh menggunakan kefungsian aplikasi klien dan melakukan tindakan yang serupa dengan tindakan interaktif pengguna. Apabila menggunakan sambungan luaran, anda hanya boleh menggunakan fungsi logik perniagaan, dan ia boleh dilaksanakan pada kedua-dua bahagian klien sambungan, di mana pelayan COM dalam proses dibuat dan anda boleh memanggil logik perniagaan pada pelayan 1C:Enterprise sebelah.

Teknologi COM juga boleh digunakan untuk mengakses sistem luaran daripada kod aplikasi pada platform 1C:Enterprise. Dalam kes ini, aplikasi 1C bertindak sebagai pelanggan COM. Tetapi harus diingat bahawa mekanisme ini hanya akan berfungsi jika pelayan 1C beroperasi dalam persekitaran Windows.

Mekanisme integrasi dilaksanakan dalam konfigurasi standard

Format Data Perusahaan

Kaedah penyepaduan dengan 1C
Dalam beberapa konfigurasi 1C (senarai di bawah), berdasarkan mekanisme pertukaran data platform yang diterangkan di atas, mekanisme siap sedia untuk menukar data dengan aplikasi luaran dilaksanakan, yang tidak memerlukan perubahan kod sumber konfigurasi (persediaan untuk data pertukaran dilakukan dalam tetapan penyelesaian aplikasi):

  • "1C:ERP Enterprise Management 2.0"
  • "Automasi kompleks 2"
  • "Perakaunan Perusahaan", edisi 3.0
  • "Perakaunan untuk perusahaan CORP", edisi 3.0
  • "Runcit", edisi 2.0
  • "Pengurusan Perdagangan Asas", edisi 11
  • Pengurusan Perdagangan, Edisi 11
  • “Gaji dan pengurusan kakitangan CORP”, edisi 3

Format yang digunakan untuk pertukaran data ialah EnterpriseData, berdasarkan XML. Formatnya berorientasikan perniagaan - struktur data yang diterangkan di dalamnya sepadan dengan entiti perniagaan (dokumen dan elemen direktori) yang dibentangkan dalam program 1C, contohnya: tindakan penyiapan, pesanan resit tunai, rakan niaga, item, dsb.

Pertukaran data antara aplikasi 1C dan aplikasi pihak ketiga boleh berlaku:

  • melalui direktori fail khusus
  • melalui direktori FTP
  • melalui perkhidmatan web yang digunakan pada bahagian aplikasi 1C. Fail data dihantar sebagai parameter kepada kaedah web
  • melalui e-mail

Dalam kes pertukaran melalui perkhidmatan web, aplikasi pihak ketiga akan memulakan sesi pertukaran data dengan memanggil kaedah web yang sepadan bagi aplikasi 1C. Dalam kes lain, pemula sesi pertukaran akan menjadi aplikasi 1C (dengan meletakkan fail data dalam direktori yang sesuai atau menghantar fail data ke alamat e-mel yang dikonfigurasikan).
Juga pada bahagian 1C anda boleh mengkonfigurasi kekerapan penyegerakan akan berlaku (untuk pilihan dengan pertukaran fail melalui direktori dan e-mel):

  • mengikut jadual (dengan kekerapan yang ditetapkan)
  • secara manual; pengguna perlu memulakan penyegerakan secara manual setiap kali dia memerlukannya

Mengiktiraf mesej

Aplikasi 1C menyimpan rekod mesej penyegerakan yang dihantar dan diterima dan mengharapkan perkara yang sama daripada aplikasi pihak ketiga. Ini membolehkan anda menggunakan mekanisme penomboran mesej yang diterangkan di atas dalam bahagian "Mekanisme pertukaran data".

Semasa penyegerakan, aplikasi 1C hanya menghantar maklumat tentang perubahan yang telah berlaku dengan entiti perniagaan sejak penyegerakan terakhir (untuk meminimumkan jumlah maklumat yang dipindahkan). Semasa penyegerakan pertama, aplikasi 1C akan memuat naik semua entiti perniagaan (contohnya, item buku rujukan item) dalam format EnterpriseData ke dalam fail XML (kerana semuanya "baru" untuk aplikasi luaran). Aplikasi pihak ketiga mesti memproses maklumat daripada fail XML yang diterima daripada 1C dan, semasa sesi penyegerakan seterusnya, letakkan dalam fail yang dihantar ke 1C, dalam bahagian XML khas, maklumat bahawa mesej daripada 1C dengan nombor tertentu berjaya menerima. Mesej resit adalah isyarat kepada aplikasi 1C bahawa semua entiti perniagaan telah berjaya diproses oleh aplikasi luar dan tidak perlu lagi menghantar maklumat mengenainya. Sebagai tambahan kepada resit, fail XML daripada aplikasi pihak ketiga juga boleh mengandungi data untuk penyegerakan oleh aplikasi (contohnya, dokumen untuk penjualan barangan dan perkhidmatan).

Selepas menerima mesej resit, aplikasi 1C menandakan semua perubahan yang dihantar dalam mesej sebelumnya sebagai berjaya disegerakkan. Hanya perubahan yang tidak disegerakkan kepada entiti perniagaan (membuat entiti baharu, menukar dan memadamkan entiti sedia ada) akan dihantar ke aplikasi luaran semasa sesi penyegerakan seterusnya.

Kaedah penyepaduan dengan 1C
Apabila memindahkan data daripada aplikasi luaran ke aplikasi 1C, gambar diterbalikkan. Aplikasi luaran mesti mengisi bahagian penerimaan fail XML dengan sewajarnya dan meletakkan data perniagaan untuk penyegerakan pada bahagiannya dalam format EnterpriseData.

Kaedah penyepaduan dengan 1C

Pertukaran data dipermudahkan tanpa berjabat tangan

Untuk kes penyepaduan mudah, apabila cukup untuk hanya memindahkan maklumat daripada aplikasi pihak ketiga kepada aplikasi 1C dan pemindahan balik data daripada aplikasi 1C kepada aplikasi pihak ketiga tidak diperlukan (contohnya, penyepaduan dalam talian kedai yang memindahkan maklumat jualan ke 1C: Perakaunan), terdapat pilihan yang dipermudahkan untuk bekerja melalui perkhidmatan web (tanpa pengakuan), yang tidak memerlukan tetapan di sisi aplikasi 1C.

Penyelesaian penyepaduan tersuai

Terdapat penyelesaian standard "1C: Penukaran Data", yang menggunakan mekanisme platform untuk menukar dan menukar data antara konfigurasi 1C standard, tetapi juga boleh digunakan untuk penyepaduan dengan aplikasi pihak ketiga.

Integrasi dengan penyelesaian perbankan

Standard "Bank Pelanggan", yang dibangunkan oleh pakar 1C lebih 10 tahun yang lalu, sebenarnya telah menjadi standard industri di Rusia. Langkah seterusnya ke arah ini ialah teknologi DirectBank, yang membolehkan anda menghantar dokumen pembayaran kepada bank dan menerima penyata daripada bank terus daripada program sistem 1C:Enterprise dengan menekan satu butang dalam program 1C; ia tidak memerlukan memasang dan menjalankan program tambahan pada komputer klien.

Terdapat juga standard untuk pertukaran data dalam projek gaji.

Lain-lain

Patut disebut protokol pertukaran antara sistem 1C:Enterprise dan laman web, standard pertukaran maklumat komersial CommerceML (dibangunkan bersama dengan Microsoft, Intel, Price.ru dan syarikat lain), standard untuk pertukaran data untuk memperoleh transaksi.

Sumber: www.habr.com

Tambah komen