feat(form-decompile,form-compile): картинки заголовка/подвала колонок + объектная модель картинки-ссылки (кластер column-pictures)

Декомпилятор терял картинки колонок таблиц формы:
- HeaderPicture/FooterPicture (общие для любого поля-колонки: input/check/labelField/picField)
- ValuesPicture: захват флага LoadTransparent (раньше брался только Ref)
- EditMode у PictureField

Единый формат "картинка-ссылка" (headerPicture/footerPicture/valuesPicture):
скаляр (Ref, loadTransparent=false — частый случай по корпусу ~64%) ИЛИ
объект {src, loadTransparent:true} для отклонения. Платформа всегда эмитит
<xr:LoadTransparent>, дефолт DSL=false. Флаг на каждой картинке (на одном
поле их бывает несколько).

Компилятор: HeaderPicture эмитится сразу после <EditMode> (порядок XDTO
строгий — иначе LoadConfigFromFiles падает с XDTO-исключением).

Forgiving-объект для <Picture> кнопки/попапа/команды: общий хелпер
Emit-CommandPicture принимает скаляр ИЛИ {src, loadTransparent}, чтобы
модель могла описать картинку объектно по аналогии с headerPicture.
Полярность кнопки сохранена (дефолт true). Декомпилятор не трогали —
объект только на вход, раундтрип без изменений.

Раундтрип sample-2.17: TOTAL 1582→1457, dec-fail/compile-fail 0.
Снапшот picture-field пересертифицирован в 1С. Регресс 34/34 ps+python.
Декомпилятор v0.45, компилятор v1.63.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-07 18:15:36 +03:00
parent 0636ac6877
commit bc53ee2a14
6 changed files with 177 additions and 66 deletions
@@ -20,8 +20,8 @@
"on": ["Selection"], "handlers": { "Selection": "ТаблицаДанныхВыбор" },
"columns": [
{ "input": "ТаблицаДанныхНоменклатура", "path": "ТаблицаДанных.Номенклатура" },
{ "picField": "ТаблицаДанныхКартинка", "path": "ТаблицаДанных.Картинка", "titleLocation": "none", "valuesPicture": "StdPicture.Favorites", "loadTransparent": true },
{ "check": "ТаблицаДанныхКартинкаФлаг", "path": "ТаблицаДанных.Картинка", "title": "Флаг" }
{ "picField": "ТаблицаДанныхКартинка", "path": "ТаблицаДанных.Картинка", "titleLocation": "none", "editMode": "EnterOnInput", "headerPicture": "StdPicture.ExecuteTask", "valuesPicture": { "src": "StdPicture.FilterCriterion", "loadTransparent": true } },
{ "check": "ТаблицаДанныхКартинкаФлаг", "path": "ТаблицаДанных.Картинка", "title": "Флаг", "headerPicture": { "src": "StdPicture.ClearFilter", "loadTransparent": true } }
]}
],
"attributes": [
@@ -46,9 +46,14 @@
</InputField>
<PictureField name="ТаблицаДанныхКартинка" id="17">
<DataPath>ТаблицаДанных.Картинка</DataPath>
<EditMode>EnterOnInput</EditMode>
<HeaderPicture>
<xr:Ref>StdPicture.ExecuteTask</xr:Ref>
<xr:LoadTransparent>false</xr:LoadTransparent>
</HeaderPicture>
<TitleLocation>None</TitleLocation>
<ValuesPicture>
<xr:Ref>StdPicture.Favorites</xr:Ref>
<xr:Ref>StdPicture.FilterCriterion</xr:Ref>
<xr:LoadTransparent>true</xr:LoadTransparent>
</ValuesPicture>
<ContextMenu name="ТаблицаДанныхКартинкаКонтекстноеМеню" id="18"/>
@@ -62,6 +67,10 @@
<v8:content>Флаг</v8:content>
</v8:item>
</Title>
<HeaderPicture>
<xr:Ref>StdPicture.ClearFilter</xr:Ref>
<xr:LoadTransparent>true</xr:LoadTransparent>
</HeaderPicture>
<CheckBoxType>Auto</CheckBoxType>
<TitleLocation>Right</TitleLocation>
<ContextMenu name="ТаблицаДанныхКартинкаФлагКонтекстноеМеню" id="21"/>