fix(form-compile): throw on known invalid attribute types

KNOWN_INVALID_TYPES (FormDataStructure, FormDataCollection, FormDataTree,
etc.) was checked but only produced a Write-Warning/print warning — the
script still emitted the bad <v8:Type> 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) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-04-11 22:03:24 +03:00
parent 0b2c09f8d9
commit e3069ceb36
6 changed files with 10 additions and 13 deletions
@@ -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 # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param( param(
[Parameter(Mandatory)] [Parameter(Mandatory)]
@@ -260,14 +260,12 @@ function Emit-SingleType {
# Fallback with validation # Fallback with validation
if ($script:knownInvalidTypes.ContainsKey($typeStr)) { if ($script:knownInvalidTypes.ContainsKey($typeStr)) {
Write-Warning "Type '$typeStr': $($script:knownInvalidTypes[$typeStr])" throw "Invalid form attribute type '$typeStr': $($script:knownInvalidTypes[$typeStr])"
} }
if ($typeStr.Contains('.')) { if ($typeStr.Contains('.')) {
X "$indent<v8:Type>cfg:$typeStr</v8:Type>" X "$indent<v8:Type>cfg:$typeStr</v8:Type>"
} else { } 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<v8:Type>$typeStr</v8:Type>" X "$indent<v8:Type>$typeStr</v8:Type>"
} }
} }
@@ -1,5 +1,5 @@
#!/usr/bin/env python3 #!/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 # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse import argparse
import json import json
@@ -330,12 +330,11 @@ def emit_single_type(lines, type_str, indent):
# Fallback with validation # Fallback with validation
if type_str in KNOWN_INVALID_TYPES: 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: if '.' in type_str:
lines.append(f'{indent}<v8:Type>cfg:{type_str}</v8:Type>') lines.append(f'{indent}<v8:Type>cfg:{type_str}</v8:Type>')
else: 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}<v8:Type>{type_str}</v8:Type>') lines.append(f'{indent}<v8:Type>{type_str}</v8:Type>')
@@ -16,7 +16,7 @@
"input": { "input": {
"title": "Товар", "title": "Товар",
"attributes": [ "attributes": [
{ "name": "Объект", "type": "FormDataStructure", "main": true } { "name": "Объект", "type": "CatalogObject.Товары", "main": true }
], ],
"elements": [ "elements": [
{ "input": "Наименование", "path": "Объект.Наименование", "title": "Наименование" }, { "input": "Наименование", "path": "Объект.Наименование", "title": "Наименование" },
@@ -37,7 +37,7 @@
<Attributes> <Attributes>
<Attribute name="Объект" id="7"> <Attribute name="Объект" id="7">
<Type> <Type>
<v8:Type>FormDataStructure</v8:Type> <v8:Type>cfg:CatalogObject.Товары</v8:Type>
</Type> </Type>
<MainAttribute>true</MainAttribute> <MainAttribute>true</MainAttribute>
</Attribute> </Attribute>
+1 -1
View File
@@ -12,7 +12,7 @@
}, },
{ {
"script": "form-compile/scripts/form-compile", "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" } "args": { "-JsonPath": "{inputFile}", "-OutputPath": "{workDir}/Catalogs/Товары/Forms/Форма/Ext/Form.xml" }
} }
], ],
@@ -15,7 +15,7 @@
<Attributes> <Attributes>
<Attribute name="Объект" id="1"> <Attribute name="Объект" id="1">
<Type> <Type>
<v8:Type>FormDataStructure</v8:Type> <v8:Type>cfg:CatalogObject.Товары</v8:Type>
</Type> </Type>
<MainAttribute>true</MainAttribute> <MainAttribute>true</MainAttribute>
</Attribute> </Attribute>