用途:在没有 1C:Enterprise 平台的情况下读取和写入 1C 二进制产物。两条路线彼此独立:一是单个普通表单(обычная форма)Forms/<名称>/Ext/Form.bin,用 MCP 工具 unpack_ordinary_form / build_ordinary_form;二是整个 CF / CFE / EPF 二进制,用 v8unpack CLI 的 -E / -B。配置位于 infobase 时应改用平台提取,参见 getconfigfiles。
依赖:Python 包 v8unpack,安装命令 pip install "v8unpack>=1.2.6,<2",用 python -m v8unpack --help 验证。两个 MCP 服务器各自在 requirements 中声明该依赖;缺失时返回 status="error"、error_code="dependency_missing" 并在 hint 中给出安装命令。
普通表单:普通表单不是 XML。设计器文件导出中,受管表单写 Forms/<名称>/Ext/Form.xml,普通表单写 Forms/<名称>/Ext/Form.bin,这是含两个条目的 1C 容器:form(布局,括号树)和 module(表单模块,BSL)。旁车文件 Forms/<名称>.xml 通过 <FormType>Ordinary</FormType> 声明模型类型。可用 **/Forms/*/Ext/Form.bin 查找。
MCP 契约 ordinary-form/1:unpack_ordinary_form 参数 form_path、workspace_path、overwrite(默认 false)、include(默认 summary,可选 structure/module/all)、max_chars(默认 4000,服务器上限 20000);返回 status、contract、tool、workspace_path、manifest_path、source(path/size/sha256)、container、entries、notes、warnings 等。build_ordinary_form 参数 workspace_path、output_path、overwrite(默认 false)、verify(默认 true);返回 status、output、binary_identical、verified、verification(match/mismatch/skipped)、changed_entries 等。错误状态含 error_code 和可操作 hint。
工作区:ordinary-form.json 为清单(生成,勿手改);payload/form 与 payload/module 为真实来源(UTF-8 BOM + CRLF);decoded/ 为派生只读视图,每次解包重新生成,不回读;编辑派生视图再构建会被拒绝(derived_edit_detected)。
工作流:先解包,再编辑 payload/module 或 payload/form(保留 UTF-8 BOM 与 CRLF),然后构建并确认 verification.status == "match",最后按常规方式更新 infobase;该技能只写文件,不触碰 infobase。含空格或西里尔字符的路径始终加双引号。
限制与警告:Form.bin 是二进制 1C 容器,绝不能直接用文本/XML 工具编辑或读取,文本编辑器会静默损坏;其中条目不得 Deflate,1C:Enterprise 只按纯 UTF-8 BOM 文本读取,deflate 会导致「Ошибка формата потока」;不要用最终 SHA-256 判断往返,v8unpack 写入当前时间戳,重建文件字节必然不同,binary_identical: false 搭配 verification.status: "match" 属正常。独立 Form.bin 不携带元素名称,括号树是位置性的,不可据此臆造元素名、类型或处理器。Windows 上 CLI 使用 --processes 1,除非已针对该产物验证过并行。CLI 的 -B 重建并非产出可加载到当前配置的 .cf,实测在 8.3.27 上出现元数据退化(版本 3 描述符变回版本 2、标准属性损坏、对象从交换计划内容中脱落),配置只能通过平台(/LoadConfigFromFiles 或 /LoadCfg)写回。其他 CLI 限制:对象属性与表单布局以原始数组存在 header/raw;大于 1 MB 的文件(布局、HTML)以 .bin 保存而不解码;加密模块保持二进制;--auto_include 时嵌套对象按字母排序。普通表单实测(1C-Gitter 1.1.0.8、170 个表单产物、v8unpack 1.2.6):*.elem.json 对受管表单有内容、对普通表单为空;23/23 受管表单(Тип формы = 1)返回命名树,147/147 普通表单(Тип формы = 0)为空,因为两个版本都不在 FormCore.supported_form_versions(0-26、0-27、1)中。v8unpack 1.2.6 的 Container.build(nested=False) 无法写出带压缩条目的容器(抛 struct.error)。