mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-06-15 02:14:57 +03:00
feat(form-decompile,form-compile): параметры выбора / связи параметров выбора / связь по типу (кластер ChoiceParameters)
Покрытие трёх конструкций поля ввода (InputField), массовых в корпусе
(ChoiceParameters 844 / ChoiceParameterLinks 685 / TypeLink 84 файлов):
- choiceParameters: [{name, value}] — параметры выбора. value через общий
Normalize-ChoiceValue (bool/число/строка/ref-путь + синонимы Перечисление./
Справочник.); массив значений → v8:FixedArray. Presentation всегда пустой.
- choiceParameterLinks: [{name, dataPath, valueChange?}] — связи параметров
выбора. valueChange дефолт Clear (опускается декомпилятором), forgiving
Clear/DontChange + рус.синонимы. DataPath xsi:type=xs:string.
- typeLink: {dataPath, linkItem} — связь по типу. linkItem дефолт 0.
Декомпилятор: регистрация app namespace; инверсные хелперы (FixedArray →
массив, дефолт Clear опускается). Компилятор ps1 + зеркало py (байт-в-байт).
Spec: секция в #### input. Тест-кейс input-fields расширен полем со всеми
тремя конструкциями; round-trip бит-в-бит на 3 реальных формах; снэпшот
сертифицирован загрузкой в 1С 8.3.24.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# form-compile v1.67 — Compile 1C managed form from JSON or object metadata
|
||||
# form-compile v1.68 — Compile 1C managed form from JSON or object metadata
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
param(
|
||||
[string]$JsonPath,
|
||||
@@ -2940,6 +2940,11 @@ function Emit-Input {
|
||||
|
||||
Emit-ChoiceList -el $el -indent $inner
|
||||
|
||||
# Связи по типу / связи параметров выбора / параметры выбора
|
||||
Emit-TypeLink -el $el -indent $inner
|
||||
Emit-ChoiceParameterLinks -el $el -indent $inner
|
||||
Emit-ChoiceParameters -el $el -indent $inner
|
||||
|
||||
# Оформление (цвета/шрифты/граница) — перед компаньонами
|
||||
Emit-Appearance -el $el -indent $inner -profile 'field'
|
||||
|
||||
@@ -3177,6 +3182,103 @@ function Emit-ChoiceList {
|
||||
X "$indent</ChoiceList>"
|
||||
}
|
||||
|
||||
# Чтение свойства из hashtable/PSCustomObject по списку синонимов (первый найденный, иначе $null).
|
||||
function Get-ElProp {
|
||||
param($obj, [string[]]$names)
|
||||
if ($null -eq $obj) { return $null }
|
||||
foreach ($n in $names) {
|
||||
if ($obj -is [System.Collections.IDictionary]) {
|
||||
if ($obj.Contains($n)) { return $obj[$n] }
|
||||
} elseif ($obj.PSObject -and $obj.PSObject.Properties[$n]) {
|
||||
return $obj.PSObject.Properties[$n].Value
|
||||
}
|
||||
}
|
||||
return $null
|
||||
}
|
||||
|
||||
# Внутреннее значение параметра выбора (FormChoiceListDesTimeValue): <Presentation/> + <Value>.
|
||||
# Скаляр → один Value (через Normalize-ChoiceValue); массив → v8:FixedArray из вложенных FormChoiceListDesTimeValue.
|
||||
function Emit-ChoiceParamValue {
|
||||
param($value, [string]$indent)
|
||||
X "$indent<Presentation/>"
|
||||
$isArray = ($value -is [System.Array]) -or ($value -is [System.Collections.IList] -and $value -isnot [string])
|
||||
if ($isArray) {
|
||||
X "$indent<Value xsi:type=`"v8:FixedArray`">"
|
||||
foreach ($v in $value) {
|
||||
$norm = Normalize-ChoiceValue -value $v
|
||||
X "$indent`t<v8:Value xsi:type=`"FormChoiceListDesTimeValue`">"
|
||||
X "$indent`t`t<Presentation/>"
|
||||
X "$indent`t`t<Value xsi:type=`"$($norm.XsiType)`">$(Esc-Xml $norm.Text)</Value>"
|
||||
X "$indent`t</v8:Value>"
|
||||
}
|
||||
X "$indent</Value>"
|
||||
} else {
|
||||
$norm = Normalize-ChoiceValue -value $value
|
||||
X "$indent<Value xsi:type=`"$($norm.XsiType)`">$(Esc-Xml $norm.Text)</Value>"
|
||||
}
|
||||
}
|
||||
|
||||
# <ChoiceParameters> (параметры выбора поля ввода) — [{name, value}]. value через Normalize-ChoiceValue;
|
||||
# массив значений → FixedArray. Рус. синонимы имя/значение.
|
||||
function Emit-ChoiceParameters {
|
||||
param($el, [string]$indent)
|
||||
$cp = $el.choiceParameters
|
||||
if (-not $cp -or @($cp).Count -eq 0) { return }
|
||||
X "$indent<ChoiceParameters>"
|
||||
foreach ($item in @($cp)) {
|
||||
$name = Get-ElProp $item @('name','имя')
|
||||
$val = Get-ElProp $item @('value','значение')
|
||||
X "$indent`t<app:item name=`"$(Esc-Xml "$name")`">"
|
||||
X "$indent`t`t<app:value xsi:type=`"FormChoiceListDesTimeValue`">"
|
||||
Emit-ChoiceParamValue -value $val -indent "$indent`t`t`t"
|
||||
X "$indent`t`t</app:value>"
|
||||
X "$indent`t</app:item>"
|
||||
}
|
||||
X "$indent</ChoiceParameters>"
|
||||
}
|
||||
|
||||
# <ChoiceParameterLinks> (связи параметров выбора) — [{name, dataPath, valueChange?}].
|
||||
# valueChange всегда эмитится, дефолт Clear; forgiving Clear/DontChange + рус. синонимы.
|
||||
function Emit-ChoiceParameterLinks {
|
||||
param($el, [string]$indent)
|
||||
$cpl = $el.choiceParameterLinks
|
||||
if (-not $cpl -or @($cpl).Count -eq 0) { return }
|
||||
X "$indent<ChoiceParameterLinks>"
|
||||
foreach ($lk in @($cpl)) {
|
||||
$name = Get-ElProp $lk @('name','имя')
|
||||
$dp = Get-ElProp $lk @('dataPath','path','путь')
|
||||
$vcRaw = Get-ElProp $lk @('valueChange','режимИзменения')
|
||||
$vc = "Clear"
|
||||
if ($vcRaw) {
|
||||
$vc = switch -Regex ("$vcRaw".ToLower()) {
|
||||
'^(clear|очистить|очистка)$' { "Clear"; break }
|
||||
'^(dontchange|неизменять|неменять|нет)$' { "DontChange"; break }
|
||||
default { "$vcRaw" }
|
||||
}
|
||||
}
|
||||
X "$indent`t<xr:Link>"
|
||||
X "$indent`t`t<xr:Name>$(Esc-Xml "$name")</xr:Name>"
|
||||
X "$indent`t`t<xr:DataPath xsi:type=`"xs:string`">$(Esc-Xml "$dp")</xr:DataPath>"
|
||||
X "$indent`t`t<xr:ValueChange>$vc</xr:ValueChange>"
|
||||
X "$indent`t</xr:Link>"
|
||||
}
|
||||
X "$indent</ChoiceParameterLinks>"
|
||||
}
|
||||
|
||||
# <TypeLink> (связь по типу) — {dataPath, linkItem}. linkItem дефолт 0.
|
||||
function Emit-TypeLink {
|
||||
param($el, [string]$indent)
|
||||
$tl = $el.typeLink
|
||||
if (-not $tl) { return }
|
||||
$dp = Get-ElProp $tl @('dataPath','path','путь')
|
||||
$li = Get-ElProp $tl @('linkItem','элементСвязи')
|
||||
if ($null -eq $li) { $li = 0 }
|
||||
X "$indent<TypeLink>"
|
||||
X "$indent`t<xr:DataPath>$(Esc-Xml "$dp")</xr:DataPath>"
|
||||
X "$indent`t<xr:LinkItem>$li</xr:LinkItem>"
|
||||
X "$indent</TypeLink>"
|
||||
}
|
||||
|
||||
function Emit-Radio {
|
||||
param($el, [string]$name, [int]$id, [string]$indent)
|
||||
|
||||
|
||||
@@ -2001,6 +2001,99 @@ def emit_choice_list(lines, el, indent):
|
||||
lines.append(f'{indent}</ChoiceList>')
|
||||
|
||||
|
||||
def get_el_prop(obj, names):
|
||||
# Читает свойство из dict по списку синонимов (первый найденный, иначе None).
|
||||
if not isinstance(obj, dict):
|
||||
return None
|
||||
for n in names:
|
||||
if n in obj:
|
||||
return obj[n]
|
||||
return None
|
||||
|
||||
|
||||
def emit_choice_param_value(lines, value, indent):
|
||||
# Внутреннее значение параметра выбора (FormChoiceListDesTimeValue): <Presentation/> + <Value>.
|
||||
# Скаляр → один Value; массив → v8:FixedArray из вложенных FormChoiceListDesTimeValue.
|
||||
lines.append(f'{indent}<Presentation/>')
|
||||
if isinstance(value, (list, tuple)):
|
||||
lines.append(f'{indent}<Value xsi:type="v8:FixedArray">')
|
||||
for v in value:
|
||||
norm = normalize_choice_value(v)
|
||||
lines.append(f'{indent}\t<v8:Value xsi:type="FormChoiceListDesTimeValue">')
|
||||
lines.append(f'{indent}\t\t<Presentation/>')
|
||||
lines.append(f'{indent}\t\t<Value xsi:type="{norm["xsi_type"]}">{esc_xml(norm["text"])}</Value>')
|
||||
lines.append(f'{indent}\t</v8:Value>')
|
||||
lines.append(f'{indent}</Value>')
|
||||
else:
|
||||
norm = normalize_choice_value(value)
|
||||
lines.append(f'{indent}<Value xsi:type="{norm["xsi_type"]}">{esc_xml(norm["text"])}</Value>')
|
||||
|
||||
|
||||
def emit_choice_parameters(lines, el, indent):
|
||||
# <ChoiceParameters> (параметры выбора поля ввода) — [{name, value}]. value через
|
||||
# normalize_choice_value; массив значений → FixedArray. Рус. синонимы имя/значение.
|
||||
cp = el.get('choiceParameters') or []
|
||||
if not cp:
|
||||
return
|
||||
lines.append(f'{indent}<ChoiceParameters>')
|
||||
for item in cp:
|
||||
name = get_el_prop(item, ('name', 'имя'))
|
||||
val = get_el_prop(item, ('value', 'значение'))
|
||||
name_s = '' if name is None else str(name)
|
||||
lines.append(f'{indent}\t<app:item name="{esc_xml(name_s)}">')
|
||||
lines.append(f'{indent}\t\t<app:value xsi:type="FormChoiceListDesTimeValue">')
|
||||
emit_choice_param_value(lines, val, f'{indent}\t\t\t')
|
||||
lines.append(f'{indent}\t\t</app:value>')
|
||||
lines.append(f'{indent}\t</app:item>')
|
||||
lines.append(f'{indent}</ChoiceParameters>')
|
||||
|
||||
|
||||
def emit_choice_parameter_links(lines, el, indent):
|
||||
# <ChoiceParameterLinks> (связи параметров выбора) — [{name, dataPath, valueChange?}].
|
||||
# valueChange всегда эмитится, дефолт Clear; forgiving Clear/DontChange + рус. синонимы.
|
||||
cpl = el.get('choiceParameterLinks') or []
|
||||
if not cpl:
|
||||
return
|
||||
lines.append(f'{indent}<ChoiceParameterLinks>')
|
||||
for lk in cpl:
|
||||
name = get_el_prop(lk, ('name', 'имя'))
|
||||
dp = get_el_prop(lk, ('dataPath', 'path', 'путь'))
|
||||
vc_raw = get_el_prop(lk, ('valueChange', 'режимИзменения'))
|
||||
vc = 'Clear'
|
||||
if vc_raw:
|
||||
s = str(vc_raw).lower()
|
||||
if s in ('clear', 'очистить', 'очистка'):
|
||||
vc = 'Clear'
|
||||
elif s in ('dontchange', 'неизменять', 'неменять', 'нет'):
|
||||
vc = 'DontChange'
|
||||
else:
|
||||
vc = str(vc_raw)
|
||||
name_s = '' if name is None else str(name)
|
||||
dp_s = '' if dp is None else str(dp)
|
||||
lines.append(f'{indent}\t<xr:Link>')
|
||||
lines.append(f'{indent}\t\t<xr:Name>{esc_xml(name_s)}</xr:Name>')
|
||||
lines.append(f'{indent}\t\t<xr:DataPath xsi:type="xs:string">{esc_xml(dp_s)}</xr:DataPath>')
|
||||
lines.append(f'{indent}\t\t<xr:ValueChange>{vc}</xr:ValueChange>')
|
||||
lines.append(f'{indent}\t</xr:Link>')
|
||||
lines.append(f'{indent}</ChoiceParameterLinks>')
|
||||
|
||||
|
||||
def emit_type_link(lines, el, indent):
|
||||
# <TypeLink> (связь по типу) — {dataPath, linkItem}. linkItem дефолт 0.
|
||||
tl = el.get('typeLink')
|
||||
if not tl:
|
||||
return
|
||||
dp = get_el_prop(tl, ('dataPath', 'path', 'путь'))
|
||||
li = get_el_prop(tl, ('linkItem', 'элементСвязи'))
|
||||
if li is None:
|
||||
li = 0
|
||||
dp_s = '' if dp is None else str(dp)
|
||||
lines.append(f'{indent}<TypeLink>')
|
||||
lines.append(f'{indent}\t<xr:DataPath>{esc_xml(dp_s)}</xr:DataPath>')
|
||||
lines.append(f'{indent}\t<xr:LinkItem>{li}</xr:LinkItem>')
|
||||
lines.append(f'{indent}</TypeLink>')
|
||||
|
||||
|
||||
def normalize_radio_button_type(raw):
|
||||
if not raw:
|
||||
return "Auto"
|
||||
@@ -2847,6 +2940,11 @@ def emit_input(lines, el, name, eid, indent):
|
||||
|
||||
emit_choice_list(lines, el, inner)
|
||||
|
||||
# Связи по типу / связи параметров выбора / параметры выбора
|
||||
emit_type_link(lines, el, inner)
|
||||
emit_choice_parameter_links(lines, el, inner)
|
||||
emit_choice_parameters(lines, el, inner)
|
||||
|
||||
# Оформление (цвета/шрифты/граница) — перед компаньонами
|
||||
emit_appearance(lines, el, inner, 'field')
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# form-decompile v0.47 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
||||
# form-decompile v0.48 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
|
||||
param(
|
||||
@@ -40,6 +40,7 @@ $NS_DCSSET = "http://v8.1c.ru/8.1/data-composition-system/settings"
|
||||
$NS_DCSSCH = "http://v8.1c.ru/8.1/data-composition-system/schema"
|
||||
$NS_DCSCOR = "http://v8.1c.ru/8.1/data-composition-system/core"
|
||||
$NS_V8UI = "http://v8.1c.ru/8.1/data/ui"
|
||||
$NS_APP = "http://v8.1c.ru/8.2/managed-application/core"
|
||||
|
||||
$ns = New-Object System.Xml.XmlNamespaceManager($xmlDoc.NameTable)
|
||||
$ns.AddNamespace("lf", $NS_LF)
|
||||
@@ -50,6 +51,7 @@ $ns.AddNamespace("dcsset", $NS_DCSSET)
|
||||
$ns.AddNamespace("dcssch", $NS_DCSSCH)
|
||||
$ns.AddNamespace("dcscor", $NS_DCSCOR)
|
||||
$ns.AddNamespace("v8ui", $NS_V8UI)
|
||||
$ns.AddNamespace("app", $NS_APP)
|
||||
|
||||
# Каноничные GUID пустых контейнеров ListSettings (умолчание платформы, ~90% форм).
|
||||
# Если ListSettings = пустой скелет с этими GUID → декомпилятор опускает настройки вовсе,
|
||||
@@ -1178,6 +1180,70 @@ function Decompile-ChoiceList {
|
||||
return $null
|
||||
}
|
||||
|
||||
# Значение Параметра выбора (<lf:Value>): скаляр через Convert-TypedValue, либо
|
||||
# v8:FixedArray → массив скаляров (каждый — FormChoiceListDesTimeValue с внутренним lf:Value).
|
||||
function Convert-ChoiceParamValue {
|
||||
param($valNode)
|
||||
$vt = $valNode.GetAttribute("type", $NS_XSI)
|
||||
if ($vt -match 'FixedArray$') {
|
||||
$arr = New-Object System.Collections.ArrayList
|
||||
foreach ($it in @($valNode.SelectNodes("v8:Value", $ns))) {
|
||||
$inner = $it.SelectSingleNode("lf:Value", $ns)
|
||||
if ($inner) { [void]$arr.Add((Convert-TypedValue -raw $inner.InnerText -xsiType ($inner.GetAttribute("type", $NS_XSI)))) }
|
||||
}
|
||||
return ,@($arr)
|
||||
}
|
||||
return Convert-TypedValue -raw $valNode.InnerText -xsiType $vt
|
||||
}
|
||||
|
||||
# Инверсия Emit-ChoiceParameters: <ChoiceParameters><app:item name="X"><app:value><Value…> → [{name, value}].
|
||||
function Decompile-ChoiceParameters {
|
||||
param($node)
|
||||
$cpn = $node.SelectSingleNode("lf:ChoiceParameters", $ns)
|
||||
if (-not $cpn) { return $null }
|
||||
$items = New-Object System.Collections.ArrayList
|
||||
foreach ($it in @($cpn.SelectNodes("app:item", $ns))) {
|
||||
$o = [ordered]@{}
|
||||
$o['name'] = $it.GetAttribute("name")
|
||||
$valNode = $it.SelectSingleNode("app:value/lf:Value", $ns)
|
||||
if ($valNode) { $o['value'] = Convert-ChoiceParamValue $valNode }
|
||||
[void]$items.Add($o)
|
||||
}
|
||||
if ($items.Count -gt 0) { return ,@($items) }
|
||||
return $null
|
||||
}
|
||||
|
||||
# Инверсия Emit-ChoiceParameterLinks: <ChoiceParameterLinks><xr:Link><xr:Name><xr:DataPath><xr:ValueChange> →
|
||||
# [{name, dataPath, valueChange?}]. valueChange дефолт Clear → опускаем (компилятор восстановит).
|
||||
function Decompile-ChoiceParameterLinks {
|
||||
param($node)
|
||||
$cln = $node.SelectSingleNode("lf:ChoiceParameterLinks", $ns)
|
||||
if (-not $cln) { return $null }
|
||||
$items = New-Object System.Collections.ArrayList
|
||||
foreach ($lk in @($cln.SelectNodes("xr:Link", $ns))) {
|
||||
$o = [ordered]@{}
|
||||
$o['name'] = Get-Text $lk "xr:Name"
|
||||
$o['dataPath'] = Get-Text $lk "xr:DataPath"
|
||||
$vc = Get-Text $lk "xr:ValueChange"
|
||||
if ($vc -and $vc -ne 'Clear') { $o['valueChange'] = $vc }
|
||||
[void]$items.Add($o)
|
||||
}
|
||||
if ($items.Count -gt 0) { return ,@($items) }
|
||||
return $null
|
||||
}
|
||||
|
||||
# Инверсия Emit-TypeLink: <TypeLink><xr:DataPath><xr:LinkItem> → {dataPath, linkItem}.
|
||||
function Decompile-TypeLink {
|
||||
param($node)
|
||||
$tn = $node.SelectSingleNode("lf:TypeLink", $ns)
|
||||
if (-not $tn) { return $null }
|
||||
$o = [ordered]@{}
|
||||
$o['dataPath'] = Get-Text $tn "xr:DataPath"
|
||||
$li = Get-Text $tn "xr:LinkItem"
|
||||
if ($null -ne $li -and $li -ne '') { $o['linkItem'] = [int]$li }
|
||||
return $o
|
||||
}
|
||||
|
||||
function Decompile-Element {
|
||||
param($node)
|
||||
$tag = $node.LocalName
|
||||
@@ -1244,6 +1310,10 @@ function Decompile-Element {
|
||||
}
|
||||
$cbr = Get-Child $node 'ChoiceButtonRepresentation'; if ($cbr) { $obj['choiceButtonRepresentation'] = $cbr }
|
||||
$cl = Decompile-ChoiceList $node; if ($cl) { $obj['choiceList'] = $cl }
|
||||
# Параметры выбора / Связи параметров выбора / Связь по типу
|
||||
$cp = Decompile-ChoiceParameters $node; if ($cp) { $obj['choiceParameters'] = $cp }
|
||||
$cpl = Decompile-ChoiceParameterLinks $node; if ($cpl) { $obj['choiceParameterLinks'] = $cpl }
|
||||
$tlk = Decompile-TypeLink $node; if ($tlk) { $obj['typeLink'] = $tlk }
|
||||
}
|
||||
'CheckBoxField' {
|
||||
$obj[$key] = $name
|
||||
|
||||
@@ -364,6 +364,31 @@ companion-панели с собственным контентом. Оба не
|
||||
| `verticalStretch` | bool | Растягивание по вертикали |
|
||||
| `autoMaxWidth` | bool | Автомаксимальная ширина |
|
||||
| `autoMaxHeight` | bool | Автомаксимальная высота |
|
||||
| `choiceParameters` | array | Параметры выбора — см. ниже |
|
||||
| `choiceParameterLinks` | array | Связи параметров выбора — см. ниже |
|
||||
| `typeLink` | object | Связь по типу — см. ниже |
|
||||
|
||||
##### Параметры выбора, связи параметров выбора, связь по типу
|
||||
|
||||
Свойства поля ввода, управляющие выбором значения и типом. Имена параметров (`"Отбор.Х"`) — строки 1С как есть.
|
||||
|
||||
```json
|
||||
{ "input": "Контрагент", "path": "Объект.Контрагент",
|
||||
"choiceParameters": [
|
||||
{ "name": "Отбор.Активный", "value": true },
|
||||
{ "name": "Отбор.ВидПродукции", "value": ["Enum.Виды.Агрохимикат", "Enum.Виды.Пестицид"] }
|
||||
],
|
||||
"choiceParameterLinks": [
|
||||
{ "name": "Отбор.Организация", "dataPath": "Объект.Организация" },
|
||||
{ "name": "Отбор.Тип", "dataPath": "Объект.Тип", "valueChange": "DontChange" }
|
||||
],
|
||||
"typeLink": { "dataPath": "Объект.ЗначениеДата", "linkItem": 0 }
|
||||
}
|
||||
```
|
||||
|
||||
- **`choiceParameters`** — `[{ name, value }]`. `value` через ту же нормализацию, что `choiceList`: bool / число / строка / ссылка-путь (`Enum.X.Y`, `Catalog.X` и синонимы `Перечисление.`/`Справочник.`). **Массив** значений → фиксированный массив (`FixedArray`). Синонимы ключей: `имя`/`значение`.
|
||||
- **`choiceParameterLinks`** — `[{ name, dataPath, valueChange? }]`. `valueChange`: `Clear` (дефолт, опускается) / `DontChange`; forgiving `очистить`/`неизменять`. Синонимы: `имя`/`путь`/`режимИзменения`.
|
||||
- **`typeLink`** — `{ dataPath, linkItem }`. `linkItem` — индекс (дефолт `0`). Синонимы: `путь`/`элементСвязи`.
|
||||
|
||||
#### check — CheckBoxField
|
||||
|
||||
|
||||
@@ -26,6 +26,18 @@
|
||||
{ "value": "Второй", "presentation": "Второй вариант" }
|
||||
]},
|
||||
{ "input": "ПолеПодсказка", "path": "ПолеПодсказка", "inputHint": "Введите значение...", "title": "Подсказка" },
|
||||
{ "input": "ПолеСвязи", "path": "ПолеСвязи", "title": "Поле со связями",
|
||||
"choiceParameters": [
|
||||
{ "name": "Отбор.Активный", "value": true },
|
||||
{ "name": "Отбор.Вид", "value": "Основной" },
|
||||
{ "name": "Отбор.Список", "value": ["Один", "Два"] }
|
||||
],
|
||||
"choiceParameterLinks": [
|
||||
{ "name": "Отбор.Организация", "dataPath": "ОбычноеПоле" },
|
||||
{ "name": "Отбор.Тип", "dataPath": "ПолеСписокВыбора", "valueChange": "DontChange" }
|
||||
],
|
||||
"typeLink": { "dataPath": "ПолеПодсказка", "linkItem": 0 }
|
||||
},
|
||||
{ "check": "Флаг", "path": "Флаг", "title": "Включено" },
|
||||
{ "check": "ФлагПлатформенный", "path": "ФлагПлатформенный", "title": "Слева", "titleLocation": "" },
|
||||
{ "check": "ФлагЯвный", "path": "ФлагЯвный", "title": "Сверху", "titleLocation": "top" },
|
||||
@@ -39,6 +51,7 @@
|
||||
{ "name": "ПолеСКнопками", "type": "string" },
|
||||
{ "name": "ПолеСписокВыбора", "type": "string" },
|
||||
{ "name": "ПолеПодсказка", "type": "string" },
|
||||
{ "name": "ПолеСвязи", "type": "string" },
|
||||
{ "name": "Флаг", "type": "boolean" },
|
||||
{ "name": "ФлагПлатформенный", "type": "boolean" },
|
||||
{ "name": "ФлагЯвный", "type": "boolean" },
|
||||
|
||||
+94
-23
@@ -138,7 +138,63 @@
|
||||
<ContextMenu name="ПолеПодсказкаКонтекстноеМеню" id="20"/>
|
||||
<ExtendedTooltip name="ПолеПодсказкаРасширеннаяПодсказка" id="21"/>
|
||||
</InputField>
|
||||
<CheckBoxField name="Флаг" id="22">
|
||||
<InputField name="ПолеСвязи" id="22">
|
||||
<DataPath>ПолеСвязи</DataPath>
|
||||
<Title>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Поле со связями</v8:content>
|
||||
</v8:item>
|
||||
</Title>
|
||||
<TypeLink>
|
||||
<xr:DataPath>ПолеПодсказка</xr:DataPath>
|
||||
<xr:LinkItem>0</xr:LinkItem>
|
||||
</TypeLink>
|
||||
<ChoiceParameterLinks>
|
||||
<xr:Link>
|
||||
<xr:Name>Отбор.Организация</xr:Name>
|
||||
<xr:DataPath xsi:type="xs:string">ОбычноеПоле</xr:DataPath>
|
||||
<xr:ValueChange>Clear</xr:ValueChange>
|
||||
</xr:Link>
|
||||
<xr:Link>
|
||||
<xr:Name>Отбор.Тип</xr:Name>
|
||||
<xr:DataPath xsi:type="xs:string">ПолеСписокВыбора</xr:DataPath>
|
||||
<xr:ValueChange>DontChange</xr:ValueChange>
|
||||
</xr:Link>
|
||||
</ChoiceParameterLinks>
|
||||
<ChoiceParameters>
|
||||
<app:item name="Отбор.Активный">
|
||||
<app:value xsi:type="FormChoiceListDesTimeValue">
|
||||
<Presentation/>
|
||||
<Value xsi:type="xs:boolean">true</Value>
|
||||
</app:value>
|
||||
</app:item>
|
||||
<app:item name="Отбор.Вид">
|
||||
<app:value xsi:type="FormChoiceListDesTimeValue">
|
||||
<Presentation/>
|
||||
<Value xsi:type="xs:string">Основной</Value>
|
||||
</app:value>
|
||||
</app:item>
|
||||
<app:item name="Отбор.Список">
|
||||
<app:value xsi:type="FormChoiceListDesTimeValue">
|
||||
<Presentation/>
|
||||
<Value xsi:type="v8:FixedArray">
|
||||
<v8:Value xsi:type="FormChoiceListDesTimeValue">
|
||||
<Presentation/>
|
||||
<Value xsi:type="xs:string">Один</Value>
|
||||
</v8:Value>
|
||||
<v8:Value xsi:type="FormChoiceListDesTimeValue">
|
||||
<Presentation/>
|
||||
<Value xsi:type="xs:string">Два</Value>
|
||||
</v8:Value>
|
||||
</Value>
|
||||
</app:value>
|
||||
</app:item>
|
||||
</ChoiceParameters>
|
||||
<ContextMenu name="ПолеСвязиКонтекстноеМеню" id="23"/>
|
||||
<ExtendedTooltip name="ПолеСвязиРасширеннаяПодсказка" id="24"/>
|
||||
</InputField>
|
||||
<CheckBoxField name="Флаг" id="25">
|
||||
<DataPath>Флаг</DataPath>
|
||||
<Title>
|
||||
<v8:item>
|
||||
@@ -148,10 +204,10 @@
|
||||
</Title>
|
||||
<CheckBoxType>Auto</CheckBoxType>
|
||||
<TitleLocation>Right</TitleLocation>
|
||||
<ContextMenu name="ФлагКонтекстноеМеню" id="23"/>
|
||||
<ExtendedTooltip name="ФлагРасширеннаяПодсказка" id="24"/>
|
||||
<ContextMenu name="ФлагКонтекстноеМеню" id="26"/>
|
||||
<ExtendedTooltip name="ФлагРасширеннаяПодсказка" id="27"/>
|
||||
</CheckBoxField>
|
||||
<CheckBoxField name="ФлагПлатформенный" id="25">
|
||||
<CheckBoxField name="ФлагПлатформенный" id="28">
|
||||
<DataPath>ФлагПлатформенный</DataPath>
|
||||
<Title>
|
||||
<v8:item>
|
||||
@@ -160,10 +216,10 @@
|
||||
</v8:item>
|
||||
</Title>
|
||||
<CheckBoxType>Auto</CheckBoxType>
|
||||
<ContextMenu name="ФлагПлатформенныйКонтекстноеМеню" id="26"/>
|
||||
<ExtendedTooltip name="ФлагПлатформенныйРасширеннаяПодсказка" id="27"/>
|
||||
<ContextMenu name="ФлагПлатформенныйКонтекстноеМеню" id="29"/>
|
||||
<ExtendedTooltip name="ФлагПлатформенныйРасширеннаяПодсказка" id="30"/>
|
||||
</CheckBoxField>
|
||||
<CheckBoxField name="ФлагЯвный" id="28">
|
||||
<CheckBoxField name="ФлагЯвный" id="31">
|
||||
<DataPath>ФлагЯвный</DataPath>
|
||||
<Title>
|
||||
<v8:item>
|
||||
@@ -173,10 +229,10 @@
|
||||
</Title>
|
||||
<CheckBoxType>Auto</CheckBoxType>
|
||||
<TitleLocation>Top</TitleLocation>
|
||||
<ContextMenu name="ФлагЯвныйКонтекстноеМеню" id="29"/>
|
||||
<ExtendedTooltip name="ФлагЯвныйРасширеннаяПодсказка" id="30"/>
|
||||
<ContextMenu name="ФлагЯвныйКонтекстноеМеню" id="32"/>
|
||||
<ExtendedTooltip name="ФлагЯвныйРасширеннаяПодсказка" id="33"/>
|
||||
</CheckBoxField>
|
||||
<CheckBoxField name="ФлагТумблер" id="31">
|
||||
<CheckBoxField name="ФлагТумблер" id="34">
|
||||
<DataPath>ФлагТумблер</DataPath>
|
||||
<Title>
|
||||
<v8:item>
|
||||
@@ -186,18 +242,18 @@
|
||||
</Title>
|
||||
<CheckBoxType>Switcher</CheckBoxType>
|
||||
<TitleLocation>Right</TitleLocation>
|
||||
<ContextMenu name="ФлагТумблерКонтекстноеМеню" id="32"/>
|
||||
<ExtendedTooltip name="ФлагТумблерРасширеннаяПодсказка" id="33"/>
|
||||
<ContextMenu name="ФлагТумблерКонтекстноеМеню" id="35"/>
|
||||
<ExtendedTooltip name="ФлагТумблерРасширеннаяПодсказка" id="36"/>
|
||||
</CheckBoxField>
|
||||
</ChildItems>
|
||||
<Attributes>
|
||||
<Attribute name="Объект" id="34">
|
||||
<Attribute name="Объект" id="37">
|
||||
<Type>
|
||||
<v8:Type>cfg:DataProcessorObject.ПоляВвода</v8:Type>
|
||||
</Type>
|
||||
<MainAttribute>true</MainAttribute>
|
||||
</Attribute>
|
||||
<Attribute name="ОбычноеПоле" id="35">
|
||||
<Attribute name="ОбычноеПоле" id="38">
|
||||
<Title>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
@@ -212,7 +268,7 @@
|
||||
</v8:StringQualifiers>
|
||||
</Type>
|
||||
</Attribute>
|
||||
<Attribute name="МногострочноеПоле" id="36">
|
||||
<Attribute name="МногострочноеПоле" id="39">
|
||||
<Title>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
@@ -227,7 +283,7 @@
|
||||
</v8:StringQualifiers>
|
||||
</Type>
|
||||
</Attribute>
|
||||
<Attribute name="ПолеПароля" id="37">
|
||||
<Attribute name="ПолеПароля" id="40">
|
||||
<Title>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
@@ -242,7 +298,7 @@
|
||||
</v8:StringQualifiers>
|
||||
</Type>
|
||||
</Attribute>
|
||||
<Attribute name="ПолеСКнопками" id="38">
|
||||
<Attribute name="ПолеСКнопками" id="41">
|
||||
<Title>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
@@ -257,7 +313,7 @@
|
||||
</v8:StringQualifiers>
|
||||
</Type>
|
||||
</Attribute>
|
||||
<Attribute name="ПолеСписокВыбора" id="39">
|
||||
<Attribute name="ПолеСписокВыбора" id="42">
|
||||
<Title>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
@@ -272,7 +328,7 @@
|
||||
</v8:StringQualifiers>
|
||||
</Type>
|
||||
</Attribute>
|
||||
<Attribute name="ПолеПодсказка" id="40">
|
||||
<Attribute name="ПолеПодсказка" id="43">
|
||||
<Title>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
@@ -287,7 +343,22 @@
|
||||
</v8:StringQualifiers>
|
||||
</Type>
|
||||
</Attribute>
|
||||
<Attribute name="Флаг" id="41">
|
||||
<Attribute name="ПолеСвязи" id="44">
|
||||
<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>
|
||||
</Type>
|
||||
</Attribute>
|
||||
<Attribute name="Флаг" id="45">
|
||||
<Title>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
@@ -298,7 +369,7 @@
|
||||
<v8:Type>xs:boolean</v8:Type>
|
||||
</Type>
|
||||
</Attribute>
|
||||
<Attribute name="ФлагПлатформенный" id="42">
|
||||
<Attribute name="ФлагПлатформенный" id="46">
|
||||
<Title>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
@@ -309,7 +380,7 @@
|
||||
<v8:Type>xs:boolean</v8:Type>
|
||||
</Type>
|
||||
</Attribute>
|
||||
<Attribute name="ФлагЯвный" id="43">
|
||||
<Attribute name="ФлагЯвный" id="47">
|
||||
<Title>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
@@ -320,7 +391,7 @@
|
||||
<v8:Type>xs:boolean</v8:Type>
|
||||
</Type>
|
||||
</Attribute>
|
||||
<Attribute name="ФлагТумблер" id="44">
|
||||
<Attribute name="ФлагТумблер" id="48">
|
||||
<Title>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
|
||||
Reference in New Issue
Block a user