fix(form-compile): внятный отказ на группу additionalColumns без ключа columns

PS-порт падал с «Не удается индексировать в массив NULL»: @($null).Count в
PowerShell равен единице, поэтому ветка самозакрывающегося тега была
недостижима, и код шёл эмитить несуществующую колонку. PY на том же входе
молча писал пустую группу — портируемого поведения не было вовсе.

Разведены два случая, которые до сих пор путались:
- `"columns": []` — явно пустая группа, законная форма (платформа так
  пишет таблицу без доп. колонок). Работает как работала, self-closing;
- ключа `columns` нет вовсе — недосказанность автора: «доп. колонки есть»,
  а какие, не сказано. Теперь отказ с указанием, что делать.

Валидатор такое по-прежнему пропускает: в выгрузке платформы пустая группа
встречается, запрет на авторинг не равен запрету на существование.

Заодно кейс cfe-borrow/form-main-attr-columns вернулся к форме эталона
Конфигуратора — таблица без колонок описана явно пустым списком, как в
выгрузке, а не обходным манёвром вокруг падения.
This commit is contained in:
Nick Shirokov
2026-08-12 17:01:10 +03:00
parent a6cb656a2d
commit c9b64f3a0d
6 changed files with 157 additions and 64 deletions
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# form-compile v1.191 — Compile 1C managed form from JSON or object metadata (+write_xml_file/write_utf8_bom: общий эталон записи)
# form-compile v1.192 — Compile 1C managed form from JSON or object metadata (гвард на группу additionalColumns без ключа columns)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import copy
@@ -5773,9 +5773,18 @@ def emit_attributes(lines, attrs, indent, conditional_appearance=None):
emit_attr_column(lines, col, f'{inner}\t')
if has_add_cols:
for ac in attr['additionalColumns']:
ac_cols = ac.get('columns') or []
# Пустой список колонок задаётся ЯВНО (`"columns": []`) — это законная форма,
# платформа так пишет таблицу, у которой доп. колонок нет. А вот отсутствие ключа
# — недосказанность автора: «доп. колонки есть», а какие, не указано. PS-порт на
# этом падал с «Не удается индексировать в массив NULL» (@($null).Count = 1).
if ac.get('columns') is None:
print(f"additionalColumns group for table '{ac['table']}': key 'columns' is missing "
"— list the columns, or pass an empty array for a table without extra columns",
file=sys.stderr)
sys.exit(1)
ac_cols = ac['columns']
if not ac_cols:
# Пустая группа доп.колонок (table-ref без колонок) → self-closing (как платформа)
# Явно пустая группа → self-closing (как платформа)
lines.append(f'{inner}\t<AdditionalColumns table="{ac["table"]}"/>')
continue
lines.append(f'{inner}\t<AdditionalColumns table="{ac["table"]}">')