feat(form-decompile,form-compile): параметры выбора / связи параметров выбора / связь по типу (кластер ChoiceParameters)

Покрытие трёх конструкций поля ввода (InputField), массовых в корпусе
(ChoiceParameters 844 / ChoiceParameterLinks 685 / TypeLink 84 файлов):

- choiceParameters: [{name, value}] — параметры выбора. value через общий
  Normalize-ChoiceValue (bool/число/строка/ref-путь + синонимы Перечисление./
  Справочник.); массив значений → v8:FixedArray. Presentation всегда пустой.
- choiceParameterLinks: [{name, dataPath, valueChange?}] — связи параметров
  выбора. valueChange дефолт Clear (опускается декомпилятором), forgiving
  Clear/DontChange + рус.синонимы. DataPath xsi:type=xs:string.
- typeLink: {dataPath, linkItem} — связь по типу. linkItem дефолт 0.

Декомпилятор: регистрация app namespace; инверсные хелперы (FixedArray →
массив, дефолт Clear опускается). Компилятор ps1 + зеркало py (байт-в-байт).
Spec: секция в #### input. Тест-кейс input-fields расширен полем со всеми
тремя конструкциями; round-trip бит-в-бит на 3 реальных формах; снэпшот
сертифицирован загрузкой в 1С 8.3.24.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-07 21:59:26 +03:00
co-authored by Claude Opus 4.8
parent d88859580f
commit 0397d8f37e
6 changed files with 404 additions and 25 deletions
@@ -26,6 +26,18 @@
{ "value": "Второй", "presentation": "Второй вариант" }
]},
{ "input": "ПолеПодсказка", "path": "ПолеПодсказка", "inputHint": "Введите значение...", "title": "Подсказка" },
{ "input": "ПолеСвязи", "path": "ПолеСвязи", "title": "Поле со связями",
"choiceParameters": [
{ "name": "Отбор.Активный", "value": true },
{ "name": "Отбор.Вид", "value": "Основной" },
{ "name": "Отбор.Список", "value": ["Один", "Два"] }
],
"choiceParameterLinks": [
{ "name": "Отбор.Организация", "dataPath": "ОбычноеПоле" },
{ "name": "Отбор.Тип", "dataPath": "ПолеСписокВыбора", "valueChange": "DontChange" }
],
"typeLink": { "dataPath": "ПолеПодсказка", "linkItem": 0 }
},
{ "check": "Флаг", "path": "Флаг", "title": "Включено" },
{ "check": "ФлагПлатформенный", "path": "ФлагПлатформенный", "title": "Слева", "titleLocation": "" },
{ "check": "ФлагЯвный", "path": "ФлагЯвный", "title": "Сверху", "titleLocation": "top" },
@@ -39,6 +51,7 @@
{ "name": "ПолеСКнопками", "type": "string" },
{ "name": "ПолеСписокВыбора", "type": "string" },
{ "name": "ПолеПодсказка", "type": "string" },
{ "name": "ПолеСвязи", "type": "string" },
{ "name": "Флаг", "type": "boolean" },
{ "name": "ФлагПлатформенный", "type": "boolean" },
{ "name": "ФлагЯвный", "type": "boolean" },