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% форм); указывать ничего не нужно.