feat(form-decompile,form-compile): вычисляемые поля + valueType поля DataSet динсписка (кластер C)

Две части пробела DataSet динамического списка:

1. Field valueType (63 формы/54). Поле набора <Field DataSetFieldField> может нести
   <dcssch:valueType> (тип значения; кастомные/вычисляемые поля). Декомпилятор ловил
   field/dataPath/title/nested, теперь и valueType (переиспользует Decompile-Type);
   компилятор эмитит после title через существующий emit_dl_value_type. 0 потерь на выборке.

2. CalculatedField (6 форм, редкое). Новый ключ settings.calculatedFields — зеркало skd:
   shorthand "Имя [Заголовок]: тип = Выражение #noField #noFilter #noGroup #noOrder"
   (порт Parse-CalcShorthand) или объект. Форм-специфика: dcssch:-теги, presentationExpression,
   orderExpression* (структура {expression,orderType,autoOrder} в namespace dcscommon с
   локальным xmlns), useRestriction{field,condition,group,order}. Эмиттер форм-специфичный
   (skd использует dcscom:-префикс и не имеет pres/orderExpression). Позиция в DataSet —
   после Field*, до Parameter*. Декомпилятор Build-CalcField (объектная форма для точного
   round-trip). Выборка calc-форм: calc-теги ушли из диффов (3/6 match, остаток — отдельный
   field appearance/presentationExpression).

Кейс dynamic-list-form (+grouping +calculatedFields: shorthand с флагами + объект с
presentationExpression/orderExpression/valueType) сертифицирован загрузкой в 1С (порядок
детей CalculatedField подтверждён платформой). Регресс 43/43 (ps1+py).

ps1==py байт-в-байт (сверено на кейсе). Фикс по пути: ps1 Parse-CalcShorthand — `\b` в
generator-heredoc превратился в backspace 0x08 → #-флаги не парсились (py был верен);
поймано прямой сверкой вывода ps1 vs py.

C-остаток (в BACKLOG): свойства обычного <Field> — presentationExpression + appearance
(формат/цвет поля) — отдельный подкластер.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-12 19:38:14 +03:00
co-authored by Claude Opus 4.8
parent 43d36119cb
commit 73b07a6fbc
6 changed files with 292 additions and 4 deletions
@@ -21,6 +21,11 @@
"mainTable": "Catalog.Товары", "dynamicDataRead": true, "autoSaveUserSettings": false,
"parameters": [ { "name": "ВыборТовара", "type": "CatalogRef.Товары", "valueListAllowed": true, "value": null } ],
"grouping": "Description > Code",
"calculatedFields": [
"Метка [Метка строки]: string = Code + \" \" + Description #noFilter #noGroup",
{ "dataPath": "Сорт", "expression": "Code", "title": "Сорт", "valueType": "string(10)",
"presentationExpression": "Code", "orderExpression": [ { "expression": "Code" } ] }
],
"order": [ "Description", "Code desc" ],
"filter": [ "Артикул = _ @off @user", "Артикул like %тест%", "Description подобно %abc%",
{ "field": "Code", "op": "=", "userSettingID": "auto", "userSettingPresentation": "Код товара" },
@@ -100,6 +100,50 @@
<Settings xsi:type="DynamicList">
<ManualQuery>false</ManualQuery>
<DynamicDataRead>true</DynamicDataRead>
<CalculatedField>
<dcssch:dataPath>Метка</dcssch:dataPath>
<dcssch:expression>Code + " " + Description</dcssch:expression>
<dcssch:title xsi:type="v8:LocalStringType">
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Метка строки</v8:content>
</v8:item>
</dcssch:title>
<dcssch:useRestriction>
<dcssch:condition>true</dcssch:condition>
<dcssch:group>true</dcssch:group>
</dcssch:useRestriction>
<dcssch:valueType>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>0</v8:Length>
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</dcssch:valueType>
</CalculatedField>
<CalculatedField>
<dcssch:dataPath>Сорт</dcssch:dataPath>
<dcssch:expression>Code</dcssch:expression>
<dcssch:title xsi:type="v8:LocalStringType">
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Сорт</v8:content>
</v8:item>
</dcssch:title>
<dcssch:presentationExpression>Code</dcssch:presentationExpression>
<dcssch:orderExpression>
<expression xmlns="http://v8.1c.ru/8.1/data-composition-system/common">Code</expression>
<orderType xmlns="http://v8.1c.ru/8.1/data-composition-system/common">Asc</orderType>
<autoOrder xmlns="http://v8.1c.ru/8.1/data-composition-system/common">false</autoOrder>
</dcssch:orderExpression>
<dcssch:valueType>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>10</v8:Length>
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</dcssch:valueType>
</CalculatedField>
<Parameter>
<dcssch:name>ВыборТовара</dcssch:name>
<dcssch:title xsi:type="v8:LocalStringType">