diff --git a/.claude/skills/form-validate/scripts/form-validate.ps1 b/.claude/skills/form-validate/scripts/form-validate.ps1 index 5bf31acb..b8d8efa4 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.12 — Validate 1C managed form +# form-validate v1.13 — Validate 1C managed form # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -569,13 +569,18 @@ if (-not $stopped) { $actionErrors = 0 $actionChecked = 0 + # Предупреждение, а не ошибка: может назначаться в рантайме + # (`Команда.Действие = "Подключаемый_…"` в ПриСозданииНаСервере) — приём типовых конфигураций + # там, где обработчик существует не во всякой сборке. Назначать может и чужой модуль + # (переопределяемый слой, подключаемые команды), так что по одному Form.xml не решить. + # Корпус УТ/БП/ERP: 406 таких команд на 275 формах, произведённых платформой. foreach ($cmd in $cmdNodes) { if ($stopped) { break } $cmdName = $cmd.GetAttribute("name") $actionNode = $cmd.SelectSingleNode("f:Action", $nsMgr) $actionChecked++ if (-not $actionNode -or -not $actionNode.InnerText.Trim()) { - Report-Error "Command '$cmdName': missing or empty Action" + Report-Warn "Command '$cmdName': no Action — handler must be assigned at runtime, otherwise the command does nothing" $actionErrors++ } } diff --git a/.claude/skills/form-validate/scripts/form-validate.py b/.claude/skills/form-validate/scripts/form-validate.py index e16d3aef..44ff8c60 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.12 — Validate 1C managed form +# form-validate v1.13 — Validate 1C managed form # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -570,6 +570,11 @@ def main(): action_errors = 0 action_checked = 0 + # Предупреждение, а не ошибка: может назначаться в рантайме + # (`Команда.Действие = "Подключаемый_…"` в ПриСозданииНаСервере) — приём типовых конфигураций + # там, где обработчик существует не во всякой сборке. Назначать может и чужой модуль + # (переопределяемый слой, подключаемые команды), так что по одному Form.xml не решить. + # Корпус УТ/БП/ERP: 406 таких команд на 275 формах, произведённых платформой. for cmd in cmd_nodes: if stopped: break @@ -577,7 +582,7 @@ def main(): action_node = cmd.find(f"{{{F_NS}}}Action") action_checked += 1 if action_node is None or not (action_node.text or "").strip(): - report_error(f"Command '{cmd_name}': missing or empty Action") + report_warn(f"Command '{cmd_name}': no Action — handler must be assigned at runtime, otherwise the command does nothing") action_errors += 1 if action_errors == 0 and action_checked > 0: diff --git a/tests/skills/cases/form-validate/command-without-action.json b/tests/skills/cases/form-validate/command-without-action.json new file mode 100644 index 00000000..4b2b8b94 --- /dev/null +++ b/tests/skills/cases/form-validate/command-without-action.json @@ -0,0 +1,6 @@ +{ + "name": "Команда без Action — предупреждение, а не ошибка (действие назначается в рантайме)", + "setup": "fixture:command-without-action", + "params": { "formPath": "DataProcessors/БезДействия/Forms/Форма" }, + "expect": { "stdoutContains": "no Action" } +} diff --git a/tests/skills/cases/form-validate/fixtures/command-without-action/DataProcessors/БезДействия/Forms/Форма/Ext/Form.xml b/tests/skills/cases/form-validate/fixtures/command-without-action/DataProcessors/БезДействия/Forms/Форма/Ext/Form.xml new file mode 100644 index 00000000..081f3ba1 --- /dev/null +++ b/tests/skills/cases/form-validate/fixtures/command-without-action/DataProcessors/БезДействия/Forms/Форма/Ext/Form.xml @@ -0,0 +1,38 @@ + +
+ + true + + + + + + + Объект.Наименование + + + + + + + + cfg:DataProcessorObject.БезДействия + + true + true + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Локализованная команда</v8:content> + </v8:item> + + + +
diff --git a/tests/skills/cases/form-validate/snapshots/command-without-action/DataProcessors/БезДействия/Forms/Форма/Ext/Form.xml b/tests/skills/cases/form-validate/snapshots/command-without-action/DataProcessors/БезДействия/Forms/Форма/Ext/Form.xml new file mode 100644 index 00000000..a48faac8 --- /dev/null +++ b/tests/skills/cases/form-validate/snapshots/command-without-action/DataProcessors/БезДействия/Forms/Форма/Ext/Form.xml @@ -0,0 +1,38 @@ + +
+ + true + + + + + + + Объект.Наименование + + + + + + + + cfg:DataProcessorObject.БезДействия + + true + true + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Локализованная команда</v8:content> + </v8:item> + + + +