قررت نشر شفرة المصدر C # للعمل مع تنسيق التكوين 1C: Enterprise.
https://github.com/elisy/MdInternals
تتفهم MdInternals التنسيق cf و cfu و epf و erf وتفريغ محتوياته في ملفات Xml وملفات نصية يمكن قراءتها من قبل الإنسان ، ويقوم بتنزيلها مرة أخرى. يتيح لك الوصول إلى الملفات الداخلية وخصائص الكائنات برمجياً.
يتكون المشروع من أجزاء:
- يصل MdInternals برمجياً إلى الكائنات وخصائص التكوين
- CfProject مسؤولة عن إجراء تسلسل وإلغاء تسلسل كائنات MdInternals
- MdInternals.Cil decompiles bytecode (OpCode) 1C
- يعمل MdInternals.Serialization مع التنسيق الداخلي شبه JSON 1C من النموذج "{19 {" "، 2}}"
قم بإفراغ ملفات cf و cfu و epf و erf إلى القرص
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);
تتم كتابة الملفات التي تم التعرف عليها إلى شجرة الدليل حسب نوع الكائن. يتم وضع غير المعترف بها في الدليل لم يتم حلها:

يتم تحميل الملفات المعترف بها في تنسيق XML. يسمح لك تنسيق XML بالتحكم في التكامل المنطقي للملفات ومعالجة الملفات مع برامج الجهات الخارجية. يتم نقل الخصائص المعروفة إلى الأقسام المناسبة (السمات أو العلامات) في بنية XML:

قراءة من جدول MSSQL
var image = ImageReader.ReadImageFromConfig(@"data source=192.168.1.2\SQL2005;user=login;pwd=password;database=Database1C");
الوصول إلى الملفات الداخلية
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();
إنشاء ملف من تنسيق XML الذي تم تنزيله
var project = new CfProject(); var mp = project.Load(@"D:\Config\Xml\Config.cfproj"); mp.Save(@"D:\config.cf");
وصف تنسيق CF
يتكون ملف cf من رأس صورة (ImageHeader) والصفحات التالية له (ImagePage1-ImagePageN). يتكون رأس الصورة من 4 بايتات للتوقيع ، تساوي 0xFF 0xFF 0xFF 0x7F و 4 بايت من حجم الصفحة و 8 بايت محجوزة. بعد رأس الملف هي صفحات البيانات بالترتيب. كل صفحة سابقة ترتبط إلى التالي.

تتكون كل صفحة (ImagePage) من عنوان صفحة (ImagePageHeader) ، ومجموعة من المؤشرات إلى ImageRowPointers ، ومنطقة ImageRows.

يحتوي رأس الصفحة ImagePageHeader على: محجوزة 2 بايت 0x0D 0x0A و 27 بايت من المعلومات النصية و 2 بايت المحجوزة 0x0D 0x0A. تحتوي المعلومات النصية على 3 أرقام ست عشرية: إجمالي حجم البيانات لجميع الصفحات (حجم كامل) ، وحجم الصفحة الحالية (حجم الصفحة) وعنوان الصفحة التالية في الملف (NextPageAddress). يتم تعيين FullSize فقط للصفحة الأولى من سلسلة الصفحات. بالنسبة للصفحات المتبقية من السلسلة ، هذه القيمة هي 0. بالنسبة إلى الصفحة الأخيرة من السلسلة ، يتم تعيين NextPageAddress على 0xFF 0xFF 0xFF 0x7F.
كتلة مؤشر ImageRowPointers هي الحجم المحدد في قيمة حجم الصفحة للصفحة. يتكون كل مؤشر من 4 بايتات من عنوان رأس HeaderAddress و 4 بايت من عنوان النص BodyAddress. في نهاية كل مؤشر هو التوقيع 0xFF 0xFF 0xFF 0x7F. تشير العناوين إلى المواقع داخل الصفحة الحالية في منطقة ImageRows.
يبدأ رأس ImageRowHeader بكتلة رأس صفحة ImagePageHeader ، والتي تُبلغ عن عدد البايتات المخصصة للرأس. فيما يلي 20 بايت محجوز وسلسلة معرف (معرف) UTF-16 و 4 بايت محجوزة.
يبدأ نص ImageRowBody مع كتلة رأس صفحة ImagePageHeader ، والتي تُبلغ عن عدد البايتات المخصصة لجسم البيانات. إذا بدأ نص البيانات في 0xEF 0xBB 0xBF (توقيع UTF8) ، فسيحتوي الجسم على سلسلة UTF-8. خلاف ذلك ، يحتوي نص البيانات على بيانات معبأة. إذا كانت البيانات التي تم فك حزمتها تبدأ من 0xFF 0xFF 0xFF 0x7F ، فإن المحتويات عبارة عن سلسلة من الكائنات ، وتتم كتابتها بتنسيق CF. خلاف ذلك ، فإن المحتوى هو سلسلة التسلسل.
ما لم ينفذ
- تتعرف الأداة المساعدة فقط على كائنات التكوين من المستوى الأول ، وتضعها في الدلائل الفرعية. لا يتعرف على الباقي: النماذج ، التخطيطات ، وضعها في الدليل غير محلول
- لا يتم فك حزم الكائنات المركبة ذات الامتداد img في الدليل Unresolved
- يتعرف MdInternals على عدد محدود من خصائص الكائن