From 95d8ece3093e7ef4bc62a5b6d6a8caca65b15248 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sat, 13 Jun 2026 17:11:38 +0300 Subject: [PATCH] =?UTF-8?q?fix(form-decompile,form-compile):=20use:false?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B5=20=D1=84?= =?UTF-8?q?=D0=B8=D0=BB=D1=8C=D1=82=D1=80=D0=B0=20(FilterItemGroup)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Группа условий фильтра может нести false (группа отключена, в т.ч. пустая OrGroup без детей). Декомпилятор ловил group/items/presentation/viewMode/userSettingID, но НЕ use → терялось; компилятор не эмитил. Декомпилятор: захват use:false на группе. Компилятор: emit false перед (порядок исходника). Зеркало py. Корпус: 6 форм. Форма ДокументооборотСКонтролирующимиОрганами/ПоказСообщений → match. ps1==py байт-в-байт. Регресс 43/43. Spec обновлён. Co-Authored-By: Claude Opus 4.8 (1M context) --- .claude/skills/form-compile/scripts/form-compile.ps1 | 3 ++- .claude/skills/form-compile/scripts/form-compile.py | 4 +++- .claude/skills/form-decompile/scripts/form-decompile.ps1 | 3 ++- docs/form-dsl-spec.md | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.claude/skills/form-compile/scripts/form-compile.ps1 b/.claude/skills/form-compile/scripts/form-compile.ps1 index 9a1d3882..9e45a27e 100644 --- a/.claude/skills/form-compile/scripts/form-compile.ps1 +++ b/.claude/skills/form-compile/scripts/form-compile.ps1 @@ -1,4 +1,4 @@ -# form-compile v1.166 — Compile 1C managed form from JSON or object metadata +# form-compile v1.167 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$JsonPath, @@ -1695,6 +1695,7 @@ function Emit-FilterItem { if ($item.group) { $groupType = switch ("$($item.group)") { "And" { "AndGroup" } "Or" { "OrGroup" } "Not" { "NotGroup" } default { "$($item.group)Group" } } X "$indent" + if ($item.use -eq $false) { X "$indent`tfalse" } # группа отключена (перед groupType, порядок исходника) X "$indent`t$groupType" if ($item.items) { foreach ($sub in $item.items) { diff --git a/.claude/skills/form-compile/scripts/form-compile.py b/.claude/skills/form-compile/scripts/form-compile.py index 321a3ea2..98a3ae2c 100644 --- a/.claude/skills/form-compile/scripts/form-compile.py +++ b/.claude/skills/form-compile/scripts/form-compile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# form-compile v1.166 — Compile 1C managed form from JSON or object metadata +# form-compile v1.167 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import copy @@ -1441,6 +1441,8 @@ def emit_filter_item(lines, item, indent): g = str(item['group']) group_type = {'And': 'AndGroup', 'Or': 'OrGroup', 'Not': 'NotGroup'}.get(g, g + 'Group') lines.append(f'{indent}') + if item.get('use') is False: + lines.append(f'{indent}\tfalse') # группа отключена (перед groupType) lines.append(f'{indent}\t{group_type}') if item.get('items'): for sub in item['items']: diff --git a/.claude/skills/form-decompile/scripts/form-decompile.ps1 b/.claude/skills/form-decompile/scripts/form-decompile.ps1 index 83b76ed1..e5f504f9 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.143 — Decompile 1C managed Form.xml to JSON DSL (draft) +# form-decompile v0.144 — Decompile 1C managed Form.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью. param( @@ -648,6 +648,7 @@ function Build-FilterItem { if ($null -ne $bi) { $items += $bi } } $gObj = [ordered]@{ group = $groupName; items = $items } + if ((Get-Text $itemNode "dcsset:use") -eq 'false') { $gObj['use'] = $false } # группа отключена (@off) $gPresNode = $itemNode.SelectSingleNode("dcsset:presentation", $ns) if ($gPresNode) { # Сохраняем форму по xsi:type (LocalStringType ru-only ≠ xs:string) diff --git a/docs/form-dsl-spec.md b/docs/form-dsl-spec.md index 87dd7c51..e4a9b3fa 100644 --- a/docs/form-dsl-spec.md +++ b/docs/form-dsl-spec.md @@ -1061,7 +1061,7 @@ Shorthand: `"Имя [Заголовок]: тип = Выражение #noField # ``` - **order** — строка `"Поле"` (asc) / `"Поле desc"` (синонимы `убыв`/`desc`, `возр`/`asc`) / `"Auto"`, либо объект `{ field, direction?, use?, viewMode? }`. -- **filter** — shorthand `"Поле оператор значение @флаги"` (`@off`, `@user`, `@quickAccess`, `@normal`, `@inaccessible`; `_` = пусто) или объект `{ field, op, value?, use?, userSettingID?, userSettingPresentation?, presentation? }` или группа `{ group: "And"|"Or"|"Not", items: [...] }`. `userSettingPresentation` (кастомная подпись настройки) и `presentation` (подпись условия/элемента) ведутся **по форме значения**: голая строка → `xsi:type="xs:string"`; объект `{ru,en}` (в т.ч. один `{ru}`) → `v8:LocalStringType` (так же у `order`/`conditionalAppearance`/`dataParameters` — и у `presentation` элемента условного оформления). +- **filter** — shorthand `"Поле оператор значение @флаги"` (`@off`, `@user`, `@quickAccess`, `@normal`, `@inaccessible`; `_` = пусто) или объект `{ field, op, value?, use?, userSettingID?, userSettingPresentation?, presentation? }` или группа `{ group: "And"|"Or"|"Not", items: [...], use? }` (`use: false` → группа отключена, `false`; может быть пустой `items: []`). `userSettingPresentation` (кастомная подпись настройки) и `presentation` (подпись условия/элемента) ведутся **по форме значения**: голая строка → `xsi:type="xs:string"`; объект `{ru,en}` (в т.ч. один `{ru}`) → `v8:LocalStringType` (так же у `order`/`conditionalAppearance`/`dataParameters` — и у `presentation` элемента условного оформления). - **Операторы:** `=` `<>` `>` `>=` `<` `<=`, `in`/`notIn`, `inHierarchy`/`inListByHierarchy`, `contains`/`notContains`, `beginsWith`/`notBeginsWith`, `like`/`notLike` (подобно; `%`-шаблон в значении, напр. `"КодВалют like %/ %"`), `filled`/`notFilled`. Регистр оператора не важен; у `like`/`notLike` есть рус. синоним `подобно`/`неподобно`. - **Дата в фильтре = `StandardBeginningDate`** (так платформа хранит дату-значение почти всегда — корпус 268 vs 2 `xs:dateTime`). Формы значения (от компактной к полной): - **голая ISO-дата** `"2020-01-01T00:00:00"` (без `valueType`) → `Custom` + эта дата. Работает и в shorthand: `"ДатаЗаказа > 2020-01-01T00:00:00"`. Это дефолт даты в фильтре.