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