feat(meta-compile,meta-validate): проверки на тип-множество там, где его не принимают

Запрет неочевидный, а отказ платформы приходит поздно и одной строкой из
Конфигуратора. Три уровня строгости, все замерены загрузкой в базу на
8.3.24.1691, а не выведены из документации:

- ОШИБКА — множество в составе определяемого типа. Платформа отвергает файл
  целиком («ОпределяемыйТип.<Имя> - Недопустимый тип»); проверено на
  ОпределяемыйТип, Характеристика, ЛюбаяСсылка и голых ссылках, контрольный
  вариант с обычным CatalogRef.<Имя> принят. Отсюда и ноль таких узлов в
  корпусе — это запрет, а не совпадение.
- ПРЕДУПРЕЖДЕНИЕ — голый метатип в типе значения ПВХ. Загрузка проходит, но
  Конфигуратор такой тип не предлагает: в дереве выбора СправочникСсылка и
  ДокументСсылка — папки без флажка, а ЛюбаяСсылки там нет вовсе. Плюс AnyRef
  раундтрипом возвращается как AnyIBRef, то есть молча меняется.
- ПРЕДУПРЕЖДЕНИЕ — определяемый тип одним из составного. Конфигуратор даёт
  выбрать его только единственным, но отказывать нельзя: в корпусе erp+acc
  6500 единственных против 1 составного, и этот один лежит в типовой ERP
  (Документ.НачислениеИСписаниеБонусныхБаллов.Баллы — два определяемых типа
  подряд). Навык не вправе отказаться собрать то, что поставляет 1С.

В meta-compile состав множеств берётся опросом самого эмиттера, а не второй
копией его регулярок: список видов живёт в Emit-TypeContent, и копия
разъехалась бы с ним молча.

Развёртка по 3428 объектам ERP: ровно 2 срабатывания, оба на том самом
реальном составном реквизите. Ложных нет.

Предупреждения пишутся прямо в stderr, а не через Write-Warning: в PS 5.1 тот
уходит не в тот поток (конвенция из cf-init), и до проверки они не доезжали.

Оба кейса-предупреждения проверены платформой — она эти конфигурации грузит,
что и подтверждает выбор «предупреждение, а не отказ».

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-09-20 18:45:16 +03:00
co-authored by Claude Opus 5
parent 079a177cf4
commit 1481e58bfc
67 changed files with 4022 additions and 9 deletions
+9 -4
View File
@@ -144,10 +144,15 @@ JSON DSL для описания объектов метаданных конф
Прочие менеджеры (`CatalogManager`, `DocumentManager`, …) множеством НЕ являются: голый менеджер
пишется обычным `v8:Type`.
Внутри `DefinedType` тип-множество **запрещено**: платформа отвечает «Недопустимый тип» и на
`AnyRef`, и на голый `CatalogRef`, и на `Characteristic.Xxx`, и на вложенный `DefinedType.Xxx`
(замерено на 8.3.24.1691 загрузкой в базу; контрольный вариант с обычным `CatalogRef.Xxx` принят).
Состав определяемого типа — только конкретные типы.
**Где множество принимают.** Три уровня, все замерены на 8.3.24.1691 загрузкой в базу:
| Контейнер | Что можно | Чем отвечает платформа |
|-----------|-----------|------------------------|
| `DefinedType` (состав) | только конкретные типы | «Недопустимый тип» и файл не грузится — на `AnyRef`, голый `CatalogRef`, `Characteristic.Xxx` и вложенный `DefinedType.Xxx`; контрольный `CatalogRef.Xxx` принят |
| ПВХ (`Type`/тип значения) | `DefinedType.Xxx`, `Characteristic.Xxx` | голый метатип и `AnyRef` тоже грузятся, но Конфигуратор их не предлагает (в дереве выбора это папки без флажка), а `AnyRef` возвращается с выгрузки как `AnyIBRef` |
| любой составной тип | `DefinedType.Xxx` только ЕДИНСТВЕННЫМ | одним из составного Конфигуратор выбрать не даёт, но загрузчик принимает: в корпусе erp+acc 6500 единственных против 1 составного, и этот один — в типовой ERP (`Документ.НачислениеИСписаниеБонусныхБаллов.Баллы`) |
Отсюда разная строгость проверок: состав определяемого типа — ошибка, остальные два — предупреждение.
Вывод `meta-info` печатает голое множество с суффиксом «(все)» (`ДокументОбъект (все)`) — отличать
«все» от «один» по наличию точки посреди длинного имени ненадёжно. Суффикс принимается и на входе