Saya memutuskan untuk menerbitkan kode sumber C # untuk bekerja dengan 1C: format konfigurasi Enterprise.
https://github.com/elisy/MdInternals
MdInternals memahami format cf, cfu, epf, erf, membongkar isinya ke dalam file teks dan Xml yang dapat dibaca manusia, dan mengunduhnya kembali. Memungkinkan Anda mengakses file internal dan properti objek secara terprogram.
Proyek ini terdiri dari bagian-bagian:
- MdInternals secara terprogram mengakses objek dan properti konfigurasi
- CfProject bertanggung jawab atas serialisasi dan deserialisasi objek MdInternals
- MdInternals.Cil mendekompilasi bytecode (OpCode) 1C
- MdInternals.Serialisasi bekerja dengan format semi-JSON internal 1C dari bentuk "{19 {" ", 2}}"
Bongkar cf, cfu, epf, erf file ke disk
var cf = new CfPackage(); // var cf = new EpfPackage(); // var cf = new ErfPackage(); // var cf = new CfuPackage(); cf.Open(@"D:\config.cf"); var project = new CfProject(); project.Save(epf, @"D:\Config\Xml\Config.cfproj", ProjectType.Xml);
File yang dikenali ditulis ke pohon direktori berdasarkan jenis objek. Tidak dikenal ditempatkan di direktori yang belum terselesaikan:

File yang dikenal diunggah dalam format XML. Format XML memungkinkan Anda untuk mengontrol integritas logis file dan memproses file dengan program pihak ketiga. Properti yang dikenal dipindahkan ke bagian yang sesuai (atribut atau tag) dari struktur XML:

Membaca dari tabel MSSQL
var image = ImageReader.ReadImageFromConfig(@"data source=192.168.1.2\SQL2005;user=login;pwd=password;database=Database1C");
Mengakses File Internal
var mp = new EpfPackage(); mp.Open(file); var root = mp.MetadataObjects.Where(m => m.ImageRow.FileName == "root").FirstOrDefault(); var rp = new RootPointer(root.ImageRow); var part = mp.MetadataObjects.Where(m => m.ImageRow.FileName == rp.MetadataPackageFileName.ToString()).FirstOrDefault();
Membuat file dari format xml yang diunduh
var project = new CfProject(); var mp = project.Load(@"D:\Config\Xml\Config.cfproj"); mp.Save(@"D:\config.cf");
Deskripsi Format CF
File cf terdiri dari header gambar (ImageHeader) dan halaman yang mengikutinya (ImagePage1-ImagePageN). Header gambar terdiri dari 4 byte tanda tangan, yang sama dengan 0xFF 0xFF 0xFF 0x7F, 4 byte ukuran halaman dan 8 byte dicadangkan. Setelah header file adalah halaman data dalam urutan. Setiap halaman sebelumnya terhubung ke halaman berikutnya.

Setiap halaman (ImagePage) terdiri dari judul halaman (ImagePageHeader), sekelompok pointer ke ImageRowPointers, dan area ImageRows.

Header halaman ImagePageHeader berisi: dicadangkan 2 byte 0x0D 0x0A, 27 byte informasi tekstual dan 2 byte dicadangkan 0x0D 0x0A. Informasi teks berisi 3 angka heksadesimal: ukuran data total semua halaman (Ukuran Penuh), ukuran halaman saat ini (Ukuran Halaman) dan alamat halaman berikutnya dalam file (NextPageAddress). FullSize diatur hanya untuk halaman pertama dari rantai halaman. Untuk halaman rantai yang tersisa, nilai ini adalah 0. Untuk halaman terakhir rantai, NextPageAddress diatur ke 0xFF 0xFF 0xFF 0xFF 0x7F.
Blok penunjuk ImageRowPointers adalah ukuran yang ditentukan dalam nilai PageSize dari halaman. Setiap pointer terdiri dari 4 byte alamat header HeaderAddress dan 4 byte alamat tubuh BodyAddress. Di akhir setiap pointer adalah tanda tangan 0xFF 0xFF 0xFF 0x7F. Alamat menunjukkan lokasi dalam halaman saat ini di area ImageRows.
Header ImageRowHeader dimulai dengan blok header halaman ImagePageHeader, yang melaporkan berapa banyak byte yang dialokasikan untuk header. Berikutnya adalah 20 byte yang dipesan, string UTF-16 data identifier (Id) dan 4 byte yang dipesan.
Tubuh ImageRowBody dimulai dengan blok header halaman ImagePageHeader, yang melaporkan berapa byte yang dialokasikan untuk badan data. Jika badan data dimulai pada 0xEF 0xBB 0xBF (tanda tangan UTF8), maka tubuh berisi string UTF-8. Jika tidak, badan data berisi data yang dikemas. Jika data yang dibuka paket dimulai pada 0xFF 0xFF 0xFF 0x7F, maka isinya adalah urutan objek, dan mereka ditulis dalam format CF. Kalau tidak, konten adalah string serialisasi.
Apa yang tidak diimplementasikan
- Utilitas hanya mengenali objek konfigurasi tingkat 1, menempatkannya di subdirektori. Tidak mengenali sisanya: formulir, tata letak, menempatkan di direktori yang belum terselesaikan
- Objek komposit dengan img ekstensi tidak dibongkar di direktori Unresolved
- MdInternals mengenali sejumlah properti objek yang terbatas