feat(form-decompile,form-compile): InputField availableTypes + typeDomainEnabled (ограничение доступных типов)

Раундтрип терял блок ограничения типов у поля ввода на составном/характеристика-типе:
<TypeDomainEnabled> + <AvailableTypes> (напр. ЯндексМаркетВитринаФулфилмент/РегламентноеЗадание —
поле ИмяПользователя с AvailableTypes=xs:string Length=0 Variable).

Корпус (acc+erp 8.3.24): AvailableTypes встречается в 18 местах, ВСЕ — на InputField (полное
покрытие scope). Содержимое — стандартный 1С type-description (<v8:Type>+qualifiers), тот же
формат, что у реквизитов → переиспользуем существующий механизм типов:
- decompile: Decompile-Type на узле <AvailableTypes> → компактная DSL-строка (одиночная/мультитип "a | b")
- compile (ps1+py): Emit-Type с tag='AvailableTypes' (сам разбирает мультитип); TypeDomainEnabled — bool pass-through

availableTypes — формат типа реквизита (§Типы): одиночный или составной через "|".

Верификация: таргет-раундтрип всех 17 форм с AvailableTypes → 15 match, остаток 6 строк в 2 формах —
ДРУГИЕ категории (ExtendedTooltip/Value), не AvailableTypes; целевая форма match (было 8 → 0).
Регресс form-compile 43/43 (ps1+py); 1С-cert кейса input-fields (поле с мультитип AvailableTypes
грузится в платформу). spec обновлён.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-12 11:40:16 +03:00
co-authored by Claude Opus 4.8
parent da1d8c9297
commit 75b77caf9b
6 changed files with 74 additions and 20 deletions
@@ -50,7 +50,8 @@
{ "check": "Флаг", "path": "Флаг", "title": "Включено", "warningOnEdit": { "ru": "Изменение флага требует подтверждения", "en": "Confirm flag change" }, "extendedTooltip": { "width": 45 } },
{ "check": "ФлагПлатформенный", "path": "ФлагПлатформенный", "title": "Слева", "titleLocation": "" },
{ "check": "ФлагЯвный", "path": "ФлагЯвный", "title": "Сверху", "titleLocation": "top" },
{ "check": "ФлагТумблер", "path": "ФлагТумблер", "title": "Тумблер", "checkBoxType": "switcher", "format": "БЛ=Нет; БИ=Да" }
{ "check": "ФлагТумблер", "path": "ФлагТумблер", "title": "Тумблер", "checkBoxType": "switcher", "format": "БЛ=Нет; БИ=Да" },
{ "input": "ПолеСоставное", "path": "ПолеСоставное", "title": "Ограничение типов", "typeDomainEnabled": false, "availableTypes": "string | boolean" }
],
"attributes": [
{ "name": "Объект", "type": "DataProcessorObject.ПоляВвода", "main": true },
@@ -67,7 +68,8 @@
{ "name": "ФлагЯвный", "type": "boolean" },
{ "name": "ФлагТумблер", "type": "boolean" },
{ "name": "ЧисловоеПоле", "type": "number(10,2)" },
{ "name": "ДатаПоля", "type": "dateTime" }
{ "name": "ДатаПоля", "type": "dateTime" },
{ "name": "ПолеСоставное", "type": "string | boolean" }
],
"conditionalAppearance": [
{ "selection": ["ОбычноеПоле"], "filter": ["ЧисловоеПоле > 100"], "appearance": { "ЦветФона": "style:FormBackColor", "Текст": "Плоский текст" },
@@ -427,15 +427,35 @@
<ContextMenu name="ФлагТумблерКонтекстноеМеню" id="41"/>
<ExtendedTooltip name="ФлагТумблерРасширеннаяПодсказка" id="42"/>
</CheckBoxField>
<InputField name="ПолеСоставное" id="43">
<DataPath>ПолеСоставное</DataPath>
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Ограничение типов</v8:content>
</v8:item>
</Title>
<TypeDomainEnabled>false</TypeDomainEnabled>
<AvailableTypes>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>0</v8:Length>
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
<v8:Type>xs:boolean</v8:Type>
</AvailableTypes>
<ContextMenu name="ПолеСоставноеКонтекстноеМеню" id="44"/>
<ExtendedTooltip name="ПолеСоставноеРасширеннаяПодсказка" id="45"/>
</InputField>
</ChildItems>
<Attributes>
<Attribute name="Объект" id="43">
<Attribute name="Объект" id="46">
<Type>
<v8:Type>cfg:DataProcessorObject.ПоляВвода</v8:Type>
</Type>
<MainAttribute>true</MainAttribute>
</Attribute>
<Attribute name="ОбычноеПоле" id="44">
<Attribute name="ОбычноеПоле" id="47">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -450,7 +470,7 @@
</v8:StringQualifiers>
</Type>
</Attribute>
<Attribute name="МногострочноеПоле" id="45">
<Attribute name="МногострочноеПоле" id="48">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -465,7 +485,7 @@
</v8:StringQualifiers>
</Type>
</Attribute>
<Attribute name="ПолеПароля" id="46">
<Attribute name="ПолеПароля" id="49">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -480,7 +500,7 @@
</v8:StringQualifiers>
</Type>
</Attribute>
<Attribute name="ПолеСКнопками" id="47">
<Attribute name="ПолеСКнопками" id="50">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -495,7 +515,7 @@
</v8:StringQualifiers>
</Type>
</Attribute>
<Attribute name="ПолеСписокВыбора" id="48">
<Attribute name="ПолеСписокВыбора" id="51">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -510,7 +530,7 @@
</v8:StringQualifiers>
</Type>
</Attribute>
<Attribute name="ПолеПодсказка" id="49">
<Attribute name="ПолеПодсказка" id="52">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -525,7 +545,7 @@
</v8:StringQualifiers>
</Type>
</Attribute>
<Attribute name="ПолеСвязи" id="50">
<Attribute name="ПолеСвязи" id="53">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -540,7 +560,7 @@
</v8:StringQualifiers>
</Type>
</Attribute>
<Attribute name="ПолеСвязиКратко" id="51">
<Attribute name="ПолеСвязиКратко" id="54">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -555,7 +575,7 @@
</v8:StringQualifiers>
</Type>
</Attribute>
<Attribute name="Флаг" id="52">
<Attribute name="Флаг" id="55">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -566,7 +586,7 @@
<v8:Type>xs:boolean</v8:Type>
</Type>
</Attribute>
<Attribute name="ФлагПлатформенный" id="53">
<Attribute name="ФлагПлатформенный" id="56">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -577,7 +597,7 @@
<v8:Type>xs:boolean</v8:Type>
</Type>
</Attribute>
<Attribute name="ФлагЯвный" id="54">
<Attribute name="ФлагЯвный" id="57">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -588,7 +608,7 @@
<v8:Type>xs:boolean</v8:Type>
</Type>
</Attribute>
<Attribute name="ФлагТумблер" id="55">
<Attribute name="ФлагТумблер" id="58">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -599,7 +619,7 @@
<v8:Type>xs:boolean</v8:Type>
</Type>
</Attribute>
<Attribute name="ЧисловоеПоле" id="56">
<Attribute name="ЧисловоеПоле" id="59">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -615,7 +635,7 @@
</v8:NumberQualifiers>
</Type>
</Attribute>
<Attribute name="ДатаПоля" id="57">
<Attribute name="ДатаПоля" id="60">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -629,6 +649,22 @@
</v8:DateQualifiers>
</Type>
</Attribute>
<Attribute name="ПолеСоставное" id="61">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Поле составное</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>0</v8:Length>
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
<v8:Type>xs:boolean</v8:Type>
</Type>
</Attribute>
<ConditionalAppearance>
<dcsset:item>
<dcsset:selection>