feat(form-decompile,form-compile): формат и формат редактирования (Format/EditFormat)

Ключи format/editFormat на InputField/LabelField/CheckBoxField (1408/958
файлов в корпусе). LocalStringType как inputHint/title: строка или {ru,en} —
переиспользование Emit-MLText (компилятор) и Get-LangText (декомпилятор).
Декомпилятор: хелпер Add-FormatProps в 3 ветках. Зеркало py.

Round-trip чистый (0 остатка на 30 формах с Format/EditFormat). Кейс
input-fields: format/editFormat строкой на input/check + мультиязык-объект
на labelField; снэпшот сертифицирован загрузкой в 1С.

Заодно добавлены забытые ключи (format/editFormat/choiceParameters/
choiceParameterLinks/typeLink) в allowlist knownKeys (ps1+py), чтобы не
сыпать ложный warning «unknown key».

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-07 22:53:29 +03:00
parent d0bb26b068
commit 929d1676bb
6 changed files with 78 additions and 6 deletions
@@ -16,8 +16,8 @@
"input": {
"title": "Поля ввода",
"elements": [
{ "input": "ОбычноеПоле", "path": "ОбычноеПоле", "title": "Обычное поле", "tooltip": "Введите значение поля", "tooltipRepresentation": "ShowBottom", "editMode": "EnterOnInput", "horizontalStretch": false, "verticalStretch": false },
{ "labelField": "Ссылка", "path": "ОбычноеПоле", "titleLocation": "left", "hyperlink": true },
{ "input": "ОбычноеПоле", "path": "ОбычноеПоле", "title": "Обычное поле", "tooltip": "Введите значение поля", "tooltipRepresentation": "ShowBottom", "editMode": "EnterOnInput", "horizontalStretch": false, "verticalStretch": false, "format": "ЧДЦ=2", "editFormat": "ЧДЦ=2; ЧН=" },
{ "labelField": "Ссылка", "path": "ОбычноеПоле", "titleLocation": "left", "hyperlink": true, "format": { "ru": "ДЛФ=D", "en": "DLF=D" } },
{ "input": "МногострочноеПоле", "path": "МногострочноеПоле", "multiLine": true, "height": 5, "title": "Комментарий", "wrap": false, "showInHeader": false, "showInFooter": false, "autoCellHeight": true, "footerHorizontalAlign": "Right", "openButton": false, "chooseType": false },
{ "input": "ПолеПароля", "path": "ПолеПароля", "passwordMode": true, "title": "Пароль" },
{ "input": "ПолеСКнопками", "path": "ПолеСКнопками", "choiceButton": true, "clearButton": true, "title": "Выбор" },
@@ -48,7 +48,7 @@
{ "check": "Флаг", "path": "Флаг", "title": "Включено" },
{ "check": "ФлагПлатформенный", "path": "ФлагПлатформенный", "title": "Слева", "titleLocation": "" },
{ "check": "ФлагЯвный", "path": "ФлагЯвный", "title": "Сверху", "titleLocation": "top" },
{ "check": "ФлагТумблер", "path": "ФлагТумблер", "title": "Тумблер", "checkBoxType": "switcher" }
{ "check": "ФлагТумблер", "path": "ФлагТумблер", "title": "Тумблер", "checkBoxType": "switcher", "format": "БЛ=Нет; БИ=Да" }
],
"attributes": [
{ "name": "Объект", "type": "DataProcessorObject.ПоляВвода", "main": true },
@@ -27,6 +27,18 @@
<EditMode>EnterOnInput</EditMode>
<HorizontalStretch>false</HorizontalStretch>
<VerticalStretch>false</VerticalStretch>
<Format>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>ЧДЦ=2</v8:content>
</v8:item>
</Format>
<EditFormat>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>ЧДЦ=2; ЧН=</v8:content>
</v8:item>
</EditFormat>
<ContextMenu name="ОбычноеПолеКонтекстноеМеню" id="2"/>
<ExtendedTooltip name="ОбычноеПолеРасширеннаяПодсказка" id="3"/>
</InputField>
@@ -34,6 +46,16 @@
<DataPath>ОбычноеПоле</DataPath>
<TitleLocation>Left</TitleLocation>
<Hiperlink>true</Hiperlink>
<Format>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>ДЛФ=D</v8:content>
</v8:item>
<v8:item>
<v8:lang>en</v8:lang>
<v8:content>DLF=D</v8:content>
</v8:item>
</Format>
<ContextMenu name="СсылкаКонтекстноеМеню" id="5"/>
<ExtendedTooltip name="СсылкаРасширеннаяПодсказка" id="6"/>
</LabelField>
@@ -323,6 +345,12 @@
</Title>
<CheckBoxType>Switcher</CheckBoxType>
<TitleLocation>Right</TitleLocation>
<Format>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>БЛ=Нет; БИ=Да</v8:content>
</v8:item>
</Format>
<ContextMenu name="ФлагТумблерКонтекстноеМеню" id="38"/>
<ExtendedTooltip name="ФлагТумблерРасширеннаяПодсказка" id="39"/>
</CheckBoxField>