From 06331a9b80a9bc40e3edc2ada698c43208375242 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sat, 13 Jun 2026 18:07:14 +0300 Subject: [PATCH] =?UTF-8?q?fix(form-decompile,form-compile):=20dataParamet?= =?UTF-8?q?ers=20=D0=BC=D1=83=D0=BB=D1=8C=D1=82=D0=B8-value=20+=20SpellChe?= =?UTF-8?q?ckingOnTextInput?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (1) dcsset:dataParameters — параметр с НЕСКОЛЬКИМИ (valueListAllowed, напр. два DesignTimeValue Перечисление.X) — декомпилятор читал ОДНО (SelectSingleNode), 2-е/3-е дропались. Фикс: SelectNodes → массив (декомпилятор) + ветка массива в Emit-DataParameters (компилятор ps1+py, отдельный на каждое значение по типу). (2) SpellCheckingOnTextInput (input) → GENERIC_SCALARS (обе стороны+py). Формы Организации/ФормаСписка (dataParameters мульти-DesignTimeValue) + ВводАдреса (SpellChecking) → match. ps1==py байт-в-байт. Регресс 43/43. 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 | 12 +++++++++--- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/.claude/skills/form-compile/scripts/form-compile.ps1 b/.claude/skills/form-compile/scripts/form-compile.ps1 index 2b37509d..97978a58 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.169 — Compile 1C managed form from JSON or object metadata +# form-compile v1.170 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$JsonPath, @@ -3272,6 +3272,7 @@ $script:genericScalars = @( # Хвост листовых скаляров (по 1 в корпусе): автокоррекция ввода (input) / уникальность команды # (button) / допуск пустого множ. значения (input) / поведение при гориз. сжатии (table) @{ Tag='AutoCorrectionOnTextInput'; Key='autoCorrectionOnTextInput'; Kind='value' } + @{ Tag='SpellCheckingOnTextInput'; Key='spellCheckingOnTextInput'; Kind='value' } @{ Tag='CommandUniqueness'; Key='commandUniqueness'; Kind='bool' } @{ Tag='AllowInputEmptyMultipleValues';Key='allowInputEmptyMultipleValues';Kind='bool' } @{ Tag='BehaviorOnHorizontalCompression'; Key='behaviorOnHorizontalCompression'; Kind='value' } @@ -5407,7 +5408,17 @@ function Emit-DataParameters { X "$indent`t" if ($dp.use -eq $false) { X "$indent`t`tfalse" } X "$indent`t`t$(Esc-Xml "$($dp.parameter)")" - if ($dp.nilValue -eq $true) { + $dpValIsArr = ($dp.value -is [array]) -or ($dp.value -is [System.Collections.IList] -and $dp.value -isnot [string]) + if ($dpValIsArr) { + # Список значений параметра (valueListAllowed) — отдельный на каждое. + $avtype = "$($dp.valueType)" + foreach ($v in @($dp.value)) { + $vStr = if ($v -is [bool]) { "$v".ToLower() } else { "$v" } + if ($avtype -match '^[a-zA-Z]+:') { X "$indent`t`t$(Esc-Xml $vStr)" } + elseif ("$vStr" -match '^(ПланСчетов|Справочник|Перечисление|Документ|ПланВидовХарактеристик|ПланВидовРасчета|БизнесПроцесс|Задача|РегистрСведений|ПланОбмена)\.' -or "$vStr" -match '^(ChartOfAccounts|Catalog|Enum|Document|ChartOfCharacteristicTypes|ChartOfCalculationTypes|BusinessProcess|Task|InformationRegister|ExchangePlan)\.') { X "$indent`t`t$(Esc-Xml $vStr)" } + else { X "$indent`t`t$(Esc-Xml $vStr)" } + } + } elseif ($dp.nilValue -eq $true) { X "$indent`t`t" } elseif ((Test-EmptyValue $dp.value) -and $dp.valueType) { # Явный типизированный пустой (xs:string-плейсхолдер и т.п.) diff --git a/.claude/skills/form-compile/scripts/form-compile.py b/.claude/skills/form-compile/scripts/form-compile.py index 822102e9..ef2d36d8 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.169 — Compile 1C managed form from JSON or object metadata +# form-compile v1.170 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import copy @@ -3393,6 +3393,7 @@ GENERIC_SCALARS = [ ('MultipleValuePictureDataPath', 'multipleValuePictureDataPath', 'value'), # Хвост листовых скаляров (по 1): автокоррекция / уникальность команды / пустое множ.значение / гориз.сжатие ('AutoCorrectionOnTextInput', 'autoCorrectionOnTextInput', 'value'), + ('SpellCheckingOnTextInput', 'spellCheckingOnTextInput', 'value'), ('CommandUniqueness', 'commandUniqueness', 'bool'), ('AllowInputEmptyMultipleValues', 'allowInputEmptyMultipleValues', 'bool'), ('BehaviorOnHorizontalCompression', 'behaviorOnHorizontalCompression', 'value'), @@ -5174,7 +5175,18 @@ def emit_data_parameters(lines, items, indent, block_view_mode=None): lines.append(f'{indent}\t\t{esc_xml(str(dp.get("parameter", "")))}') vtype = str(dp.get('valueType') or '') val = dp.get('value') - if dp.get('nilValue') is True: + if isinstance(val, list): + # Список значений параметра (valueListAllowed) — отдельный на каждое. + avtype = str(dp.get('valueType', '')) + for v in val: + v_str = ('true' if v else 'false') if isinstance(v, bool) else str(v) + if re.match(r'^[a-zA-Z]+:', avtype): + lines.append(f'{indent}\t\t{esc_xml(v_str)}') + elif re.match(r'^(ПланСчетов|Справочник|Перечисление|Документ|ПланВидовХарактеристик|ПланВидовРасчета|БизнесПроцесс|Задача|РегистрСведений|ПланОбмена)\.', v_str) or re.match(r'^(ChartOfAccounts|Catalog|Enum|Document|ChartOfCharacteristicTypes|ChartOfCalculationTypes|BusinessProcess|Task|InformationRegister|ExchangePlan)\.', v_str): + lines.append(f'{indent}\t\t{esc_xml(v_str)}') + else: + lines.append(f'{indent}\t\t{esc_xml(v_str)}') + elif dp.get('nilValue') is True: lines.append(f'{indent}\t\t') elif _test_empty_value(val) and vtype: emit_empty_value(lines, vtype, f'{indent}\t\t', tag_prefix='dcscor:', value_list_allowed=False) diff --git a/.claude/skills/form-decompile/scripts/form-decompile.ps1 b/.claude/skills/form-decompile/scripts/form-decompile.ps1 index 3e6cc6c8..1ebdea54 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.145 — Decompile 1C managed Form.xml to JSON DSL (draft) +# form-decompile v0.146 — Decompile 1C managed Form.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью. param( @@ -1441,13 +1441,18 @@ function Build-FormDataParameters { foreach ($it in @($dpNode.SelectNodes("dcscor:item", $ns))) { $pn = Get-Text $it "dcscor:parameter" $use = Get-Text $it "dcscor:use" - $valNode = $it.SelectSingleNode("dcscor:value", $ns) + $valNodes = @($it.SelectNodes("dcscor:value", $ns)) + $valNode = if ($valNodes.Count -ge 1) { $valNodes[0] } else { $null } $usidN = $it.SelectSingleNode("dcsset:userSettingID", $ns) $vmN = $it.SelectSingleNode("dcsset:viewMode", $ns) $uspN = $it.SelectSingleNode("dcsset:userSettingPresentation", $ns) if ($valNode -or $usidN -or $vmN -or $uspN) { $obj = [ordered]@{ parameter = $pn } - if ($valNode) { + if ($valNodes.Count -gt 1) { + # Список значений параметра (valueListAllowed) — захватываем ВСЕ массивом + $obj['value'] = @($valNodes | ForEach-Object { $_.InnerText }) + $vt0 = $valNodes[0].GetAttribute("type", $NS_XSI); if ($vt0) { $obj['valueType'] = $vt0 } + } elseif ($valNode) { if ($valNode.GetAttribute("nil", $NS_XSI) -eq 'true') { $obj['nilValue'] = $true } else { $vType = $valNode.GetAttribute("type", $NS_XSI); $vVal = $valNode.InnerText @@ -1640,6 +1645,7 @@ $GENERIC_SCALARS = @( @{ Tag='MultipleValuePictureDataPath'; Key='multipleValuePictureDataPath'; Kind='value' } # Хвост листовых скаляров (по 1): автокоррекция / уникальность команды / пустое множ.значение / гориз.сжатие @{ Tag='AutoCorrectionOnTextInput'; Key='autoCorrectionOnTextInput'; Kind='value' } + @{ Tag='SpellCheckingOnTextInput'; Key='spellCheckingOnTextInput'; Kind='value' } @{ Tag='CommandUniqueness'; Key='commandUniqueness'; Kind='bool' } @{ Tag='AllowInputEmptyMultipleValues'; Key='allowInputEmptyMultipleValues'; Kind='bool' } @{ Tag='BehaviorOnHorizontalCompression'; Key='behaviorOnHorizontalCompression'; Kind='value' }