feat(meta-compile,meta-decompile): значение заполнения реквизита fillValue (v1.27/v0.12)

Пара FillFromFillingValue+FillValue — единый блок «заполнения» (у top-level
реквизитов всегда, у ТЧ нет). Класс-2 фикс: boolean дефолт пустого FillValue
false→nil (модальная форма платформы, 3734 мисматча). Дефолт по типу:
String→typed-empty, Number→0, всё прочее→nil.

DSL-ключ fillValue (интерпретация по типу реквизита): bool/число/строка/дата-
литерал + null→nil-override + DTR-путь (полный рус/англ, GUID.GUID, короткая
запись по типу: EmptyRef / имя-значения перечисления / предопределённое).
Ref-резолвер портирован из form-compile (+ПустаяСсылка/Истина/Ложь, гард
составного типа). Декомпилятор: захват FillValue с omit-при-дефолте.

remaining=0 на выборке категории Attribute>FillValue (baseline-impact 7222),
регресс 39/39 ps1+py. spec v2.7 §4.2, кейс catalog-attr-fillvalue.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-07-03 17:46:31 +03:00
parent d8146e1f1b
commit b93fd0807f
11 changed files with 1351 additions and 42 deletions
+29 -1
View File
@@ -1,6 +1,6 @@
# Meta DSL — спецификация JSON-формата для объектов метаданных 1С
Версия: 2.6
Версия: 2.7
## Обзор
@@ -146,6 +146,7 @@ JSON DSL для описания объектов метаданных конф
| `fillChecking` | FillChecking | DontCheck | DontCheck/ShowError/ShowWarning. Синоним `fillCheck` (из формы; `true`→ShowError). Флаг `req`→ShowError |
| `fullTextSearch` | FullTextSearch | Use | Use/DontUse |
| `fillFromFillingValue` | FillFromFillingValue | false | bool |
| `fillValue` | FillValue | по типу (см. ниже) | значение заполнения — bool/число/строка/дата/DTR-путь; `null` → nil |
| `createOnInput` | CreateOnInput | Auto | Auto/Use/DontUse |
| `quickChoice` | QuickChoice | Auto | Auto/Use/DontUse. Прощаем bool (форм-стиль): `true`→Use, `false`→DontUse |
| `dataHistory` | DataHistory | Use | Use/DontUse |
@@ -157,6 +158,33 @@ JSON DSL для описания объектов метаданных конф
| `indexing` | Indexing | DontIndex | флаги `index`/`indexAdditional` |
| `multiLine` | MultiLine | false | bool (флаг `multiline`) |
**`fillValue` — значение заполнения реквизита** (`<FillValue>`). Пара с `fillFromFillingValue` — единый блок
«заполнения» (недоступен у реквизитов ТЧ; там оба свойства не эмитятся). Форма **пустого** значения зависит от
типа реквизита (то же, что «пустое» значение типа), компилятор выводит её сам — ключ **не задают**:
| Тип реквизита | Пустое значение (без ключа) |
|---------------|-----------------------------|
| String | `<FillValue xsi:type="xs:string"/>` |
| Number | `<FillValue xsi:type="xs:decimal">0</FillValue>` |
| Boolean, Date, ссылочный, составной, TypeSet | `<FillValue xsi:nil="true"/>` |
Ключ `fillValue` задают только для **реального** значения; интерпретация — по типу реквизита:
- **Boolean** — `true`/`false` (прощаем `"Истина"`/`"Ложь"`, `"да"`/`"нет"`).
- **Number** — число или строка-число (`1.5`, `"21"`).
- **String** — строковый литерал (без ссылочной/датовой детекции).
- **Date** — ISO-строка `"0001-01-01T00:00:00"` (или `"2020-01-01"` → добавит время).
- **Ссылочный / составной / TypeSet** — DTR-путь:
- полный: `"Catalog.Валюты.EmptyRef"`, `"Enum.Периодичность.EnumValue.Месяц"`, `"Catalog.СтраныМира.Россия"`;
- русские метатипы: `"Справочник.Валюты.ПустаяСсылка"`, `"Перечисление.Периодичность.ЗначениеПеречисления.Год"`;
- GUID-ссылка `"<guid>.<guid>"` (несётся verbatim);
- **короткая запись** по типу реквизита (одно имя, без точки): `"EmptyRef"`/`"ПустаяСсылка"` → пустая ссылка типа;
для `EnumRef` — имя значения (`"Месяц"``Enum.<Тип>.EnumValue.Месяц`); для прочих — имя предопределённого
(`"Россия"``Catalog.<Тип>.Россия`). Для составного типа короткая запись запрещена (нужен полный путь).
- **`null`** — явный `<FillValue xsi:nil="true"/>` (для String/Number, где нужно nil вместо пустого значения типа).
> `EmptyRef` («пустая ссылка типа X») ≠ `null` («значение не задано»): платформа хранит их различно, оба сохраняются.
Тип можно задать единой строкой (`"type": "String(100)"`) или раздельными полями:
```json