diff --git a/.claude/skills/form-compile/scripts/form-compile.ps1 b/.claude/skills/form-compile/scripts/form-compile.ps1 index 8c45986c..0c43f1cd 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.156 — Compile 1C managed form from JSON or object metadata +# form-compile v1.157 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$JsonPath, @@ -5682,7 +5682,10 @@ function Emit-Attributes { # AutoFillAvailableFields — дефолт true; эмитим только при заданном ключе (отклонение). if ($null -ne $st.autoFillAvailableFields) { X "$si$(if ($st.autoFillAvailableFields){'true'}else{'false'})" } $hasQuery = $st.query -and "$($st.query)".Trim() - $mq = if ($hasQuery -or $st.manualQuery -eq $true) { "true" } else { "false" } + # Явный ключ manualQuery (в т.ч. false) ПОБЕЖДАЕТ эвристику hasQuery (платформа изредка + # хранит QueryText при ManualQuery=false — декомпилятор фиксирует это отклонение). + $hasMQKey = ($st.PSObject.Properties['manualQuery']) -and ($null -ne $st.manualQuery) + $mq = if ($hasMQKey) { if ($st.manualQuery) { "true" } else { "false" } } elseif ($hasQuery) { "true" } else { "false" } X "$si$mq" # DynamicDataRead: дефолт true; false только при явном отключении $ddr = if ($st.dynamicDataRead -eq $false) { "false" } else { "true" } diff --git a/.claude/skills/form-compile/scripts/form-compile.py b/.claude/skills/form-compile/scripts/form-compile.py index 0857c605..5cd24f84 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.156 — Compile 1C managed form from JSON or object metadata +# form-compile v1.157 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import copy @@ -5438,7 +5438,12 @@ def emit_attributes(lines, attrs, indent, conditional_appearance=None): lines.append(f'{si}{"true" if s["autoFillAvailableFields"] else "false"}') # Порядок платформы: ManualQuery, DynamicDataRead, QueryText, Field*, MainTable, ListSettings has_query = bool(s.get('query') and str(s['query']).strip()) - mq = 'true' if (has_query or s.get('manualQuery')) else 'false' + # Явный ключ manualQuery (в т.ч. False) ПОБЕЖДАЕТ эвристику has_query (платформа изредка + # хранит QueryText при ManualQuery=false — декомпилятор фиксирует отклонение). + if s.get('manualQuery') is not None: + mq = 'true' if s['manualQuery'] else 'false' + else: + mq = 'true' if has_query else 'false' lines.append(f'{si}{mq}') # DynamicDataRead: дефолт true; false только при явном отключении ddr = 'false' if s.get('dynamicDataRead') is False else 'true' diff --git a/.claude/skills/form-decompile/scripts/form-decompile.ps1 b/.claude/skills/form-decompile/scripts/form-decompile.ps1 index 5f2c0858..96f59f90 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.131 — Decompile 1C managed Form.xml to JSON DSL (draft) +# form-decompile v0.132 — Decompile 1C managed Form.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью. param( @@ -2722,7 +2722,12 @@ if ($attrsNode) { # дефолт true → платформа эмитит отклонение). Захват факт. значения. $asus = Get-Child $setNode 'AutoSaveUserSettings'; if ($null -ne $asus) { $so['autoSaveUserSettings'] = ($asus -eq 'true') } $qtNode = $setNode.SelectSingleNode("lf:QueryText", $ns) - if ($qtNode -and $qtNode.InnerText) { $so['query'] = Maybe-ExternalizeQuery -queryText $qtNode.InnerText -listName "$($ao['name'])" } + $hasQ = [bool]($qtNode -and $qtNode.InnerText) + if ($hasQ) { $so['query'] = Maybe-ExternalizeQuery -queryText $qtNode.InnerText -listName "$($ao['name'])" } + # ManualQuery: компилятор выводит из наличия query (hasQuery → true). Платформа в редких + # случаях (корпус 16) хранит QueryText при ManualQuery=false → фиксируем отклонение от эвристики. + $mqV = Get-Child $setNode 'ManualQuery' + if ($null -ne $mqV) { $mqActual = ($mqV -eq 'true'); if ($mqActual -ne $hasQ) { $so['manualQuery'] = $mqActual } } # DynamicDataRead: дефолт true → эмитим только false if ((Get-Child $setNode 'DynamicDataRead') -eq 'false') { $so['dynamicDataRead'] = $false } # Явные поля набора (редко, ~4.5%) — захват только при наличии Field diff --git a/docs/form-dsl-spec.md b/docs/form-dsl-spec.md index 6a83c677..fe0f63e2 100644 --- a/docs/form-dsl-spec.md +++ b/docs/form-dsl-spec.md @@ -956,7 +956,7 @@ Forgiving-синонимы типа: XML-имя (`SpreadSheetDocumentField`) и | `conditionalAppearance` | array | Условное оформление списка (грамматика как в СКД) | | `grouping` | string \| array | Группировка строк списка (см. ниже). Forgiving-синонимы: `structure`, `группировка` | -`ManualQuery` выводится из наличия `query` — отдельным ключом не задаётся. +`ManualQuery` выводится из наличия `query` (есть `query` → `true`). Редкое отклонение — список с `query`, но `ManualQuery=false` (корпус 16): ключ `manualQuery: false` побеждает эвристику (декомпилятор ставит его только при таком отклонении). Пустой блок настроек компоновщика (`ListSettings`) генерируется автоматически (каноничный полный скелет платформы — filter+order+conditionalAppearance+itemsViewMode+itemsUserSettingID, ~93% форм); указывать ничего не нужно.