diff --git a/.claude/skills/form-compile/scripts/form-compile.ps1 b/.claude/skills/form-compile/scripts/form-compile.ps1
index cba3f986..aab26faf 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.90 — Compile 1C managed form from JSON or object metadata
+# form-compile v1.91 — Compile 1C managed form from JSON or object metadata
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[string]$JsonPath,
@@ -4555,7 +4555,9 @@ function Emit-Attributes {
if ($attr.main -eq $true -and $attr.type) {
$mainSaved = ("$($attr.type)") -match '^(CatalogObject|DocumentObject|ChartOfAccountsObject|ChartOfCalculationTypesObject|ChartOfCharacteristicTypesObject|ExchangePlanObject|BusinessProcessObject|TaskObject)\.' -or ("$($attr.type)") -match 'RecordManager\.'
}
- if ($attr.savedData -eq $true -or $mainSaved) {
+ # Явный ключ savedData побеждает (в т.ч. false → суппресс авто-вывода $mainSaved); нет ключа → авто.
+ $emitSaved = if ($null -ne $attr.PSObject.Properties['savedData']) { $attr.savedData -eq $true } else { $mainSaved }
+ if ($emitSaved) {
X "$innertrue"
}
# Save: сохранение значения реквизита в пользовательских настройках. true → имя;
@@ -4655,7 +4657,9 @@ function Emit-Attributes {
$st = $attr.settings
X "$inner"
$si = "$inner`t"
- # Порядок платформы: ManualQuery, DynamicDataRead, QueryText, Field*, MainTable, ListSettings
+ # Порядок платформы: AutoFillAvailableFields, ManualQuery, DynamicDataRead, QueryText, Field*, MainTable, ListSettings
+ # 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" }
X "$si$mq"
@@ -4830,6 +4834,8 @@ function Emit-Properties {
}
# Convert boolean to lowercase string (PS renders as True/False)
$val = $p.Value
+ # Пустая строка = суппресс-маркер (напр. autoTitle:"" — не эмитить и не додумывать)
+ if ($val -is [string] -and $val -eq '') { continue }
if ($val -is [bool]) {
$val = if ($val) { "true" } else { "false" }
}
diff --git a/.claude/skills/form-compile/scripts/form-compile.py b/.claude/skills/form-compile/scripts/form-compile.py
index ee50a010..e9c81e0d 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.90 — Compile 1C managed form from JSON or object metadata
+# form-compile v1.91 — Compile 1C managed form from JSON or object metadata
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import copy
@@ -4273,7 +4273,9 @@ def emit_attributes(lines, attrs, indent):
if attr.get('main') is True and attr.get('type'):
t = str(attr['type'])
main_saved = bool(re.match(r'^(CatalogObject|DocumentObject|ChartOfAccountsObject|ChartOfCalculationTypesObject|ChartOfCharacteristicTypesObject|ExchangePlanObject|BusinessProcessObject|TaskObject)\.', t)) or ('RecordManager.' in t)
- if attr.get('savedData') is True or main_saved:
+ # Явный ключ savedData побеждает (в т.ч. False → суппресс авто-вывода main_saved); нет ключа → авто.
+ emit_saved = (attr['savedData'] is True) if 'savedData' in attr else main_saved
+ if emit_saved:
lines.append(f'{inner}true')
# Save: сохранение значения реквизита в пользовательских настройках. true → имя;
# строка/массив → под-поля с авто-префиксом "имя." (путь с точкой / UUID / =имя — как есть).
@@ -4361,6 +4363,10 @@ def emit_attributes(lines, attrs, indent):
s = attr['settings']
lines.append(f'{inner}')
si = f'{inner}\t'
+ # Порядок платформы: AutoFillAvailableFields, ManualQuery, DynamicDataRead, QueryText, Field*, MainTable, ListSettings
+ # AutoFillAvailableFields — дефолт true; эмитим только при заданном ключе (отклонение).
+ if s.get('autoFillAvailableFields') is not 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'
@@ -4519,6 +4525,9 @@ def emit_properties(lines, props, indent):
# Auto PascalCase
xml_name = p_name[0].upper() + p_name[1:]
+ # Пустая строка = суппресс-маркер (напр. autoTitle:"" — не эмитить и не додумывать)
+ if isinstance(p_value, str) and p_value == '':
+ continue
# Convert boolean to lowercase
if isinstance(p_value, bool):
val = 'true' if p_value else 'false'
diff --git a/.claude/skills/form-decompile/scripts/form-decompile.ps1 b/.claude/skills/form-decompile/scripts/form-decompile.ps1
index 57a0441a..00d47531 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.66 — Decompile 1C managed Form.xml to JSON DSL (draft)
+# form-decompile v0.68 — Decompile 1C managed Form.xml to JSON DSL (draft)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
param(
@@ -1658,7 +1658,7 @@ $titleNode = $root.SelectSingleNode("lf:Title", $ns)
if ($titleNode) { $t = Get-LangText $titleNode; if ($null -ne $t) { $dsl['title'] = $t } }
# properties (прямые скаляры под