From d5d19710cb381ada58a357c706b24a7620cc5c5b Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Wed, 10 Jun 2026 18:42:07 +0300 Subject: [PATCH] =?UTF-8?q?feat(form-decompile,form-compile):=20=D0=BA?= =?UTF-8?q?=D0=BE=D1=80=D0=BF=D1=83=D1=81=D0=BD=D1=8B=D0=B9=20=D1=85=D0=B2?= =?UTF-8?q?=D0=BE=D1=81=D1=82=20=E2=80=94=208=20generic-=D1=81=D0=BA=D0=B0?= =?UTF-8?q?=D0=BB=D1=8F=D1=80=D0=BE=D0=B2=20+=20PasswordMode=20=D1=84?= =?UTF-8?q?=D0=B0=D0=BA=D1=82.=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Из ROOT-секции корпусного прогона 8.3.24 (rt-24): дешёвые широкие generic-скаляры (pass-through, обе стороны + py), не обрабатывались ранее: - ControlRepresentation (свёртка группы, 1464) · ShapeRepresentation (форма кнопки/ попапа, 1023) · AutoAddIncomplete (516) · MarkNegatives (433) · InitialListView (нач. позиция списка, 246) · ChoiceListHeight (143) · ThreeState (флажок, 119) · ScrollOnCompress (прокрутка страницы, 104). PasswordMode на InputField: эмитился только при true → терялись 349/504 явных false в корпусе (ROOT 689). Теперь факт. значение (как на LabelField/markIncomplete); декомпилятор захватывает true/false при наличии тега. Проверка: 15 корпусных форм с этими тегами — 0 расхождений по тегам. Регресс 43/43 (ps1+py). Совокупный ожидаемый impact ~4700 TOTAL. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../skills/form-compile/scripts/form-compile.ps1 | 15 +++++++++++++-- .../skills/form-compile/scripts/form-compile.py | 16 +++++++++++++--- .../form-decompile/scripts/form-decompile.ps1 | 15 +++++++++++++-- 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/.claude/skills/form-compile/scripts/form-compile.ps1 b/.claude/skills/form-compile/scripts/form-compile.ps1 index 0e9fa9f3..e17ec49e 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.107 — Compile 1C managed form from JSON or object metadata +# form-compile v1.108 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$JsonPath, @@ -2960,6 +2960,17 @@ $script:genericScalars = @( @{ Tag='AutoMaxRowsCount'; Key='autoMaxRowsCount'; Kind='bool' } @{ Tag='HeightControlVariant'; Key='heightControlVariant'; Kind='value' } @{ Tag='EditTextUpdate'; Key='editTextUpdate'; Kind='value' } + # Корпусный хвост: представление управления свёрткой группы / форма кнопки-попапа / + # авто-добавление незаполненной строки / выделение отрицательных / нач. позиция списка / + # высота списка выбора / три состояния флажка / прокрутка страницы при сжатии + @{ Tag='ControlRepresentation'; Key='controlRepresentation'; Kind='value' } + @{ Tag='ShapeRepresentation'; Key='shapeRepresentation'; Kind='value' } + @{ Tag='AutoAddIncomplete'; Key='autoAddIncomplete'; Kind='bool' } + @{ Tag='MarkNegatives'; Key='markNegatives'; Kind='bool' } + @{ Tag='InitialListView'; Key='initialListView'; Kind='value' } + @{ Tag='ChoiceListHeight'; Key='choiceListHeight'; Kind='value' } + @{ Tag='ThreeState'; Key='threeState'; Kind='bool' } + @{ Tag='ScrollOnCompress'; Key='scrollOnCompress'; Kind='bool' } ) function Emit-GenericScalars { @@ -3533,7 +3544,7 @@ function Emit-Input { } if ($el.multiLine -eq $true) { X "$innertrue" } - if ($el.passwordMode -eq $true) { X "$innertrue" } + if ($null -ne $el.passwordMode) { X "$inner$(if ($el.passwordMode){'true'}else{'false'})" } # ChoiceButton — захват «как есть» (платформа эмитит явное значение; ref-поля выводят сама, # декомпилятор фиксирует факт. значение). Нет ключа → не эмитим (не додумываем по событию). if ($null -ne $el.choiceButton) { X "$inner$(if ($el.choiceButton){'true'}else{'false'})" } diff --git a/.claude/skills/form-compile/scripts/form-compile.py b/.claude/skills/form-compile/scripts/form-compile.py index 9ef203f6..3ed8cf4a 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.107 — Compile 1C managed form from JSON or object metadata +# form-compile v1.108 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import copy @@ -3069,6 +3069,16 @@ GENERIC_SCALARS = [ ('AutoMaxRowsCount', 'autoMaxRowsCount', 'bool'), ('HeightControlVariant', 'heightControlVariant', 'value'), ('EditTextUpdate', 'editTextUpdate', 'value'), + # Корпусный хвост: свёртка группы / форма попапа / авто-добавление / выделение отрицательных / + # нач. позиция списка / высота списка выбора / три состояния / прокрутка страницы при сжатии + ('ControlRepresentation', 'controlRepresentation', 'value'), + ('ShapeRepresentation', 'shapeRepresentation', 'value'), + ('AutoAddIncomplete', 'autoAddIncomplete', 'bool'), + ('MarkNegatives', 'markNegatives', 'bool'), + ('InitialListView', 'initialListView', 'value'), + ('ChoiceListHeight', 'choiceListHeight', 'value'), + ('ThreeState', 'threeState', 'bool'), + ('ScrollOnCompress', 'scrollOnCompress', 'bool'), ] @@ -3608,8 +3618,8 @@ def emit_input(lines, el, name, eid, indent): if el.get('multiLine') is True: lines.append(f'{inner}true') - if el.get('passwordMode') is True: - lines.append(f'{inner}true') + if el.get('passwordMode') is not None: + lines.append(f'{inner}{"true" if el["passwordMode"] else "false"}') # ChoiceButton — захват «как есть» (платформа эмитит явное значение; ref-поля выводят сама, # декомпилятор фиксирует факт. значение). Нет ключа → не эмитим (не додумываем по событию). if el.get('choiceButton') is not None: diff --git a/.claude/skills/form-decompile/scripts/form-decompile.ps1 b/.claude/skills/form-decompile/scripts/form-decompile.ps1 index 0aeaebbf..38f7e9e7 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.83 — Decompile 1C managed Form.xml to JSON DSL (draft) +# form-decompile v0.84 — Decompile 1C managed Form.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью. param( @@ -1255,6 +1255,16 @@ $GENERIC_SCALARS = @( @{ Tag='AutoMaxRowsCount'; Key='autoMaxRowsCount'; Kind='bool' } @{ Tag='HeightControlVariant'; Key='heightControlVariant'; Kind='value' } @{ Tag='EditTextUpdate'; Key='editTextUpdate'; Kind='value' } + # Корпусный хвост (zеркало компилятора): свёртка группы / форма попапа / авто-добавление / + # выделение отрицательных / нач. позиция списка / высота списка выбора / три состояния / прокрутка + @{ Tag='ControlRepresentation'; Key='controlRepresentation'; Kind='value' } + @{ Tag='ShapeRepresentation'; Key='shapeRepresentation'; Kind='value' } + @{ Tag='AutoAddIncomplete'; Key='autoAddIncomplete'; Kind='bool' } + @{ Tag='MarkNegatives'; Key='markNegatives'; Kind='bool' } + @{ Tag='InitialListView'; Key='initialListView'; Kind='value' } + @{ Tag='ChoiceListHeight'; Key='choiceListHeight'; Kind='value' } + @{ Tag='ThreeState'; Key='threeState'; Kind='bool' } + @{ Tag='ScrollOnCompress'; Key='scrollOnCompress'; Kind='bool' } ) # Захват generic-скаляров. Специфичная обработка (если ключ уже задан) — побеждает. @@ -1513,7 +1523,8 @@ function Decompile-Element { $dp = Get-Child $node 'DataPath'; if ($dp) { $obj['path'] = $dp } Add-CommonProps $obj $node $name if ((Get-Child $node 'MultiLine') -eq 'true') { $obj['multiLine'] = $true } - if ((Get-Child $node 'PasswordMode') -eq 'true') { $obj['passwordMode'] = $true } + # PasswordMode: факт. значение (платформа эмитит и false — 349/504 в корпусе; ≠ «if true») + $pmIn = Get-Child $node 'PasswordMode'; if ($null -ne $pmIn) { $obj['passwordMode'] = ($pmIn -eq 'true') } $mi = Get-Child $node 'AutoMarkIncomplete'; if ($null -ne $mi) { $obj['markIncomplete'] = ($mi -eq 'true') } $em = Get-Child $node 'EditMode'; if ($em) { $obj['editMode'] = $em } $tl = Get-Child $node 'TitleLocation'; if ($tl) { $obj['titleLocation'] = $tl.ToLower() }