Arbeiten Sie mit einem Konfigurationsformat 1C: Enterprise

Ich habe beschlossen, den C # -Quellcode für die Arbeit mit dem Konfigurationsformat 1C: Enterprise zu veröffentlichen.


https://github.com/elisy/MdInternals


MdInternals versteht das Format cf, cfu, epf, erf, entpackt den Inhalt in lesbare XML- und Textdateien und lädt ihn zurück. Ermöglicht den programmgesteuerten Zugriff auf interne Dateien und Eigenschaften von Objekten.


Das Projekt besteht aus Teilen:

  • MdInternals greift programmgesteuert auf Objekte und Konfigurationseigenschaften zu
  • CfProject ist für die Serialisierung und Deserialisierung von MdInternals-Objekten verantwortlich
  • MdInternals.Cil dekompiliert den Bytecode (OpCode) 1C
  • MdInternals.Serialization funktioniert mit dem internen Semi-JSON-Format 1C der Form "{19 {" ", 2}}"



Entladen Sie die Dateien cf, cfu, epf, erf auf die Festplatte


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); 

Erkannte Dateien werden nach Objekttyp in den Verzeichnisbaum geschrieben. Nicht erkannte werden im nicht aufgelösten Verzeichnis abgelegt:




Erkannte Dateien werden im XML-Format hochgeladen. Mit dem XML-Format können Sie die logische Integrität von Dateien steuern und Dateien mit Programmen von Drittanbietern verarbeiten. Bekannte Eigenschaften werden in die entsprechenden Abschnitte (Attribute oder Tags) der XML-Struktur verschoben:





Lesen aus einer MSSQL-Tabelle


 var image = ImageReader.ReadImageFromConfig(@"data source=192.168.1.2\SQL2005;user=login;pwd=password;database=Database1C"); 


Zugriff auf interne Dateien


 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(); 

Erstellen einer Datei aus dem heruntergeladenen XML-Format


 var project = new CfProject(); var mp = project.Load(@"D:\Config\Xml\Config.cfproj"); mp.Save(@"D:\config.cf"); 

Beschreibung des CF-Formats


Eine CF-Datei besteht aus einem Bildheader (ImageHeader) und den darauf folgenden Seiten (ImagePage1-ImagePageN). Der Bildheader besteht aus 4 Bytes der Signatur, was 0xFF 0xFF 0xFF 0x7F, 4 Bytes Seitengröße und 8 reservierten Bytes entspricht. Nach dem Dateikopf sind die Datenseiten in der richtigen Reihenfolge. Jede vorherige Seite verlinkt auf die nächste.





Jede Seite (ImagePage) besteht aus einem Seitentitel (ImagePageHeader), einer Gruppe von Zeigern auf ImageRowPointers und einem ImageRows-Bereich.





Der ImagePageHeader-Seitenkopf enthält: reservierte 2 Bytes 0x0D 0x0A, 27 Bytes Textinformationen und 2 reservierte Bytes 0x0D 0x0A. Die Textinformationen enthalten 3 Hexadezimalzahlen: die Gesamtdatengröße aller Seiten (FullSize), die Größe der aktuellen Seite (PageSize) und die Adresse der nächsten Seite in der Datei (NextPageAddress). FullSize wird nur für die erste Seite der Seitenkette festgelegt. Für die verbleibenden Seiten der Kette ist dieser Wert 0. Für die letzte Seite der Kette wird NextPageAddress auf 0xFF 0xFF 0xFF 0x7F gesetzt.


Der ImageRowPointers-Zeigerblock hat die Größe, die im PageSize-Wert der Seite angegeben ist. Jeder Zeiger besteht aus 4 Bytes der HeaderAddress-Headeradresse und 4 Bytes der BodyAddress-Bodyadresse. Am Ende jedes Zeigers befindet sich die Signatur 0xFF 0xFF 0xFF 0x7F. Adressen geben Positionen auf der aktuellen Seite im Bereich ImageRows an.


Der ImageRowHeader-Header beginnt mit dem ImagePageHeader-Seitenkopfblock, der angibt, wie viele Bytes dem Header zugewiesen sind. Als nächstes folgen 20 reservierte Bytes, eine UTF-16-Datenkennung (Id) und 4 reservierte Bytes.


Der ImageRowBody-Body beginnt mit dem ImagePageHeader-Seitenkopfblock, der angibt, wie viele Bytes dem Datenkörper zugewiesen sind. Wenn der Datenkörper bei 0xEF 0xBB 0xBF (Signatur UTF8) beginnt, enthält der Körper eine UTF-8-Zeichenfolge. Andernfalls enthält der Datenkörper gepackte Daten. Wenn die entpackten Daten bei 0xFF 0xFF 0xFF 0x7F beginnen, ist der Inhalt eine Folge von Objekten und wird im CF-Format geschrieben. Andernfalls ist der Inhalt eine Serialisierungszeichenfolge.



Was ist nicht implementiert


  • Das Dienstprogramm erkennt nur Konfigurationsobjekte der 1. Ebene und platziert sie in Unterverzeichnissen. Erkennt den Rest nicht: Formulare, Layouts, Platzierung im nicht aufgelösten Verzeichnis
  • Zusammengesetzte Objekte mit der Erweiterung img werden nicht im Verzeichnis Ungelöst entpackt
  • MdInternals erkennt eine begrenzte Anzahl von Objekteigenschaften

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


All Articles