From b5e8e1df7af071c29bd49038a148621d42402566 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sat, 13 Jun 2026 17:25:37 +0300 Subject: [PATCH] =?UTF-8?q?feat(form-decompile,form-compile):=20=D0=B1?= =?UTF-8?q?=D0=B0=D1=82=D1=87=20=D0=BF=D1=80=D0=BE=D1=81=D1=82=D1=8B=D1=85?= =?UTF-8?q?=20=D1=85=D0=B2=D0=BE=D1=81=D1=82=D0=BE=D0=B2=20=E2=80=94=20gen?= =?UTF-8?q?eric-=D1=81=D0=BA=D0=B0=D0=BB=D1=8F=D1=80=D1=8B,=20form=20Scale?= =?UTF-8?q?,=20CommandBar=20HL=20Auto,=20CheckBox=20FooterDataPath?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Хвост из указанных форм (по 1 в корпусе, кроме CheckBox FooterDataPath): (1) GENERIC_SCALARS (обе стороны+py): AutoCorrectionOnTextInput (input) / CommandUniqueness (button bool) / AllowInputEmptyMultipleValues (input bool) / BehaviorOnHorizontalCompression (table). (2) Форменный (масштаб формы) → KNOWN_FORM_PROPS. (3) CommandBar>HorizontalLocation: компилятор через Get-HLocation скипал Auto (умолчание дополнений), но CommandBar хранит его фактически (декомпилятор ловит только при наличии) → эмит фактический, включая Auto. Зеркало py. (4) CheckBoxField>FooterDataPath/FooterText — общие cell-свойства колонки, не ловились у check (как раньше расширяли на picField). Захват + эмит (ps1+py). Выборка 9 форм: match 7/9 (остаток 2 — InputField>MultipleValuesFont структурный font [отложен] + app:item>Value DesignTimeRef-GUID). ps1==py байт-в-байт. Регресс 43/43. Spec. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../form-compile/scripts/form-compile.ps1 | 18 ++++++++++++++++-- .../form-compile/scripts/form-compile.py | 19 +++++++++++++++---- .../form-decompile/scripts/form-decompile.ps1 | 12 ++++++++++-- docs/form-dsl-spec.md | 1 + 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/.claude/skills/form-compile/scripts/form-compile.ps1 b/.claude/skills/form-compile/scripts/form-compile.ps1 index 9e45a27e..c2940ad1 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.167 — Compile 1C managed form from JSON or object metadata +# form-compile v1.168 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$JsonPath, @@ -3269,6 +3269,12 @@ $script:genericScalars = @( @{ Tag='MultipleValuesBackColor'; Key='multipleValuesBackColor'; Kind='value' } @{ Tag='MultipleValuePictureShape'; Key='multipleValuePictureShape'; Kind='value' } @{ Tag='MultipleValuePictureDataPath'; Key='multipleValuePictureDataPath'; Kind='value' } + # Хвост листовых скаляров (по 1 в корпусе): автокоррекция ввода (input) / уникальность команды + # (button) / допуск пустого множ. значения (input) / поведение при гориз. сжатии (table) + @{ Tag='AutoCorrectionOnTextInput'; Key='autoCorrectionOnTextInput'; Kind='value' } + @{ Tag='CommandUniqueness'; Key='commandUniqueness'; Kind='bool' } + @{ Tag='AllowInputEmptyMultipleValues';Key='allowInputEmptyMultipleValues';Kind='bool' } + @{ Tag='BehaviorOnHorizontalCompression'; Key='behaviorOnHorizontalCompression'; Kind='value' } ) function Emit-GenericScalars { @@ -3958,6 +3964,9 @@ function Emit-Check { Emit-Layout -el $el -indent $inner if ($null -ne $el.warningOnEdit) { Emit-MLText -tag "WarningOnEdit" -text $el.warningOnEdit -indent $inner } + # FooterDataPath / FooterText — общие cell-свойства колонки (как у input/labelField) + if ($el.footerDataPath) { X "$inner$(Esc-Xml "$($el.footerDataPath)")" } + if ($null -ne $el.footerText) { Emit-MLText -tag "FooterText" -text $el.footerText -indent $inner } # Формат / формат редактирования (LocalStringType — строка или {ru,en}) if ($el.format) { Emit-MLText -tag "Format" -text $el.format -indent $inner } @@ -5014,7 +5023,12 @@ function Emit-CommandBar { if ($el.autofill -eq $true) { X "$innertrue" } - $hl = Get-HLocation $el; if ($hl) { X "$inner$hl" } + # CommandBar хранит HorizontalLocation фактически (включая Auto — декомпилятор ловит только при наличии); + # ≠ дополнениям, где Auto = умолчание-скип (Get-HLocation). + if ($el.horizontalLocation) { + $hlv = switch ("$($el.horizontalLocation)".ToLower()) { 'auto' {'Auto'} 'left' {'Left'} 'right' {'Right'} 'center' {'Center'} default {"$($el.horizontalLocation)"} } + X "$inner$hlv" + } Emit-CommonFlags -el $el -indent $inner Emit-Layout -el $el -indent $inner Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner -content $el.extendedTooltip diff --git a/.claude/skills/form-compile/scripts/form-compile.py b/.claude/skills/form-compile/scripts/form-compile.py index 98a3ae2c..288bec2d 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.167 — Compile 1C managed form from JSON or object metadata +# form-compile v1.168 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import copy @@ -3387,6 +3387,11 @@ GENERIC_SCALARS = [ ('MultipleValuesBackColor', 'multipleValuesBackColor', 'value'), ('MultipleValuePictureShape', 'multipleValuePictureShape', 'value'), ('MultipleValuePictureDataPath', 'multipleValuePictureDataPath', 'value'), + # Хвост листовых скаляров (по 1): автокоррекция / уникальность команды / пустое множ.значение / гориз.сжатие + ('AutoCorrectionOnTextInput', 'autoCorrectionOnTextInput', 'value'), + ('CommandUniqueness', 'commandUniqueness', 'bool'), + ('AllowInputEmptyMultipleValues', 'allowInputEmptyMultipleValues', 'bool'), + ('BehaviorOnHorizontalCompression', 'behaviorOnHorizontalCompression', 'value'), ] @@ -4063,6 +4068,11 @@ def emit_check(lines, el, name, eid, indent): if el.get('warningOnEdit') is not None: emit_mltext(lines, inner, 'WarningOnEdit', el['warningOnEdit']) + # FooterDataPath / FooterText — общие cell-свойства колонки (как у input/labelField) + if el.get('footerDataPath'): + lines.append(f'{inner}{esc_xml(str(el["footerDataPath"]))}') + if el.get('footerText') is not None: + emit_mltext(lines, inner, 'FooterText', el['footerText']) # Формат / формат редактирования (LocalStringType — строка или {ru,en}) if el.get('format'): @@ -4748,9 +4758,10 @@ def emit_command_bar(lines, el, name, eid, indent): if el.get('autofill') is True: lines.append(f'{inner}true') - _hl = get_hlocation(el) - if _hl: - lines.append(f'{inner}{_hl}') + # CommandBar хранит HorizontalLocation фактически (включая Auto); ≠ дополнениям (Auto=скип) + if el.get('horizontalLocation'): + _hlv = {'auto': 'Auto', 'left': 'Left', 'right': 'Right', 'center': 'Center'}.get(str(el['horizontalLocation']).lower(), str(el['horizontalLocation'])) + lines.append(f'{inner}{_hlv}') emit_common_flags(lines, el, inner) emit_layout(lines, el, inner) diff --git a/.claude/skills/form-decompile/scripts/form-decompile.ps1 b/.claude/skills/form-decompile/scripts/form-decompile.ps1 index e5f504f9..3e6cc6c8 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.144 — Decompile 1C managed Form.xml to JSON DSL (draft) +# form-decompile v0.145 — Decompile 1C managed Form.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью. param( @@ -1638,6 +1638,11 @@ $GENERIC_SCALARS = @( @{ Tag='MultipleValuesBackColor'; Key='multipleValuesBackColor'; Kind='value' } @{ Tag='MultipleValuePictureShape'; Key='multipleValuePictureShape'; Kind='value' } @{ Tag='MultipleValuePictureDataPath'; Key='multipleValuePictureDataPath'; Kind='value' } + # Хвост листовых скаляров (по 1): автокоррекция / уникальность команды / пустое множ.значение / гориз.сжатие + @{ Tag='AutoCorrectionOnTextInput'; Key='autoCorrectionOnTextInput'; Kind='value' } + @{ Tag='CommandUniqueness'; Key='commandUniqueness'; Kind='bool' } + @{ Tag='AllowInputEmptyMultipleValues'; Key='allowInputEmptyMultipleValues'; Kind='bool' } + @{ Tag='BehaviorOnHorizontalCompression'; Key='behaviorOnHorizontalCompression'; Kind='value' } ) # Захват generic-скаляров. Специфичная обработка (если ключ уже задан) — побеждает. @@ -1969,6 +1974,9 @@ function Decompile-Element { elseif ($cbt -ne 'Auto') { $obj['checkBoxType'] = $cbt.Substring(0,1).ToLower() + $cbt.Substring(1) } Add-TitleLocation $obj $node 'Right' $woe = $node.SelectSingleNode("lf:WarningOnEdit", $ns); if ($woe) { $t = Get-LangTextWS $woe; if ($null -ne $t) { $obj['warningOnEdit'] = $t } } + # FooterDataPath / FooterText — общие cell-свойства колонки (как у input/labelField) + $fdp = Get-Child $node 'FooterDataPath'; if ($fdp) { $obj['footerDataPath'] = $fdp } + $ftxt = $node.SelectSingleNode("lf:FooterText", $ns); if ($ftxt) { $t = Get-LangTextWS $ftxt; if ($null -ne $t) { $obj['footerText'] = $t } } Add-FormatProps $obj $node } 'RadioButtonField' { @@ -2513,7 +2521,7 @@ $titleNode = $root.SelectSingleNode("lf:Title", $ns) if ($titleNode) { $t = Get-LangText $titleNode; if ($null -ne $t) { $dsl['title'] = $t } } # properties (прямые скаляры под
, PascalCase → camelCase) -$KNOWN_FORM_PROPS = @('AutoTitle','ReportResult','DetailsData','ReportFormType','AutoShowState','ReportResultViewMode','ViewModeApplicationOnSetReportResult','WindowOpeningMode','CommandBarLocation','SaveDataInSettings','AutoSaveDataInSettings','AutoTime','UsePostingMode','RepostOnWrite','AutoURL','AutoFillCheck','Customizable','EnterKeyBehavior','VerticalScroll','Width','Height','Group','UseForFoldersAndItems','SaveWindowSettings','ScalingMode','VerticalSpacing','VariantAppearance','ShowCloseButton','HorizontalAlign','ChildrenAlign','ShowTitle','ConversationsRepresentation','CollapseItemsByImportanceVariant','GroupList','ChildItemsWidth','VerticalAlign','HorizontalSpacing','CustomSettingsFolder','SettingsStorage','Enabled') +$KNOWN_FORM_PROPS = @('AutoTitle','ReportResult','DetailsData','ReportFormType','AutoShowState','ReportResultViewMode','ViewModeApplicationOnSetReportResult','WindowOpeningMode','CommandBarLocation','SaveDataInSettings','AutoSaveDataInSettings','AutoTime','UsePostingMode','RepostOnWrite','AutoURL','AutoFillCheck','Customizable','EnterKeyBehavior','VerticalScroll','Width','Height','Group','UseForFoldersAndItems','SaveWindowSettings','ScalingMode','VerticalSpacing','VariantAppearance','ShowCloseButton','HorizontalAlign','ChildrenAlign','ShowTitle','ConversationsRepresentation','CollapseItemsByImportanceVariant','GroupList','ChildItemsWidth','VerticalAlign','HorizontalSpacing','CustomSettingsFolder','SettingsStorage','Enabled','Scale') $props = [ordered]@{} foreach ($pn in $KNOWN_FORM_PROPS) { $v = Get-Child $root $pn diff --git a/docs/form-dsl-spec.md b/docs/form-dsl-spec.md index e4a9b3fa..01512824 100644 --- a/docs/form-dsl-spec.md +++ b/docs/form-dsl-spec.md @@ -60,6 +60,7 @@ | `repostOnWrite` | `` | `true` / `false` | | `autoURL` | `` | `true` / `false` | | `enabled` | `` | `true` / `false` — доступность всей формы (редкое; форма-уровень) | +| `scale` | `` | масштаб формы (число, напр. `98`; редкое) | | `autoFillCheck` | `` | `true` / `false` | | `customizable` | `` | `true` / `false` | | `enterKeyBehavior` | `` | `DefaultButton`, `NewLine` |