feat(form-decompile): события с кастомными именами в on (кластер Events handlers-only)

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 <Events>-блоков, где кастомное событие идёт
перед авто (паттерн не A*C*). Поэтому union в компиляторе (on, затем handlers)
дал бы неверный порядок — единственная упорядоченная структура DSL это on,
её и заполняем полностью.

Зеркало PY компилятора не нужно (правка только декомпилятора). Валидация:
ПериодКомандировки/Банки/АктивныеПользователи — Events ушли из диффов.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-05 11:54:36 +03:00
parent bccdf93094
commit a38874280c
@@ -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) }