From a38874280c537bdd0de9e4f986c19ad252fe3b33 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Fri, 5 Jun 2026 11:54:36 +0300 Subject: [PATCH] =?UTF-8?q?feat(form-decompile):=20=D1=81=D0=BE=D0=B1?= =?UTF-8?q?=D1=8B=D1=82=D0=B8=D1=8F=20=D1=81=20=D0=BA=D0=B0=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D0=BC=D0=BD=D1=8B=D0=BC=D0=B8=20=D0=B8=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8=20=D0=B2=20on=20(=D0=BA=D0=BB=D0=B0=D1=81?= =?UTF-8?q?=D1=82=D0=B5=D1=80=20Events=20handlers-only)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Get-Events клал в on только авто-именованные обработчики, а кастомные (переименованные или без суффикса: OnActivateDate, ValueChoice, Selection с нестандартным именем…) — ТОЛЬКО в handlers, минуя on. Компилятор итерирует по on → такие события не эмитились вообще. Корпус acc_8.3.24: 190 элементов в 114 формах из 400 теряли Events. Контракт DSL (spec §4.1/4.2): on = полный список имён событий, handlers = переопределение имени. Декомпилятор нарушал его — чистый баг класса 1, компилятор корректен. Чиним: каждое событие → в on (порядок документа), handlers только для не-авто имён. Порядок важен: в корпусе 1956 -блоков, где кастомное событие идёт перед авто (паттерн не A*C*). Поэтому union в компиляторе (on, затем handlers) дал бы неверный порядок — единственная упорядоченная структура DSL это on, её и заполняем полностью. Зеркало PY компилятора не нужно (правка только декомпилятора). Валидация: ПериодКомандировки/Банки/АктивныеПользователи — Events ушли из диффов. Co-Authored-By: Claude Opus 4.8 --- .../skills/form-decompile/scripts/form-decompile.ps1 | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.claude/skills/form-decompile/scripts/form-decompile.ps1 b/.claude/skills/form-decompile/scripts/form-decompile.ps1 index 40853d6c..9111f022 100644 --- a/.claude/skills/form-decompile/scripts/form-decompile.ps1 +++ b/.claude/skills/form-decompile/scripts/form-decompile.ps1 @@ -1,4 +1,4 @@ -# form-decompile v0.10 — Decompile 1C managed Form.xml to JSON DSL (draft) +# form-decompile v0.11 — Decompile 1C managed Form.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью. param( @@ -231,15 +231,14 @@ function Get-Events { if (-not $ev) { return $null } $on = New-Object System.Collections.ArrayList $handlers = [ordered]@{} + # `on` — полный список событий в порядке документа (контракт DSL: on = массив имён событий); + # `handlers` — только переопределение имени, когда обработчик не выводится из авто-суффикса. foreach ($e in @($ev.SelectNodes("lf:Event", $ns))) { $evName = $e.GetAttribute("name") $handler = $e.InnerText $auto = if ($HANDLER_SUFFIX.ContainsKey($evName) -and $elName) { "$elName$($HANDLER_SUFFIX[$evName])" } else { $null } - if ($auto -and $handler -eq $auto) { - [void]$on.Add($evName) - } else { - $handlers[$evName] = $handler - } + [void]$on.Add($evName) + if (-not ($auto -and $handler -eq $auto)) { $handlers[$evName] = $handler } } $res = [ordered]@{} if ($on.Count -gt 0) { $res['on'] = @($on) }