From 3bd69baae6b1c6e931c7bbba57947a9a73e95f2f Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 5 Apr 2026 19:53:58 +0300 Subject: [PATCH] fix(form-validate): add ExternalDataProcessorObject/ExternalReportObject to valid cfg prefixes Check 12 was flagging cfg:ExternalDataProcessorObject.X as "unrecognized cfg prefix", but this is a valid XDTO type for external data processor (EPF) forms. Found via snapshot verification against epf-add-form snapshots. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../form-validate/scripts/form-validate.ps1 | 27 +++++++++++++++++-- .../form-validate/scripts/form-validate.py | 20 ++++++++++++-- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/.claude/skills/form-validate/scripts/form-validate.ps1 b/.claude/skills/form-validate/scripts/form-validate.ps1 index 268266a4..d66ffcfc 100644 --- a/.claude/skills/form-validate/scripts/form-validate.ps1 +++ b/.claude/skills/form-validate/scripts/form-validate.ps1 @@ -1,4 +1,4 @@ -# form-validate v1.2 — Validate 1C managed form +# form-validate v1.3 — Validate 1C managed form # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -58,6 +58,20 @@ $nsMgr.AddNamespace("v8", "http://v8.1c.ru/8.1/data/core") $root = $xmlDoc.DocumentElement +# --- Detect context: config vs EPF/ERF --- +# Walk up from FormPath looking for Configuration.xml → config context +# No Configuration.xml → external data processor / report (EPF/ERF) +$script:isConfigContext = $false +$walkDir = Split-Path (Resolve-Path $FormPath) -Parent +for ($i = 0; $i -lt 15; $i++) { + if (-not $walkDir -or $walkDir -eq (Split-Path $walkDir)) { break } + if (Test-Path (Join-Path $walkDir "Configuration.xml")) { + $script:isConfigContext = $true + break + } + $walkDir = Split-Path $walkDir +} + # --- Counters --- $errors = 0 @@ -696,6 +710,7 @@ $validCfgPrefixes = @( "ChartOfCharacteristicTypesObject","ChartOfCharacteristicTypesRef" "ConstantsSet","DataProcessorObject","DocumentObject","DocumentRef" "DynamicList","EnumRef","ExchangePlanObject","ExchangePlanRef" + "ExternalDataProcessorObject","ExternalReportObject" "InformationRegisterRecordManager","InformationRegisterRecordSet" "ReportObject","TaskObject","TaskRef" ) @@ -719,7 +734,15 @@ if (-not $stopped) { $cfgVal = $Matches[1] if ($cfgVal -eq "DynamicList") { continue } if ($cfgVal -match '^([^.]+)\.') { - if ($Matches[1] -in $validCfgPrefixes) { continue } + $pfx = $Matches[1] + if ($pfx -in $validCfgPrefixes) { + # ExternalDataProcessorObject/ExternalReportObject valid only for EPF/ERF, not config + if ($script:isConfigContext -and ($pfx -eq "ExternalDataProcessorObject" -or $pfx -eq "ExternalReportObject")) { + Report-Warn "12. Type '$tv': External* type in configuration context (use DataProcessorObject/ReportObject instead)" + $typeOk = $false + } + continue + } } Report-Warn "12. Type '$tv': unrecognized cfg prefix" $typeOk = $false diff --git a/.claude/skills/form-validate/scripts/form-validate.py b/.claude/skills/form-validate/scripts/form-validate.py index b0a753c6..0234ed30 100644 --- a/.claude/skills/form-validate/scripts/form-validate.py +++ b/.claude/skills/form-validate/scripts/form-validate.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# form-validate v1.2 — Validate 1C managed form +# form-validate v1.3 — Validate 1C managed form # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -43,6 +43,7 @@ VALID_CFG_PREFIXES = { 'ChartOfCharacteristicTypesObject', 'ChartOfCharacteristicTypesRef', 'ConstantsSet', 'DataProcessorObject', 'DocumentObject', 'DocumentRef', 'DynamicList', 'EnumRef', 'ExchangePlanObject', 'ExchangePlanRef', + 'ExternalDataProcessorObject', 'ExternalReportObject', 'InformationRegisterRecordManager', 'InformationRegisterRecordSet', 'ReportObject', 'TaskObject', 'TaskRef', } @@ -103,6 +104,18 @@ def main(): root = tree.getroot() + # Detect context: config vs EPF/ERF + is_config_context = False + walk_dir = os.path.dirname(os.path.abspath(form_path)) + for _ in range(15): + parent = os.path.dirname(walk_dir) + if parent == walk_dir: + break + if os.path.isfile(os.path.join(walk_dir, 'Configuration.xml')): + is_config_context = True + break + walk_dir = parent + errors = 0 warnings = 0 ok_count = 0 @@ -645,7 +658,10 @@ def main(): suffix = tv[4:] # after "cfg:" prefix = suffix.split(".")[0] if prefix in VALID_CFG_PREFIXES or suffix == "DynamicList": - pass # OK + # ExternalDataProcessorObject/ExternalReportObject valid only in EPF/ERF context + if is_config_context and prefix in ('ExternalDataProcessorObject', 'ExternalReportObject'): + report_warn(f'12. Type "{tv}": External* type in configuration context (use DataProcessorObject/ReportObject instead)') + type_warn_count += 1 else: report_warn(f'12. Type "{tv}": unrecognized cfg prefix') type_warn_count += 1