mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-06-14 18:04:58 +03:00
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:
@@ -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) }
|
||||
|
||||
Reference in New Issue
Block a user