fix(meta-compile,meta-validate): «только единственным» касается и характеристики

Правило было уже реальности: Конфигуратор не даёт включить характеристику в
составной тип вместе ни с каким другим типом — в том числе с другой
характеристикой. Предупреждение теперь ловит и DefinedType.X, и
Characteristic.X.

Корпус подтверждает даже чище, чем для определяемого типа: 1741 характеристика
единственным типом и 0 в составных (у определяемого было 6500 против 1).
Уровень прежний — предупреждение: загрузчик такое принимает, проверено
загрузкой в базу.

Голых метатипов это не касается: DocumentRef + CatalogRef — обычный составной
тип, 525 вхождений в поставляемых ERP и БП.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-09-20 19:54:29 +03:00
co-authored by Claude Opus 5
parent 0db3656c9c
commit dd0ad18076
14 changed files with 466 additions and 29 deletions
@@ -1674,8 +1674,8 @@ if not bad_grammar and not not_storable and not unknown_vocab and types_seen:
# WARN — голый метатип в типе значения ПВХ: загрузка проходит, но Конфигуратор такой тип не
# предлагает (в дереве выбора это папка без флажка), а ЛюбаяСсылка на выгрузке
# возвращается как ЛюбаяСсылкаИБ;
# WARN — определяемый тип одним из составного: Конфигуратор даёт выбрать его только
# единственным. В корпусе erp+acc 6500 единственных против 1 составного — и этот один
# WARN — определяемый тип или характеристика одним из составного: Конфигуратор даёт
# выбрать их только единственными (характеристику — даже с другой характеристикой). В корпусе erp+acc 6500 единственных против 1 составного — и этот один
# лежит в типовой ERP (Документ.НачислениеИСписаниеБонусныхБаллов.Баллы), поэтому не ошибка.
dt_sets_seen = 0
dt_sets_bad = False
@@ -1696,9 +1696,9 @@ for tb in root.xpath("//md:Type | //md:ValueType", namespaces=NS):
if owner_kind == "ChartOfCharacteristicTypes" and not re.match(r'^DefinedType[.]', raw):
dt_sets_bad = True
report_warn(f"23. План видов характеристик '{obj_name}': тип значения '{raw}' Конфигуратор не предлагает (в дереве выбора это папка без флажка); ЛюбаяСсылка на выгрузке вернётся как ЛюбаяСсылкаИБ")
if members > 1 and re.match(r'^DefinedType[.]', raw):
if members > 1 and re.match(r'^(DefinedType|Characteristic)[.]', raw):
dt_sets_bad = True
report_warn(f"23. Составной тип содержит определяемый тип '{raw}' — Конфигуратор даёт выбрать его только единственным; платформа загрузит")
report_warn(f"23. Составной тип содержит '{raw}' — Конфигуратор даёт выбрать определяемый тип и характеристику только единственным; платформа загрузит")
if dt_sets_seen and not dt_sets_bad:
report_ok(f"23. Type sets: {dt_sets_seen} block(s) checked")