feat(meta-compile,meta-decompile): предопределённые элементы Catalog (Ext/Predefined.xml) (v1.19/v0.5)

Раундтрип-находка (класс-3, непокрытый блок — крупнейшая категория ~56k). meta-compile вообще
не генерил Ext/Predefined.xml. DSL спроектирован по данным корпуса (9309 элементов) + совместно.

DSL `predefined` (массив; строка ИЛИ объект):
- строка "(Код) Имя [Наименование]": Имя обяз.; Наименование — нет [..] → авто(Split-CamelCase),
  [] → пусто (системные/placeholder, 29% корпуса), [текст] → задано;
- объект (группа/иерархия): name/code/description/isFolder/childItems + рус.синонимы
  имя/код/наименование/группа/подчиненные (прощающий ввод).
- Код: по codeType каталога (Number→xs:decimal, String→без типа), пусто→<Code/>.

meta-compile (дуал-порт): генерация Ext/Predefined.xml (root CatalogPredefinedItems + рекурсия Item).
Заодно фикс: Esc-XmlText для ТЕКСТА элемента (& < > без экранирования кавычек — в тексте 1С держит raw).
meta-decompile: захват predefined → компактный DSL (строка/объект). Фикс PS-ловушки распаковки
одноэлементного @() из if → папки с ОДНИМ ребёнком теряли его.
spec meta-dsl-spec.md v2.4 §7.1.2; тест-кейс catalog-predefined.

Валидация: PS==PY паритет; predefined-категории 0 (PredefinedData/Item/ChildItems/Description/Code);
полный прогон −56620 (218537→161917); регресс 36/36 (ps+py); 1С-cert зелёный (грузится в платформу).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-07-01 19:48:16 +03:00
parent 58bc95264e
commit 253a4fbce0
11 changed files with 640 additions and 16 deletions
+40 -1
View File
@@ -1,6 +1,6 @@
# Meta DSL — спецификация JSON-формата для объектов метаданных 1С
Версия: 2.3
Версия: 2.4
## Обзор
@@ -275,6 +275,45 @@ JSON DSL для описания объектов метаданных конф
> Пока поддержано для **Catalog**. У прочих типов объектов — свои стандартные реквизиты и профили (будут добавлены при их проработке).
#### 7.1.2 `predefined` — предопределённые элементы
Массив предопределённых элементов справочника → файл `Ext/Predefined.xml`. Ключа нет / пустой массив → файл не создаётся. Элемент — **строка** (короткая форма, плоский случай) ЛИБО **объект** (группа/иерархия).
**Строковая форма:** `"(Код) Имя [Наименование]"`
- **Имя** — обязательный идентификатор (без пробелов).
- **`(Код)`** — опциональный префикс.
- **`[Наименование]`** — опциональный суффикс:
- нет `[...]` → Наименование **авто** из Имени (Split-CamelCase, §2);
- `[]` (пусто) → Наименование пустое (для системных/placeholder-элементов);
- `[текст]` → заданное.
```json
"predefined": [
"Основной", // Наименование авто = "Основной"
"(1) ДокументОПриемке [Документ о приемке]", // код + имя + Наименование
"ПустоеЗначение []" // Наименование пустое
]
```
**Объектная форма** (группа/иерархия):
| Ключ | Синоним | Описание |
|------|---------|----------|
| `name` | `имя` | Имя (обязательно) |
| `code` | `код` | Код |
| `description` | `наименование` | Наименование (ключа нет → авто; `""` → пусто) |
| `isFolder` | `группа` | Признак группы |
| `childItems` | `подчиненные` | Вложенные элементы (строки/объекты, рекурсивно) |
```json
{ "name": "Группа1", "isFolder": true, "description": "Прочие",
"childItems": [ "Факс", "(7) Скайп [Скайп]" ] }
```
Тип кода в XML определяется свойством каталога `codeType`: `Number``<Code xsi:type="xs:decimal">`, `String``<Code>` (без типа); пустой код → `<Code/>`.
> Пока поддержано для **Catalog** (`CatalogPredefinedItems`). ChartOf*/ПВХ — при их проработке.
### 7.2 Document
| Поле JSON | Умолчание | XML элемент |