Trabalhar com um formato de configurações 1C: Enterprise

Decidi publicar o código-fonte C # para trabalhar com o formato de configuração 1C: Enterprise.


https://github.com/elisy/MdInternals


O MdInternals entende o formato cf, cfu, epf, erf, descompacta o conteúdo em arquivos XML e de texto legíveis por humanos e os baixa novamente. Permite acessar programaticamente arquivos internos e propriedades de objetos.


O projeto consiste em partes:

  • MdInternals programaticamente acessa objetos e propriedades de configuração
  • O CfProject é responsável por serializar e desserializar objetos MdInternals
  • MdInternals.Cil descompila o bytecode (OpCode) 1C
  • MdInternals.Serialization funciona com o formato semi-JSON interno 1C do formato "{19 {" ", 2}}"



Descarregar arquivos cf, cfu, epf, erf no disco


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

Os arquivos reconhecidos são gravados na árvore de diretórios por tipo de objeto. Não reconhecidos são colocados no diretório Não Resolvido:




Os arquivos reconhecidos são carregados no formato XML. O formato XML permite controlar a integridade lógica de arquivos e processar arquivos com programas de terceiros. As propriedades conhecidas são movidas para as seções apropriadas (atributos ou tags) da estrutura XML:





Lendo de uma tabela MSSQL


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


Acessando arquivos internos


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

Criando um arquivo a partir do formato xml baixado


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

Descrição do formato CF


Um arquivo cf consiste em um cabeçalho de imagem (ImageHeader) e nas páginas seguintes (ImagePage1-ImagePageN). O cabeçalho da imagem consiste em 4 bytes da assinatura, que é igual a 0xFF 0xFF 0xFF 0x7F, 4 bytes de tamanho de página e 8 bytes reservados. Após o cabeçalho do arquivo, as páginas de dados estão em ordem. Cada página anterior é vinculada à próxima.





Cada página (ImagePage) consiste em um título de página (ImagePageHeader), um grupo de ponteiros para ImageRowPointers e uma área ImageRows.





O cabeçalho da página ImagePageHeader contém: 2 bytes reservados 0x0D 0x0A, 27 bytes de informações em texto e 2 bytes reservados 0x0D 0x0A. As informações de texto contêm três números hexadecimais: o tamanho total dos dados de todas as páginas (FullSize), o tamanho da página atual (PageSize) e o endereço da próxima página no arquivo (NextPageAddress). FullSize é definido apenas para a primeira página da cadeia de páginas. Para as páginas restantes da cadeia, esse valor é 0. Para a última página da cadeia, NextPageAddress está definido como 0xFF 0xFF 0xFF 0x7F.


O bloco de ponteiro ImageRowPointers é o tamanho especificado no valor PageSize da página. Cada ponteiro consiste em 4 bytes do endereço do cabeçalho HeaderAddress e em 4 bytes do endereço do corpo BodyAddress. No final de cada ponteiro está a assinatura 0xFF 0xFF 0xFF 0x7F. Os endereços indicam locais na página atual na área ImageRows.


O cabeçalho ImageRowHeader começa com o bloco de cabeçalho da página ImagePageHeader, que informa quantos bytes estão alocados para o cabeçalho. A seguir, são apresentados 20 bytes reservados, a cadeia de caracteres UTF-16 identificador de dados (Id) e 4 bytes reservados.


O corpo ImageRowBody começa com o bloco de cabeçalho da página ImagePageHeader, que informa quantos bytes estão alocados para o corpo dos dados. Se o corpo dos dados iniciar em 0xEF 0xBB 0xBF (assinatura UTF8), o corpo conterá uma sequência UTF-8. Caso contrário, o corpo de dados contém dados compactados. Se os dados descompactados começarem em 0xFF 0xFF 0xFF 0x7F, o conteúdo será uma sequência de objetos e eles serão gravados no formato CF. Caso contrário, o conteúdo é uma sequência de serialização.



O que não está implementado


  • O utilitário reconhece apenas objetos de configuração do 1º nível, colocando-os em subdiretórios. Não reconhece o restante: formulários, layouts, colocação no diretório não resolvido
  • Objetos compostos com a extensão img não são descompactados no diretório Não Resolvido
  • MdInternals reconhece um número limitado de propriedades do objeto

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


All Articles