fix(xdto-compile,xdto-validate): признак фиксированного значения без самого значения

В модели XDTO fixed — булев признак, а значение лежит в default; в XML-схеме
fixed="V" совмещает и признак, и значение. Компилятор оба идиома принимал, но
не проверял принятое: зеркало xdto:fixed="true" без default собиралось молча
в пакет, который платформа отвергает («Отсутствует фиксированное значение
свойства»). Прощающий ввод был сделан наполовину.

xdto-validate v1.1 — два ERROR: значение попало в признак (fixed не булев)
и признак без значения. Формулировка второго повторяет платформенную дословно,
чтобы отказ загрузки и наш вывод читались как одно и то же.

xdto-compile v1.1 — то же условие предупреждением на сборке, то есть на шаг
раньше db-update, где починить дешевле.

Кейсы: оба идиома плюс только default и атрибут (загружается в базу);
зеркало без значения — проверка диагностики, из платформенной верификации
исключено штатным skipPlatformVerify, пакет невалиден by design.

Правило откалибровано корпусом (760 пакетов, оба рантайма): 0 ложных
срабатываний, состав предупреждений не изменился. Round-trip остался
760/760 байт-в-байт.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-07-26 16:25:38 +03:00
co-authored by Claude Opus 5
parent 20d86ae10f
commit 79beba2d1f
17 changed files with 450 additions and 6 deletions
@@ -1,4 +1,4 @@
# xdto-validate v1.0 — Validate a 1C XDTO package (Python port)
# xdto-validate v1.1 — Validate a 1C XDTO package (Python port)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import os
@@ -385,10 +385,25 @@ for p in pkg.iter():
report_error(f'Свойство "{p.get("name")}": lowerBound ({lb}) больше upperBound ({ub})')
if p.get("name") is None and p.get("ref") is None:
report_error("Свойство без name и без ref")
# В модели XDTO fixed — булев признак, само значение лежит в default.
# В XML-схеме наоборот: fixed="V" совмещает признак и значение.
fx = p.get("fixed")
if fx is not None:
p_name = p.get("name") if p.get("name") is not None else p.get("ref")
if fx not in ("true", "false"):
report_error(
f'Свойство "{p_name}": fixed="{fx}" — в модели это булев признак, '
"значение задаётся в default (в XML-схеме признак и значение совмещены в fixed)"
)
elif fx == "true" and p.get("default") is None:
report_error(
f"Отсутствует фиксированное значение свойства '{p_name}': "
'есть fixed="true", нет default'
)
if state["stopped"]:
break
if not state["stopped"]:
report_ok("Свойства: form и кратности корректны")
report_ok("Свойства: form, кратности и фиксированные значения корректны")
# ── 10b. structural consistency ──────────────────────────────