diff --git a/.claude/skills/form-decompile/scripts/form-decompile.ps1 b/.claude/skills/form-decompile/scripts/form-decompile.ps1 index cb4756d6..4cbdd230 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.135 — Decompile 1C managed Form.xml to JSON DSL (draft) +# form-decompile v0.136 — Decompile 1C managed Form.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью. param( @@ -2671,8 +2671,11 @@ if ($attrsNode) { if ($flds.Count -eq 1 -and $flds[0] -eq $nm) { $ao['save'] = $true } elseif ($flds.Count -gt 0) { + # Снимаем префикс "имя." ТОЛЬКО когда остаток — простое подполе без точки (компилятор + # реинъектит его). Многоуровневый путь "имя.Settings.Filter" компилятор по dot-правилу + # эмитит как есть (префикс не вернёт) → храним ПОЛНЫЙ путь, иначе префикс теряется. $stripped = @($flds | ForEach-Object { - if ($_ -match "^$([regex]::Escape($nm))\.(.+)$") { $matches[1] } else { $_ } + if ($_ -match "^$([regex]::Escape($nm))\.([^.]+)$") { $matches[1] } else { $_ } }) if ($stripped.Count -eq 1) { $ao['save'] = $stripped[0] } else { $ao['save'] = $stripped } } diff --git a/docs/form-dsl-spec.md b/docs/form-dsl-spec.md index 0e97014c..c0d5b66d 100644 --- a/docs/form-dsl-spec.md +++ b/docs/form-dsl-spec.md @@ -855,7 +855,7 @@ Forgiving-синонимы типа: XML-имя (`SpreadSheetDocumentField`) и | `useAlways` | array | Поля, всегда читаемые (`Имя.Поле…`). Массив коротких имён полей (forgiving: с/без префикса `Имя.`). **Маркер `~`** (query-поля дин-списка): `~Остановлен` → `~Список.Остановлен` (префикс ставится ПОСЛЕ `~`; полная форма `~Список.Остановлен` тоже принимается verbatim). **Две формы**: этот массив на реквизите ИЛИ `useAlways: true` на колонке (`columns[*]`) — компилятор сливает. Для дин-списка — только массив (колонки не эмитятся, но формируют ``) | | `valueType` | string | Тип значений у реквизита типа `ValueList` (``). Грамматика — как у `type`, включая составной `A \| B`. **Три состояния**: нет ключа → нет ``; `""` → пустой `` (список без ограничения типа); тип → с типом. Forgiving-синонимы: `typeDescription` (≈1С «ОписаниеТипов» / XML), `описаниеТипов`, `типЗначений`. Пример: `"valueType": "CatalogRef.Контрагенты"` | | `savedData` | bool | Сохраняемые данные (``). **`false`** → суппресс авто-вывода компилятора (main-реквизит объектного типа Catalog/Document/ChartOf*/ExchangePlan/BusinessProcess/Task Object + RecordManager → `SavedData=true`). Нет ключа → авто-вывод | -| `save` | bool/string/array | Сохранение значения в пользовательских настройках (`…`). `true` → `имя`; строка/массив строк → под-поля с авто-префиксом `имя.` (путь с точкой / ссылка вида `N/M` или `N/M:…` / совпадающее с именем — берётся как есть). Нет ключа или `false` → не эмитится. Пример периода: `["Период","EndDate","StartDate","Variant"]` | +| `save` | bool/string/array | Сохранение значения в пользовательских настройках (`…`). `true` → `имя`; строка/массив строк → под-поля с авто-префиксом `имя.` (путь с точкой / ссылка вида `N/M` или `N/M:…` / совпадающее с именем — берётся как есть). Нет ключа или `false` → не эмитится. Пример периода: `["Период","EndDate","StartDate","Variant"]`. **Многоуровневый путь** (напр. `КомпоновщикНастроек.Settings.Filter`) хранится ПОЛНЫМ (декомпилятор снимает префикс `имя.` только у простого под-поля без точки — иначе компилятор по dot-правилу не реинъектит префикс) | | `fillCheck` | bool/string | Проверка заполнения реквизита (``). `true` → `ShowError` (единственное значение в схеме); строка → verbatim. Синоним `fillChecking`. (`` в схеме нет — был багом) | | `columns` | array | Колонки для ValueTable/ValueTree (`{ name, type, title?, functionalOptions?, view?, edit?, useAlways? }`). `view`/`edit` — ролевой доступ колонки (``/`` xr-флаг, тот же формат `bool \| {common, roles}`, что у реквизита, §4.1c; редкое) | | `additionalColumns` | array | Доп. колонки табличных частей объекта: `[{ table: "Объект.ТабЧасть", columns: [] }]`. У главного реквизита-объекта; `` — та же грамматика, что у `columns`. Эмитятся в `` после прямых колонок |