feat(form-decompile,form-compile): tooltip элемента + фикс экранирования текста (кластер ToolTip)

Два дефекта вокруг текста <v8:content>, оба вскрылись на формах с подсказками.

1. ToolTip элемента (484 LOST в корпусе). <ToolTip> — прямой мультиязычный
   текст подсказки на элементе (UsualGroup 42150, Popup, Page, InputField,
   и почти все типы). Декомпилятор пропускал (как companion), компилятор не
   эмитил. Введён общий ключ tooltip (string|{ru,en}), как title:
   - декомпилятор: захват в Add-CommonProps;
   - компилятор: эмиссия в Emit-Title (сразу после Title) — покрывает все
     эмиттеры, зовущие Emit-Title.
   Попутно выяснилось, что Emit-Pages/Emit-CommandBar вовсе не звали Emit-Title
   (теряли и Title, и ToolTip), а Emit-Label эмитит Title по-своему — во все три
   добавлена обработка title/tooltip.

2. Экранирование кавычек. Esc-Xml экранировал " → &quot; в тексте элемента,
   но 1С в <v8:content> пишет " литерально (экранирует только & < >).
   Это ломало раундтрип любого текста с кавычками. Убрано экранирование " .

Декомпилятор (ps1) + компилятор (ps1+py) + spec (§4.1 tooltip). Покрытие:
input-fields (input+tooltip), pages (pages/page tooltip, page с кавычкой в
тексте — проверяет литеральность) — сертифицировано в 1С 8.3.24. Раундтрип
БанковскиеСчета/Wildberries/АдреснаяКнига: ToolTip и &quot; остаток = 0.
Регресс ps+py 33/33.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-05 15:36:30 +03:00
parent c43041c0b7
commit 22e929ecb3
8 changed files with 52 additions and 10 deletions
@@ -16,7 +16,7 @@
"input": {
"title": "Поля ввода",
"elements": [
{ "input": "ОбычноеПоле", "path": "ОбычноеПоле", "title": "Обычное поле", "editMode": "EnterOnInput" },
{ "input": "ОбычноеПоле", "path": "ОбычноеПоле", "title": "Обычное поле", "tooltip": "Введите значение поля", "editMode": "EnterOnInput" },
{ "labelField": "Ссылка", "path": "ОбычноеПоле", "titleLocation": "left", "hyperlink": true },
{ "input": "МногострочноеПоле", "path": "МногострочноеПоле", "multiLine": true, "height": 5, "title": "Комментарий" },
{ "input": "ПолеПароля", "path": "ПолеПароля", "passwordMode": true, "title": "Пароль" },
+2 -2
View File
@@ -17,11 +17,11 @@
"title": "Мастер настройки",
"properties": { "autoTitle": false },
"elements": [
{ "pages": "СтраницыМастера", "pagesRepresentation": "None", "children": [
{ "pages": "СтраницыМастера", "pagesRepresentation": "None", "tooltip": "Страницы мастера настройки", "children": [
{ "page": "Шаг1", "title": "", "children": [
{ "input": "Параметр1", "path": "Параметр1" }
]},
{ "page": "Шаг2", "title": "Результат", "children": [
{ "page": "Шаг2", "title": "Результат", "tooltip": "Шаг \"Результат\"", "children": [
{ "input": "Итог", "path": "Итог", "readOnly": true }
]}
]},
@@ -17,6 +17,12 @@
<v8:content>Обычное поле</v8:content>
</v8:item>
</Title>
<ToolTip>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Введите значение поля</v8:content>
</v8:item>
</ToolTip>
<EditMode>EnterOnInput</EditMode>
<ContextMenu name="ОбычноеПолеКонтекстноеМеню" id="2"/>
<ExtendedTooltip name="ОбычноеПолеРасширеннаяПодсказка" id="3"/>
@@ -10,6 +10,12 @@
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
<Pages name="СтраницыМастера" id="1">
<ToolTip>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Страницы мастера настройки</v8:content>
</v8:item>
</ToolTip>
<PagesRepresentation>None</PagesRepresentation>
<ExtendedTooltip name="СтраницыМастераРасширеннаяПодсказка" id="2"/>
<ChildItems>
@@ -30,6 +36,12 @@
<v8:content>Результат</v8:content>
</v8:item>
</Title>
<ToolTip>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Шаг "Результат"</v8:content>
</v8:item>
</ToolTip>
<ExtendedTooltip name="Шаг2РасширеннаяПодсказка" id="9"/>
<ChildItems>
<InputField name="Итог" id="10">