diff --git a/.claude/skills/form-compile/scripts/form-compile.ps1 b/.claude/skills/form-compile/scripts/form-compile.ps1
index e17ec49e..2f614b77 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.108 — Compile 1C managed form from JSON or object metadata
+# form-compile v1.109 — Compile 1C managed form from JSON or object metadata
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[string]$JsonPath,
@@ -3326,6 +3326,13 @@ function Emit-Appearance {
function Emit-Layout {
param($el, [string]$indent, [switch]$skipHeight, [bool]$multiLineDefault = $false)
+ # CommandSet (отключённые команды редактора) — общее свойство поля (input/label/check/
+ # spreadsheet/html/formatted/picture); в схеме рано (после TitleLocation, перед скалярами).
+ if ($el.excludedCommands -and @($el.excludedCommands).Count -gt 0) {
+ X "$indent"
+ foreach ($cmd in $el.excludedCommands) { X "$indent`t$cmd" }
+ X "$indent"
+ }
Emit-CommonElementProps -el $el -indent $indent
$amwExplicit = ($el.PSObject.Properties.Name -contains 'autoMaxWidth')
if ($amwExplicit) {
@@ -4235,11 +4242,7 @@ function Emit-Table {
if ($el.searchControlLocation) { X "$inner$($el.searchControlLocation)" }
Emit-Layout -el $el -indent $inner
- if ($el.excludedCommands -and $el.excludedCommands.Count -gt 0) {
- X "$inner"
- foreach ($cmd in $el.excludedCommands) { X "$inner`t$cmd" }
- X "$inner"
- }
+ # CommandSet таблицы эмитится через Emit-Layout (общий механизм поля)
# Оформление (цвета/граница таблицы) — перед компаньонами
Emit-Appearance -el $el -indent $inner -profile 'field'
diff --git a/.claude/skills/form-compile/scripts/form-compile.py b/.claude/skills/form-compile/scripts/form-compile.py
index 3ed8cf4a..2d3c6fd3 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.108 — Compile 1C managed form from JSON or object metadata
+# form-compile v1.109 — Compile 1C managed form from JSON or object metadata
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import copy
@@ -3100,6 +3100,12 @@ def emit_layout(lines, el, indent, skip_height=False, multi_line_default=False):
# с историческим выводом input/label, чтобы не сдвигать существующие снапшоты.
# skip_height: подавить (зарезервирован; Table теперь эмитит generic-ом + свой ).
# multi_line_default: input без явного autoMaxWidth при multiLine → AutoMaxWidth=false.
+ # CommandSet (отключённые команды редактора) — общее свойство поля; в схеме рано (после TitleLocation).
+ if el.get('excludedCommands') and len(el['excludedCommands']) > 0:
+ lines.append(f'{indent}')
+ for cmd in el['excludedCommands']:
+ lines.append(f'{indent}\t{cmd}')
+ lines.append(f'{indent}')
emit_common_element_props(lines, el, indent)
if 'autoMaxWidth' in el:
if el.get('autoMaxWidth') is False:
@@ -3965,11 +3971,7 @@ def emit_table(lines, el, name, eid, indent):
lines.append(f'{inner}{el["searchControlLocation"]}')
emit_layout(lines, el, inner)
- if el.get('excludedCommands'):
- lines.append(f'{inner}')
- for cmd in el['excludedCommands']:
- lines.append(f'{inner}\t{cmd}')
- lines.append(f'{inner}')
+ # CommandSet таблицы эмитится через emit_layout (общий механизм поля)
# Оформление (цвета/граница таблицы) — перед компаньонами
emit_appearance(lines, el, inner, 'field')
diff --git a/.claude/skills/form-decompile/scripts/form-decompile.ps1 b/.claude/skills/form-decompile/scripts/form-decompile.ps1
index 38f7e9e7..25459527 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.84 — Decompile 1C managed Form.xml to JSON DSL (draft)
+# form-decompile v0.85 — Decompile 1C managed Form.xml to JSON DSL (draft)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
param(
@@ -1027,6 +1027,14 @@ function Add-CommonProps {
$fp = Get-PictureRef $node 'FooterPicture'; if ($null -ne $fp) { $obj['footerPicture'] = $fp }
$ev = Get-Events $node $elName
if ($ev) { $obj['events'] = $ev }
+ # CommandSet — общий для полей (input/label/check/spreadsheet/html/formatted/picture):
+ # список отключённых команд редактора. Только , пустого не бывает.
+ $csNode = $node.SelectSingleNode("lf:CommandSet", $ns)
+ if ($csNode) {
+ $exc = New-Object System.Collections.ArrayList
+ foreach ($ec in @($csNode.SelectNodes("lf:ExcludedCommand", $ns))) { [void]$exc.Add($ec.InnerText) }
+ if ($exc.Count -gt 0) { $obj['excludedCommands'] = @($exc) }
+ }
}
# --- 3. Type decompile (inverse of Emit-Type) ---
diff --git a/tests/skills/cases/form-compile/snapshots/table/DataProcessors/Таблица/Forms/Форма/Ext/Form.xml b/tests/skills/cases/form-compile/snapshots/table/DataProcessors/Таблица/Forms/Форма/Ext/Form.xml
index 152be30b..f4aebfd8 100644
--- a/tests/skills/cases/form-compile/snapshots/table/DataProcessors/Таблица/Forms/Форма/Ext/Form.xml
+++ b/tests/skills/cases/form-compile/snapshots/table/DataProcessors/Таблица/Forms/Форма/Ext/Form.xml
@@ -20,17 +20,17 @@
true
None
None
- 80
- false
- 5
- false
- UseHeightInTableRows
Add
Delete
MoveUp
MoveDown
+ 80
+ false
+ 5
+ false
+ UseHeightInTableRows