From e1d5d1f90366ddbe758e721622090d8584a99a97 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Wed, 12 Aug 2026 17:24:34 +0300 Subject: [PATCH] =?UTF-8?q?fix(form-validate):=20=D0=BA=D0=BE=D0=BC=D0=B0?= =?UTF-8?q?=D0=BD=D0=B4=D0=B0=20=D0=B1=D0=B5=D0=B7=20Action=20=E2=80=94=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B5=D0=B4=D1=83=D0=BF=D1=80=D0=B5=D0=B6=D0=B4?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5,=20=D0=B0=20=D0=BD=D0=B5=20=D0=BE?= =?UTF-8?q?=D1=88=D0=B8=D0=B1=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проверка объявляла ошибкой любую команду формы без . Корпусный прогон (УТ 8.3.27, БП 8.3.27, ERP 8.3.24 — 21 097 форм) показал 406 таких команд на 275 формах, и все они произведены самой платформой: формат это допускает, конфигурации грузятся. Приём типовых: действие назначается в рантайме, в ПриСозданииНаСервере — `Команда.Действие = "Подключаемый_" + Имя + "Локализация"`. Назначать может и чужой модуль (переопределяемый слой, подключаемые команды), поэтому по одному Form.xml вердикт не вынести — отсюда предупреждение, а не ошибка, и никакого подглядывания в соседний модуль. Корпус после правки: форм с ошибками 283 → 8, новых срабатываний нет. Оставшиеся 8 — четыре других класса, разбираются отдельно. Кейс с фикстурой: команда без Action на кнопке → предупреждение, exit 0. --- .../form-validate/scripts/form-validate.ps1 | 9 ++++- .../form-validate/scripts/form-validate.py | 9 ++++- .../form-validate/command-without-action.json | 6 +++ .../БезДействия/Forms/Форма/Ext/Form.xml | 38 +++++++++++++++++++ .../БезДействия/Forms/Форма/Ext/Form.xml | 38 +++++++++++++++++++ 5 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 tests/skills/cases/form-validate/command-without-action.json create mode 100644 tests/skills/cases/form-validate/fixtures/command-without-action/DataProcessors/БезДействия/Forms/Форма/Ext/Form.xml create mode 100644 tests/skills/cases/form-validate/snapshots/command-without-action/DataProcessors/БезДействия/Forms/Форма/Ext/Form.xml 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> + + + +