diff --git a/.claude/skills/form-compile/scripts/form-compile.ps1 b/.claude/skills/form-compile/scripts/form-compile.ps1
index 3c5f04d3..e43a3018 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.27 — Compile 1C managed form from JSON or object metadata
+# form-compile v1.28 — Compile 1C managed form from JSON or object metadata
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[string]$JsonPath,
@@ -1922,7 +1922,8 @@ function Emit-Element {
"children"=1;"columns"=1
# table-specific
"changeRowSet"=1;"changeRowOrder"=1;"header"=1;"footer"=1
- "commandBarLocation"=1;"searchStringLocation"=1
+ "commandBarLocation"=1;"searchStringLocation"=1;"viewStatusLocation"=1;"searchControlLocation"=1
+ "excludedCommands"=1
"choiceMode"=1;"initialTreeView"=1;"enableDrag"=1;"enableStartDrag"=1
"rowPictureDataPath"=1;"tableAutofill"=1
# pages-specific
@@ -2528,8 +2529,16 @@ function Emit-Table {
if ($el.enableStartDrag -eq $true) { X "$innertrue" }
if ($el.enableDrag -eq $true) { X "$innertrue" }
if ($el.rowPictureDataPath) { X "$inner$($el.rowPictureDataPath)" }
+ if ($el.viewStatusLocation) { X "$inner$($el.viewStatusLocation)" }
+ if ($el.searchControlLocation) { X "$inner$($el.searchControlLocation)" }
Emit-Layout -el $el -indent $inner -skipHeight
+ if ($el.excludedCommands -and $el.excludedCommands.Count -gt 0) {
+ X "$inner"
+ foreach ($cmd in $el.excludedCommands) { X "$inner`t$cmd" }
+ X "$inner"
+ }
+
# Companions
Emit-Companion -tag "ContextMenu" -name "${name}КонтекстноеМеню" -indent $inner
# AutoCommandBar — with optional Autofill control
diff --git a/.claude/skills/form-compile/scripts/form-compile.py b/.claude/skills/form-compile/scripts/form-compile.py
index 64d9df88..773e4ab8 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.27 — Compile 1C managed form from JSON or object metadata
+# form-compile v1.28 — Compile 1C managed form from JSON or object metadata
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import copy
@@ -1356,7 +1356,8 @@ KNOWN_KEYS = {
"showTitle", "united", "collapsed",
"children", "columns",
"changeRowSet", "changeRowOrder", "header", "footer",
- "commandBarLocation", "searchStringLocation",
+ "commandBarLocation", "searchStringLocation", "viewStatusLocation", "searchControlLocation",
+ "excludedCommands",
"pagesRepresentation",
"type", "command", "stdCommand", "defaultButton", "locationInCommandBar",
"src", "valuesPicture", "loadTransparent",
@@ -2186,8 +2187,18 @@ def emit_table(lines, el, name, eid, indent):
lines.append(f'{inner}true')
if el.get('rowPictureDataPath'):
lines.append(f'{inner}{el["rowPictureDataPath"]}')
+ if el.get('viewStatusLocation'):
+ lines.append(f'{inner}{el["viewStatusLocation"]}')
+ if el.get('searchControlLocation'):
+ lines.append(f'{inner}{el["searchControlLocation"]}')
emit_layout(lines, el, inner, skip_height=True)
+ if el.get('excludedCommands'):
+ lines.append(f'{inner}')
+ for cmd in el['excludedCommands']:
+ lines.append(f'{inner}\t{cmd}')
+ lines.append(f'{inner}')
+
# Companions
emit_companion(lines, 'ContextMenu', f'{name}\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0435\u041c\u0435\u043d\u044e', inner)
# AutoCommandBar — with optional Autofill control
diff --git a/.claude/skills/form-decompile/scripts/form-decompile.ps1 b/.claude/skills/form-decompile/scripts/form-decompile.ps1
index 32690714..dcc44a9e 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.6 — Decompile 1C managed Form.xml to JSON DSL (draft)
+# form-decompile v0.7 — Decompile 1C managed Form.xml to JSON DSL (draft)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
param(
@@ -450,6 +450,15 @@ function Decompile-Element {
if ((Get-Child $node 'Footer') -eq 'true') { $obj['footer'] = $true }
$htr = Get-Child $node 'HeightInTableRows'; if ($htr) { $obj['height'] = [int]$htr }
$cbl = Get-Child $node 'CommandBarLocation'; if ($cbl) { $obj['commandBarLocation'] = $cbl }
+ $ssl = Get-Child $node 'SearchStringLocation'; if ($ssl) { $obj['searchStringLocation'] = $ssl }
+ $vsl = Get-Child $node 'ViewStatusLocation'; if ($vsl) { $obj['viewStatusLocation'] = $vsl }
+ $scl = Get-Child $node 'SearchControlLocation'; if ($scl) { $obj['searchControlLocation'] = $scl }
+ $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) }
+ }
$cols = Decompile-Children $node
if ($cols) { $obj['columns'] = $cols }
}
diff --git a/docs/form-dsl-spec.md b/docs/form-dsl-spec.md
index d8153b7c..724338d8 100644
--- a/docs/form-dsl-spec.md
+++ b/docs/form-dsl-spec.md
@@ -296,6 +296,9 @@
| `footer` | bool | Показывать подвал |
| `commandBarLocation` | string | `None`, `Top`, `Bottom`, `Auto` |
| `searchStringLocation` | string | `None`, `Top`, `Bottom`, `CommandBar`, `Auto` |
+| `viewStatusLocation` | string | `None`, `Top`, `Bottom`, `Auto` |
+| `searchControlLocation` | string | `None`, `Top`, `Bottom`, `Auto` |
+| `excludedCommands` | string[] | Исключённые стандартные команды таблицы (`Add`, `Delete`, `MoveUp`, `SortListAsc`, …) → `` |
#### columnGroup — ColumnGroup
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 e6882c9d..eefcfc45 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
@@ -12,6 +12,14 @@
Данные
true
+ None
+ None
+
+ Add
+ Delete
+ MoveUp
+ MoveDown
+
diff --git a/tests/skills/cases/form-compile/table.json b/tests/skills/cases/form-compile/table.json
index bdd3e9b3..4ceea0b7 100644
--- a/tests/skills/cases/form-compile/table.json
+++ b/tests/skills/cases/form-compile/table.json
@@ -16,7 +16,9 @@
"input": {
"title": "Просмотр данных",
"elements": [
- { "table": "Данные", "path": "Данные", "changeRowSet": true, "columns": [
+ { "table": "Данные", "path": "Данные", "changeRowSet": true,
+ "viewStatusLocation": "None", "searchControlLocation": "None",
+ "excludedCommands": ["Add", "Delete", "MoveUp", "MoveDown"], "columns": [
{ "input": "Дата", "path": "Данные.Дата" },
{ "input": "Сумма", "path": "Данные.Сумма" },
{ "input": "Комментарий", "path": "Данные.Комментарий" }