我决定发布用于1C:Enterprise配置格式的C#源代码。
https://github.com/elisy/MdInternals
MdInternals理解cf,cfu,epf,erf格式,将内容解压缩为人类可读的Xml和文本文件,然后将其下载回去。 允许您以编程方式访问对象的内部文件和属性。
该项目包括以下部分:
- MdInternals以编程方式访问对象和配置属性
- CfProject负责序列化和反序列化MdInternals对象
- MdInternals.Cil反编译字节码(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);
识别的文件将按对象类型写入目录树。 无法识别被放置在Unresolved目录中:

识别的文件以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个十六进制数字:所有页面的总数据大小(FullSize),当前页面的大小(PageSize)和文件中下一页的地址(NextPageAddress)。 仅对页面链的第一页设置FullSize。 对于链的其余页面,此值为0。对于链的最后一页,NextPageAddress设置为0xFF 0xFF 0xFF 0x7F。
ImageRowPointers指针块是页面的PageSize值中指定的大小。 每个指针由HeaderAddress标头地址的4个字节和BodyAddress主体地址的4个字节组成。 每个指针的末尾是签名0xFF 0xFF 0xFF 0x7F。 地址指示ImageRows区域中当前页面内的位置。
ImageRowHeader标头以ImagePageHeader页标头块开头,该块报告为标头分配了多少字节。 接下来是20个保留字节,UTF-16数据标识符(Id)字符串和4个保留字节。
ImageRowBody主体以ImagePageHeader页面页眉块开头,该页块报告为数据主体分配了多少字节。 如果数据主体从0xEF 0xBB 0xBF(签名UTF8)开始,则主体包含一个UTF-8字符串。 否则,数据主体将包含打包数据。 如果解压缩的数据从0xFF 0xFF 0xFF 0x7F开始,则内容是一系列对象,并以CF格式写入。 否则,内容为序列化字符串。
未实施的内容
- 该实用程序仅识别第一级的配置对象,并将它们放置在子目录中。 无法识别其余内容:表单,布局,放置在Unresolved目录中
- 扩展名为img的复合对象不会在Unresolved目录中解压缩
- MdInternals识别数量有限的对象属性