feat(form-decompile,form-compile): TitleLocation у LabelField/PictureField/Table (кластер TitleLocation)

TitleLocation обрабатывался только у input (passthrough), check/radio
(smart-default) и calendar. У LabelField (7362 в корпусе), PictureField (2479)
и Table (381) тег молча терялся — ни декомпилятор, ни компилятор его не знали.

Профиль доли элементов с тегом: Table 2.9%, LabelField 15.8%, PictureField
80.5% (но 20% без тега). Платформа НЕ всегда эмитит → выбран passthrough
(эмитим при наличии ключа, как у input/calendar), не smart-default. Корректно
и консистентно; переиспользован существующий ключ titleLocation + Map-TitleLoc.

Декомпилятор (ps1): захват titleLocation в трёх ветках. Компилятор (ps1+py):
эмиссия в Emit-LabelField/Emit-Table/Emit-PictureField в позиции по схеме.
spec §4.1: titleLocation вынесен в общие свойства с пометкой охвата.

Тест-покрытие добавлено в input-fields (labelField=left), picture-field
(picField=none), table (table=top) — снэпшоты сертифицированы в 1С 8.3.24.
Раундтрип 60 форм с TitleLocation на label/pic/table/radio: остатка нет.
Регресс ps+py 33/33.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-05 13:33:05 +03:00
parent 8998c0b5db
commit c43041c0b7
10 changed files with 24 additions and 6 deletions
@@ -17,7 +17,7 @@
"title": "Поля ввода",
"elements": [
{ "input": "ОбычноеПоле", "path": "ОбычноеПоле", "title": "Обычное поле", "editMode": "EnterOnInput" },
{ "labelField": "Ссылка", "path": "ОбычноеПоле", "hyperlink": true },
{ "labelField": "Ссылка", "path": "ОбычноеПоле", "titleLocation": "left", "hyperlink": true },
{ "input": "МногострочноеПоле", "path": "МногострочноеПоле", "multiLine": true, "height": 5, "title": "Комментарий" },
{ "input": "ПолеПароля", "path": "ПолеПароля", "passwordMode": true, "title": "Пароль" },
{ "input": "ПолеСКнопками", "path": "ПолеСКнопками", "choiceButton": true, "clearButton": true, "title": "Выбор" },
@@ -20,7 +20,7 @@
"on": ["Selection"], "handlers": { "Selection": "ТаблицаДанныхВыбор" },
"columns": [
{ "input": "ТаблицаДанныхНоменклатура", "path": "ТаблицаДанных.Номенклатура" },
{ "picField": "ТаблицаДанныхКартинка", "path": "ТаблицаДанных.Картинка", "valuesPicture": "StdPicture.Favorites", "loadTransparent": true },
{ "picField": "ТаблицаДанныхКартинка", "path": "ТаблицаДанных.Картинка", "titleLocation": "none", "valuesPicture": "StdPicture.Favorites", "loadTransparent": true },
{ "check": "ТаблицаДанныхКартинкаФлаг", "path": "ТаблицаДанных.Картинка", "title": "Флаг" }
]}
],
@@ -23,6 +23,7 @@
</InputField>
<LabelField name="Ссылка" id="4">
<DataPath>ОбычноеПоле</DataPath>
<TitleLocation>Left</TitleLocation>
<Hiperlink>true</Hiperlink>
<ContextMenu name="СсылкаКонтекстноеМеню" id="5"/>
<ExtendedTooltip name="СсылкаРасширеннаяПодсказка" id="6"/>
@@ -45,6 +45,7 @@
</InputField>
<PictureField name="ТаблицаДанныхКартинка" id="16">
<DataPath>ТаблицаДанных.Картинка</DataPath>
<TitleLocation>None</TitleLocation>
<ValuesPicture>
<xr:Ref>StdPicture.Favorites</xr:Ref>
<xr:LoadTransparent>true</xr:LoadTransparent>
@@ -11,6 +11,7 @@
<ChildItems>
<Table name="Данные" id="1">
<DataPath>Данные</DataPath>
<TitleLocation>Top</TitleLocation>
<ChangeRowSet>true</ChangeRowSet>
<ViewStatusLocation>None</ViewStatusLocation>
<SearchControlLocation>None</SearchControlLocation>
+1 -1
View File
@@ -16,7 +16,7 @@
"input": {
"title": "Просмотр данных",
"elements": [
{ "table": "Данные", "path": "Данные", "changeRowSet": true,
{ "table": "Данные", "path": "Данные", "changeRowSet": true, "titleLocation": "top",
"viewStatusLocation": "None", "searchControlLocation": "None",
"excludedCommands": ["Add", "Delete", "MoveUp", "MoveDown"], "columns": [
{ "input": "Дата", "path": "Данные.Дата" },