Travailler avec un format de configurations 1C: Enterprise

J'ai décidé de publier le code source C # pour travailler avec le format de configuration 1C: Enterprise.


https://github.com/elisy/MdInternals


MdInternals comprend le format cf, cfu, epf, erf, décompresse le contenu en fichiers XML et texte lisibles par l'homme, et les télécharge à nouveau. Vous permet d'accéder par programme aux fichiers internes et aux propriétés des objets.


Le projet se compose de parties:

  • MdInternals accède par programme aux objets et aux propriétés de configuration
  • CfProject est responsable de la sérialisation et de la désérialisation des objets MdInternals
  • MdInternals.Cil décompile le bytecode (OpCode) 1C
  • MdInternals.Serialization fonctionne avec le format semi-JSON interne 1C de la forme "{19 {" ", 2}}"



Déchargez les fichiers cf, cfu, epf, erf sur le disque


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

Les fichiers reconnus sont écrits dans l'arborescence de répertoires par type d'objet. Les fichiers non reconnus sont placés dans le répertoire Unresolved:




Les fichiers reconnus sont téléchargés au format XML. Le format XML vous permet de contrôler l'intégrité logique des fichiers et de traiter les fichiers avec des programmes tiers. Les propriétés connues sont déplacées vers les sections appropriées (attributs ou balises) de la structure XML:





Lecture à partir d'une table MSSQL


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


Accès aux fichiers internes


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

Création d'un fichier à partir du format xml téléchargé


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

Description du format CF


Un fichier cf se compose d'un en-tête d'image (ImageHeader) et des pages qui le suivent (ImagePage1-ImagePageN). L'en-tête d'image se compose de 4 octets de la signature, ce qui est égal à 0xFF 0xFF 0xFF 0x7F, 4 octets de taille de page et 8 octets réservés. Après l'en-tête du fichier se trouvent les pages de données dans l'ordre. Chaque page précédente est liée à la suivante.





Chaque page (ImagePage) se compose d'un titre de page (ImagePageHeader), d'un groupe de pointeurs vers ImageRowPointers et d'une zone ImageRows.





L'en-tête de page ImagePageHeader contient: 2 octets réservés 0x0D 0x0A, 27 octets d'informations textuelles et 2 octets réservés 0x0D 0x0A. Les informations textuelles contiennent 3 nombres hexadécimaux: la taille totale des données de toutes les pages (FullSize), la taille de la page actuelle (PageSize) et l'adresse de la page suivante du fichier (NextPageAddress). FullSize n'est défini que pour la première page de la chaîne de pages. Pour les pages restantes de la chaîne, cette valeur est 0. Pour la dernière page de la chaîne, NextPageAddress est défini sur 0xFF 0xFF 0xFF 0x7F.


Le bloc de pointeur ImageRowPointers est la taille spécifiée dans la valeur PageSize de la page. Chaque pointeur se compose de 4 octets de l'adresse d'en-tête HeaderAddress et de 4 octets de l'adresse de corps BodyAddress. À la fin de chaque pointeur se trouve la signature 0xFF 0xFF 0xFF 0x7F. Les adresses indiquent les emplacements dans la page actuelle dans la zone ImageRows.


L'en-tête ImageRowHeader commence par le bloc d'en-tête de page ImagePageHeader, qui indique le nombre d'octets alloués à l'en-tête. Viennent ensuite 20 octets réservés, une chaîne d'identifiant de données (Id) UTF-16 et 4 octets réservés.


Le corps ImageRowBody commence par le bloc d'en-tête de page ImagePageHeader, qui indique le nombre d'octets alloués au corps de données. Si le corps de données commence à 0xEF 0xBB 0xBF (signature UTF8), alors le corps contient une chaîne UTF-8. Sinon, le corps de données contient des données compressées. Si les données décompressées commencent à 0xFF 0xFF 0xFF 0x7F, alors le contenu est une séquence d'objets et ils sont écrits au format CF. Sinon, le contenu est une chaîne de sérialisation.



Ce qui n'est pas mis en œuvre


  • L'utilitaire ne reconnaît que les objets de configuration du 1er niveau et les place dans des sous-répertoires. Ne reconnaît pas le reste: formulaires, mises en page, placement dans le répertoire non résolu
  • Les objets composites avec l'extension img ne sont pas décompressés dans le répertoire Unresolved
  • MdInternals reconnaît un nombre limité de propriétés d'objet

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


All Articles