fix(form-compile): актуализация allowlist knownKeys (оформление + autoCmdBar)

Allowlist дрейфовал — element-level appearance-ключи (11 канонических +
12 рус.синонимов: textColor/цветтекста/font/шрифт/border/рамка/title*/footer*)
читаются через Get-AppearanceValue и НЕ переименовываются, поэтому сыпали
ложный warning «unknown key» для валидных свойств закрытого кластера Appearance.

Решение самоподдерживающееся: union allowlist с самими структурами
appearance — ps1 foreach по appearanceSpec/appearanceSynonyms.Keys после
литерала; py доп. проверка `not in APPEARANCE_SPEC/APPEARANCE_SYNONYMS`.
Не дрейфует при добавлении новых ключей/синонимов. + статический autoCmdBar.

Проверено: appearance-ключи (canonical + рус.синонимы) не предупреждают,
реальные опечатки (textColorr/bogusKey) по-прежнему ловятся — оба рантайма.
Регресс 36/36 ps1+py.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-07 23:10:32 +03:00
parent 929d1676bb
commit ad89929efd
2 changed files with 14 additions and 4 deletions
@@ -1,4 +1,4 @@
# form-compile v1.72 — Compile 1C managed form from JSON or object metadata
# form-compile v1.73 — Compile 1C managed form from JSON or object metadata
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[string]$JsonPath,
@@ -2468,7 +2468,13 @@ function Emit-Element {
"src"=1;"valuesPicture"=1;"loadTransparent"=1;"headerPicture"=1;"footerPicture"=1
# cmdBar-specific
"autofill"=1
# AutoCommandBar-маркер (autofill heuristic) на элементе/таблице
"autoCmdBar"=1
}
# Оформление (цвета/шрифты/граница) — авто-регистрация из самих структур, чтобы allowlist
# не дрейфовал при добавлении новых ключей/синонимов. Канонические + forgiving-синонимы.
foreach ($k in $script:appearanceSpec.Keys) { $knownKeys[$k] = 1 }
foreach ($k in $script:appearanceSynonyms.Keys) { $knownKeys[$k] = 1 }
foreach ($p in $el.PSObject.Properties) {
if ($p.Name -like '_*') { continue } # внутренние маркеры (напр. _dynList)
if (-not $knownKeys.ContainsKey($p.Name)) {
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# form-compile v1.72 — Compile 1C managed form from JSON or object metadata
# form-compile v1.73 — Compile 1C managed form from JSON or object metadata
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import copy
@@ -1795,6 +1795,8 @@ KNOWN_KEYS = {
"autoRefreshPeriod", "choiceFoldersAndItems", "restoreCurrentRow", "showRoot",
"allowRootChoice", "updateOnDataChange", "allowGettingCurrentRowURL",
"userSettingsGroup", "rowsPicture",
# AutoCommandBar-маркер (autofill heuristic) на элементе/таблице
"autoCmdBar",
}
# picture/picField — НИЗКИЙ приоритет: 'picture' это и тип (PictureDecoration), и свойство-иконка
@@ -2819,11 +2821,13 @@ def emit_element(lines, el, indent, in_cmd_bar=False):
print("WARNING: Unknown element type, skipping", file=sys.stderr)
return
# Validate known keys (внутренние маркеры на _ пропускаем)
# Validate known keys (внутренние маркеры на _ пропускаем). Оформление (цвета/шрифты/граница)
# проверяем против самих структур appearance — канонические ключи + forgiving-синонимы, чтобы
# allowlist не дрейфовал при добавлении новых.
for p_name in el.keys():
if p_name.startswith('_'):
continue
if p_name not in KNOWN_KEYS:
if p_name not in KNOWN_KEYS and p_name not in APPEARANCE_SPEC and p_name not in APPEARANCE_SYNONYMS:
print(f"WARNING: Element '{el.get(type_key, '')}': unknown key '{p_name}' -- ignored. Check SKILL.md for valid keys.", file=sys.stderr)
name = get_element_name(el, type_key)