mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-03 00:30:52 +03:00
fix(form-compile,form-validate): warn on invalid XDTO types, add Check 12
form-compile now warns when model uses runtime types like FormDataStructure that don't exist in XML schema. Expanded cfg: regex to cover all 25 known prefixes. form-validate adds Check 12 — validates all <v8:Type> values: ERROR for known-invalid types, WARN for unrecognized bare types, pass-through for unknown namespaced types (future-proof). Updated SKILL.md with full type reference and invalid type warning. Updated docs/1c-form-spec.md with missing type groups. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
ff068202e3
commit
dd88f78969
@@ -1,4 +1,4 @@
|
||||
# form-compile v1.0 — Compile 1C managed form from JSON
|
||||
# form-compile v1.1 — Compile 1C managed form from JSON
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
param(
|
||||
[Parameter(Mandatory)]
|
||||
@@ -80,6 +80,20 @@ $script:formTypeSynonyms["бизнеспроцессссылка"] = "
|
||||
$script:formTypeSynonyms["задачассылка"] = "TaskRef"
|
||||
$script:formTypeSynonyms["определяемыйтип"] = "DefinedType"
|
||||
|
||||
# Known invalid types (runtime/UI types that don't exist in XDTO schema)
|
||||
$script:knownInvalidTypes = @{
|
||||
"FormDataStructure" = "Runtime type. Use cfg:*Object.XXX (e.g. CatalogObject.XXX)"
|
||||
"FormDataCollection" = "Runtime type. Use ValueTable"
|
||||
"FormDataTree" = "Runtime type. Use ValueTree"
|
||||
"FormDataTreeItem" = "Runtime type, not valid in XML"
|
||||
"FormDataCollectionItem"= "Runtime type, not valid in XML"
|
||||
"FormGroup" = "UI element type, not a data type"
|
||||
"FormField" = "UI element type, not a data type"
|
||||
"FormButton" = "UI element type, not a data type"
|
||||
"FormDecoration" = "UI element type, not a data type"
|
||||
"FormTable" = "UI element type, not a data type"
|
||||
}
|
||||
|
||||
function Resolve-TypeStr {
|
||||
param([string]$typeStr)
|
||||
if (-not $typeStr) { return $typeStr }
|
||||
@@ -219,15 +233,21 @@ function Emit-SingleType {
|
||||
}
|
||||
|
||||
# cfg: references (CatalogRef.XXX, DocumentObject.XXX, etc.)
|
||||
if ($typeStr -match '^(CatalogRef|CatalogObject|DocumentRef|DocumentObject|EnumRef|ChartOfAccountsRef|ChartOfCharacteristicTypesRef|ChartOfCalculationTypesRef|ExchangePlanRef|BusinessProcessRef|TaskRef|InformationRegisterRecordSet|AccumulationRegisterRecordSet|DataProcessorObject)\.') {
|
||||
if ($typeStr -match '^(CatalogRef|CatalogObject|DocumentRef|DocumentObject|EnumRef|ChartOfAccountsRef|ChartOfAccountsObject|ChartOfCharacteristicTypesRef|ChartOfCharacteristicTypesObject|ChartOfCalculationTypesRef|ChartOfCalculationTypesObject|ExchangePlanRef|ExchangePlanObject|BusinessProcessRef|BusinessProcessObject|TaskRef|TaskObject|InformationRegisterRecordSet|InformationRegisterRecordManager|AccumulationRegisterRecordSet|AccountingRegisterRecordSet|ConstantsSet|DataProcessorObject|ReportObject)\.') {
|
||||
X "$indent<v8:Type>cfg:$typeStr</v8:Type>"
|
||||
return
|
||||
}
|
||||
|
||||
# Fallback: emit as-is with cfg: prefix if contains dot, otherwise v8:
|
||||
# Fallback with validation
|
||||
if ($script:knownInvalidTypes.ContainsKey($typeStr)) {
|
||||
Write-Warning "Type '$typeStr': $($script:knownInvalidTypes[$typeStr])"
|
||||
}
|
||||
if ($typeStr.Contains('.')) {
|
||||
X "$indent<v8:Type>cfg:$typeStr</v8:Type>"
|
||||
} else {
|
||||
if (-not $script:knownInvalidTypes.ContainsKey($typeStr)) {
|
||||
Write-Warning "Unrecognized bare type '$typeStr' — will be emitted without namespace prefix"
|
||||
}
|
||||
X "$indent<v8:Type>$typeStr</v8:Type>"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# form-compile v1.0 — Compile 1C managed form from JSON
|
||||
# form-compile v1.1 — Compile 1C managed form from JSON
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
import argparse
|
||||
import json
|
||||
@@ -202,11 +202,27 @@ DCS_MAP = {
|
||||
|
||||
CFG_REF_PATTERN = re.compile(
|
||||
r'^(CatalogRef|CatalogObject|DocumentRef|DocumentObject|EnumRef|'
|
||||
r'ChartOfAccountsRef|ChartOfCharacteristicTypesRef|ChartOfCalculationTypesRef|'
|
||||
r'ExchangePlanRef|BusinessProcessRef|TaskRef|'
|
||||
r'InformationRegisterRecordSet|AccumulationRegisterRecordSet|DataProcessorObject)\.'
|
||||
r'ChartOfAccountsRef|ChartOfAccountsObject|ChartOfCharacteristicTypesRef|ChartOfCharacteristicTypesObject|'
|
||||
r'ChartOfCalculationTypesRef|ChartOfCalculationTypesObject|'
|
||||
r'ExchangePlanRef|ExchangePlanObject|BusinessProcessRef|BusinessProcessObject|TaskRef|TaskObject|'
|
||||
r'InformationRegisterRecordSet|InformationRegisterRecordManager|'
|
||||
r'AccumulationRegisterRecordSet|AccountingRegisterRecordSet|'
|
||||
r'ConstantsSet|DataProcessorObject|ReportObject)\.'
|
||||
)
|
||||
|
||||
KNOWN_INVALID_TYPES = {
|
||||
'FormDataStructure': 'Runtime type. Use cfg:*Object.XXX (e.g. CatalogObject.XXX)',
|
||||
'FormDataCollection': 'Runtime type. Use ValueTable',
|
||||
'FormDataTree': 'Runtime type. Use ValueTree',
|
||||
'FormDataTreeItem': 'Runtime type, not valid in XML',
|
||||
'FormDataCollectionItem': 'Runtime type, not valid in XML',
|
||||
'FormGroup': 'UI element type, not a data type',
|
||||
'FormField': 'UI element type, not a data type',
|
||||
'FormButton': 'UI element type, not a data type',
|
||||
'FormDecoration': 'UI element type, not a data type',
|
||||
'FormTable': 'UI element type, not a data type',
|
||||
}
|
||||
|
||||
|
||||
_FORM_TYPE_SYNONYMS = {
|
||||
"строка": "string", "число": "decimal", "булево": "boolean",
|
||||
@@ -312,10 +328,14 @@ def emit_single_type(lines, type_str, indent):
|
||||
lines.append(f'{indent}<v8:Type>cfg:{type_str}</v8:Type>')
|
||||
return
|
||||
|
||||
# Fallback
|
||||
# Fallback with validation
|
||||
if type_str in KNOWN_INVALID_TYPES:
|
||||
print(f"WARNING: Type '{type_str}': {KNOWN_INVALID_TYPES[type_str]}", file=sys.stderr)
|
||||
if '.' in type_str:
|
||||
lines.append(f'{indent}<v8:Type>cfg:{type_str}</v8:Type>')
|
||||
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)
|
||||
lines.append(f'{indent}<v8:Type>{type_str}</v8:Type>')
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user