From e3069ceb36c23b4f57149d7ace85e876adb3c630 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sat, 11 Apr 2026 22:03:24 +0300 Subject: [PATCH] fix(form-compile): throw on known invalid attribute types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit KNOWN_INVALID_TYPES (FormDataStructure, FormDataCollection, FormDataTree, etc.) was checked but only produced a Write-Warning/print warning — the script still emitted the bad into Form.xml, which XDTO later rejected with a cryptic load-time error. Turn the warning into a hard throw so misuse is caught at compile time with the correct hint. Reveals two broken test cases that shipped invalid forms: - form-compile/catalog-form: main attribute was FormDataStructure, fixed to CatalogObject.Товары (what ERP's reference catalog forms actually use with the cfg: prefix). - form-info/overview: preRun form-compile used the same wrong type, fixed the same way; snapshot regenerated. Bumps form-compile to v1.4 on both runtimes. Co-Authored-By: Claude Opus 4.6 (1M context) --- .claude/skills/form-compile/scripts/form-compile.ps1 | 8 +++----- .claude/skills/form-compile/scripts/form-compile.py | 7 +++---- tests/skills/cases/form-compile/catalog-form.json | 2 +- .../Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form.xml | 2 +- tests/skills/cases/form-info/overview.json | 2 +- .../overview/Catalogs/Товары/Forms/Форма/Ext/Form.xml | 2 +- 6 files changed, 10 insertions(+), 13 deletions(-) diff --git a/.claude/skills/form-compile/scripts/form-compile.ps1 b/.claude/skills/form-compile/scripts/form-compile.ps1 index dbb4c6a1..149ed46f 100644 --- a/.claude/skills/form-compile/scripts/form-compile.ps1 +++ b/.claude/skills/form-compile/scripts/form-compile.ps1 @@ -1,4 +1,4 @@ -# form-compile v1.3 — Compile 1C managed form from JSON +# form-compile v1.4 — Compile 1C managed form from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -260,14 +260,12 @@ function Emit-SingleType { # Fallback with validation if ($script:knownInvalidTypes.ContainsKey($typeStr)) { - Write-Warning "Type '$typeStr': $($script:knownInvalidTypes[$typeStr])" + throw "Invalid form attribute type '$typeStr': $($script:knownInvalidTypes[$typeStr])" } if ($typeStr.Contains('.')) { X "$indentcfg:$typeStr" } else { - if (-not $script:knownInvalidTypes.ContainsKey($typeStr)) { - Write-Warning "Unrecognized bare type '$typeStr' — will be emitted without namespace prefix" - } + Write-Warning "Unrecognized bare type '$typeStr' — will be emitted without namespace prefix" X "$indent$typeStr" } } diff --git a/.claude/skills/form-compile/scripts/form-compile.py b/.claude/skills/form-compile/scripts/form-compile.py index d5050bc0..16352658 100644 --- a/.claude/skills/form-compile/scripts/form-compile.py +++ b/.claude/skills/form-compile/scripts/form-compile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# form-compile v1.2 — Compile 1C managed form from JSON +# form-compile v1.4 — Compile 1C managed form from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import json @@ -330,12 +330,11 @@ def emit_single_type(lines, type_str, indent): # Fallback with validation if type_str in KNOWN_INVALID_TYPES: - print(f"WARNING: Type '{type_str}': {KNOWN_INVALID_TYPES[type_str]}", file=sys.stderr) + raise ValueError(f"Invalid form attribute type '{type_str}': {KNOWN_INVALID_TYPES[type_str]}") if '.' in type_str: lines.append(f'{indent}cfg:{type_str}') else: - if type_str not in KNOWN_INVALID_TYPES: - print(f"WARNING: Unrecognized bare type '{type_str}' — will be emitted without namespace prefix", file=sys.stderr) + print(f"WARNING: Unrecognized bare type '{type_str}' — will be emitted without namespace prefix", file=sys.stderr) lines.append(f'{indent}{type_str}') diff --git a/tests/skills/cases/form-compile/catalog-form.json b/tests/skills/cases/form-compile/catalog-form.json index 4fb48196..00531c04 100644 --- a/tests/skills/cases/form-compile/catalog-form.json +++ b/tests/skills/cases/form-compile/catalog-form.json @@ -16,7 +16,7 @@ "input": { "title": "Товар", "attributes": [ - { "name": "Объект", "type": "FormDataStructure", "main": true } + { "name": "Объект", "type": "CatalogObject.Товары", "main": true } ], "elements": [ { "input": "Наименование", "path": "Объект.Наименование", "title": "Наименование" }, diff --git a/tests/skills/cases/form-compile/snapshots/catalog-form/Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form.xml b/tests/skills/cases/form-compile/snapshots/catalog-form/Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form.xml index 2b323b2c..c170746a 100644 --- a/tests/skills/cases/form-compile/snapshots/catalog-form/Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form.xml +++ b/tests/skills/cases/form-compile/snapshots/catalog-form/Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form.xml @@ -37,7 +37,7 @@ - FormDataStructure + cfg:CatalogObject.Товары true diff --git a/tests/skills/cases/form-info/overview.json b/tests/skills/cases/form-info/overview.json index 533a777e..98f4b92f 100644 --- a/tests/skills/cases/form-info/overview.json +++ b/tests/skills/cases/form-info/overview.json @@ -12,7 +12,7 @@ }, { "script": "form-compile/scripts/form-compile", - "input": { "title": "Тест", "attributes": [{ "name": "Объект", "type": "FormDataStructure", "main": true }], "elements": [{ "type": "InputField", "dataPath": "Объект.Наименование" }] }, + "input": { "title": "Тест", "attributes": [{ "name": "Объект", "type": "CatalogObject.Товары", "main": true }], "elements": [{ "type": "InputField", "dataPath": "Объект.Наименование" }] }, "args": { "-JsonPath": "{inputFile}", "-OutputPath": "{workDir}/Catalogs/Товары/Forms/Форма/Ext/Form.xml" } } ], diff --git a/tests/skills/cases/form-info/snapshots/overview/Catalogs/Товары/Forms/Форма/Ext/Form.xml b/tests/skills/cases/form-info/snapshots/overview/Catalogs/Товары/Forms/Форма/Ext/Form.xml index 57d6247e..2472f091 100644 --- a/tests/skills/cases/form-info/snapshots/overview/Catalogs/Товары/Forms/Форма/Ext/Form.xml +++ b/tests/skills/cases/form-info/snapshots/overview/Catalogs/Товары/Forms/Форма/Ext/Form.xml @@ -15,7 +15,7 @@ - FormDataStructure + cfg:CatalogObject.Товары true