feat(form-decompile,form-compile): пачка простых скаляров (generic pass-through + точечные)

Generic pass-through таблица простых скаляров элемента (captured/emitted «как
есть»): verticalAlign, throughAlign, enableContentChange, pictureSize, titleHeight,
childItemsWidth, showLeftMargin, cellHyperlink, viewMode, verticalScrollBar,
rowInputMode, mask, createButton. Один Emit-GenericScalars в Emit-Layout (покрывает
все элементы) + Add-GenericScalars в пост-обработке декомпилятора (skip-if-present —
специфичная обработка побеждает).

Точечно: Command>modifiesSavedData (bool), Page>showTitle:false, фикс InputField>
textEdit (компилятор эмитил, декомпилятор не ловил).

Баг-фикс: <FillChecking> в схеме НЕТ (0 в корпусе) — реальный тег <FillCheck>
(значение ShowError). Ключ fillCheck (синоним fillChecking, forgiving bool→ShowError).

TOTAL 408→246 (−162), match 81→107. Зеркало py (байт-в-байт). Кейсы groups/commands/
attributes-types/pages сертифицированы в 1С. Регресс 39/39 ps1+py.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-08 19:50:42 +03:00
parent 8ac0dfefd0
commit fb3bce5811
12 changed files with 159 additions and 15 deletions
@@ -1,4 +1,4 @@
# form-compile v1.79 — Compile 1C managed form from JSON or object metadata
# form-compile v1.80 — Compile 1C managed form from JSON or object metadata
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[string]$JsonPath,
@@ -2576,6 +2576,10 @@ function Emit-Element {
"autoCmdBar"=1
# дополнения командной панели таблицы (тип-ключи + свойства)
"searchString"=1;"viewStatus"=1;"searchControl"=1;"source"=1;"horizontalLocation"=1;"additions"=1
# generic-скаляры (pass-through) + точечные
"verticalAlign"=1;"throughAlign"=1;"enableContentChange"=1;"pictureSize"=1;"titleHeight"=1
"childItemsWidth"=1;"showLeftMargin"=1;"cellHyperlink"=1;"viewMode"=1;"verticalScrollBar"=1
"rowInputMode"=1;"mask"=1;"createButton"=1
}
# Оформление (цвета/шрифты/граница) — авто-регистрация из самих структур, чтобы allowlist
# не дрейфовал при добавлении новых ключей/синонимов. Канонические + forgiving-синонимы.
@@ -2748,6 +2752,39 @@ $script:appOrderField = @('titleTextColor','titleBackColor','titleFont','fo
$script:appOrderDecoration = @('textColor','font','backColor','borderColor','border')
$script:appOrderButton = @('textColor','backColor','borderColor','font')
# Простые скаляры элемента (pass-through: captured/emitted «как есть»). Только НЕ-перекрывающиеся
# теги (не обрабатываемые специфично где-то ещё). kind: bool → true/false; value → строка verbatim.
$script:genericScalars = @(
@{ Tag='VerticalAlign'; Key='verticalAlign'; Kind='value' }
@{ Tag='ThroughAlign'; Key='throughAlign'; Kind='value' }
@{ Tag='EnableContentChange'; Key='enableContentChange'; Kind='bool' }
@{ Tag='PictureSize'; Key='pictureSize'; Kind='value' }
@{ Tag='TitleHeight'; Key='titleHeight'; Kind='value' }
@{ Tag='ChildItemsWidth'; Key='childItemsWidth'; Kind='value' }
@{ Tag='ShowLeftMargin'; Key='showLeftMargin'; Kind='bool' }
@{ Tag='CellHyperlink'; Key='cellHyperlink'; Kind='bool' }
@{ Tag='ViewMode'; Key='viewMode'; Kind='value' }
@{ Tag='VerticalScrollBar'; Key='verticalScrollBar'; Kind='value' }
@{ Tag='RowInputMode'; Key='rowInputMode'; Kind='value' }
@{ Tag='Mask'; Key='mask'; Kind='value' }
@{ Tag='CreateButton'; Key='createButton'; Kind='bool' }
)
function Emit-GenericScalars {
param($el, [string]$indent)
if ($null -eq $el) { return }
foreach ($s in $script:genericScalars) {
$p = $el.PSObject.Properties[$s.Key]
if (-not $p -or $null -eq $p.Value) { continue }
if ($s.Kind -eq 'bool') {
X "$indent<$($s.Tag)>$(if ($p.Value){'true'}else{'false'})</$($s.Tag)>"
} else {
$v = "$($p.Value)"; if ($v -eq '') { continue }
X "$indent<$($s.Tag)>$(Esc-Xml $v)</$($s.Tag)>"
}
}
}
function Get-AppearanceValue {
param($el, [string]$canonical)
if ($null -eq $el) { return $null }
@@ -2833,6 +2870,7 @@ function Emit-Layout {
if ($el.groupHorizontalAlign) { X "$indent<GroupHorizontalAlign>$($el.groupHorizontalAlign)</GroupHorizontalAlign>" }
if ($el.groupVerticalAlign) { X "$indent<GroupVerticalAlign>$($el.groupVerticalAlign)</GroupVerticalAlign>" }
if ($el.horizontalAlign) { X "$indent<HorizontalAlign>$($el.horizontalAlign)</HorizontalAlign>" }
Emit-GenericScalars -el $el -indent $indent
}
function Title-FromName {
@@ -3772,6 +3810,7 @@ function Emit-Page {
}
if ($orientation) { X "$inner<Group>$orientation</Group>" }
}
if ($el.showTitle -eq $false) { X "$inner<ShowTitle>false</ShowTitle>" }
Emit-Layout -el $el -indent $inner
# Companion
@@ -4441,8 +4480,12 @@ function Emit-Attributes {
X "$inner</Save>"
}
}
if ($attr.fillChecking) {
X "$inner<FillChecking>$($attr.fillChecking)</FillChecking>"
# Проверка заполнения реквизита → <FillCheck> (реальный тег; <FillChecking> в схеме нет).
# bool true → ShowError (единственное значение в корпусе); строка → verbatim. Синоним fillChecking.
$fcRaw = if ($null -ne $attr.PSObject.Properties['fillCheck']) { $attr.fillCheck } elseif ($null -ne $attr.PSObject.Properties['fillChecking']) { $attr.fillChecking } else { $null }
if ($fcRaw) {
$fcv = if ($fcRaw -is [bool]) { 'ShowError' } else { "$fcRaw" }
X "$inner<FillCheck>$fcv</FillCheck>"
}
# UseAlways: поля, всегда читаемые (дин-список/таблица). Две формы DSL сливаются:
@@ -4607,6 +4650,8 @@ function Emit-Commands {
X "$inner<Action>$($cmd.action)</Action>"
}
if ($cmd.modifiesSavedData -eq $true) { X "$inner<ModifiesSavedData>true</ModifiesSavedData>" }
Emit-FunctionalOptions -fo $cmd.functionalOptions -indent $inner
if ($cmd.currentRowUse) {
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# form-compile v1.79 — Compile 1C managed form from JSON or object metadata
# form-compile v1.80 — Compile 1C managed form from JSON or object metadata
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import copy
@@ -1813,6 +1813,10 @@ KNOWN_KEYS = {
"autoCmdBar",
# дополнения командной панели таблицы (тип-ключи + свойства)
"searchString", "viewStatus", "searchControl", "source", "horizontalLocation", "additions",
# generic-скаляры (pass-through)
"verticalAlign", "throughAlign", "enableContentChange", "pictureSize", "titleHeight",
"childItemsWidth", "showLeftMargin", "cellHyperlink", "viewMode", "verticalScrollBar",
"rowInputMode", "mask", "createButton",
}
# picture/picField — НИЗКИЙ приоритет: 'picture' это и тип (PictureDecoration), и свойство-иконка
@@ -2624,6 +2628,37 @@ def emit_appearance(lines, el, indent, profile='field'):
emit_border_tag(lines, val, indent)
# Простые скаляры элемента (pass-through, зеркало $script:genericScalars). kind bool/value.
GENERIC_SCALARS = [
('VerticalAlign', 'verticalAlign', 'value'),
('ThroughAlign', 'throughAlign', 'value'),
('EnableContentChange', 'enableContentChange', 'bool'),
('PictureSize', 'pictureSize', 'value'),
('TitleHeight', 'titleHeight', 'value'),
('ChildItemsWidth', 'childItemsWidth', 'value'),
('ShowLeftMargin', 'showLeftMargin', 'bool'),
('CellHyperlink', 'cellHyperlink', 'bool'),
('ViewMode', 'viewMode', 'value'),
('VerticalScrollBar', 'verticalScrollBar', 'value'),
('RowInputMode', 'rowInputMode', 'value'),
('Mask', 'mask', 'value'),
('CreateButton', 'createButton', 'bool'),
]
def emit_generic_scalars(lines, el, indent):
for tag, key, kind in GENERIC_SCALARS:
if key not in el or el[key] is None:
continue
if kind == 'bool':
lines.append(f'{indent}<{tag}>{"true" if el[key] else "false"}</{tag}>')
else:
v = str(el[key])
if v == '':
continue
lines.append(f'{indent}<{tag}>{esc_xml(v)}</{tag}>')
def emit_layout(lines, el, indent, skip_height=False, multi_line_default=False):
# Общие layout-свойства — применимы ко всем элементам. Порядок согласован
# с историческим выводом input/label, чтобы не сдвигать существующие снапшоты.
@@ -2655,6 +2690,7 @@ def emit_layout(lines, el, indent, skip_height=False, multi_line_default=False):
lines.append(f"{indent}<GroupVerticalAlign>{el['groupVerticalAlign']}</GroupVerticalAlign>")
if el.get('horizontalAlign'):
lines.append(f"{indent}<HorizontalAlign>{el['horizontalAlign']}</HorizontalAlign>")
emit_generic_scalars(lines, el, indent)
def title_from_name(name):
@@ -3495,6 +3531,8 @@ def emit_page(lines, el, name, eid, indent):
orientation = orientation_map.get(str(el['group']))
if orientation:
lines.append(f'{inner}<Group>{orientation}</Group>')
if el.get('showTitle') is False:
lines.append(f'{inner}<ShowTitle>false</ShowTitle>')
emit_layout(lines, el, inner)
# Companion
@@ -4169,8 +4207,12 @@ def emit_attributes(lines, attrs, indent):
for f in save_fields:
lines.append(f'{inner}\t<Field>{esc_xml(f)}</Field>')
lines.append(f'{inner}</Save>')
if attr.get('fillChecking'):
lines.append(f'{inner}<FillChecking>{attr["fillChecking"]}</FillChecking>')
# Проверка заполнения → <FillCheck> (реальный тег; <FillChecking> в схеме нет).
# bool true → ShowError; строка → verbatim. Синоним fillChecking.
fc_raw = attr['fillCheck'] if 'fillCheck' in attr else attr.get('fillChecking')
if fc_raw:
fcv = 'ShowError' if isinstance(fc_raw, bool) else str(fc_raw)
lines.append(f'{inner}<FillCheck>{fcv}</FillCheck>')
# UseAlways: поля, всегда читаемые. Две формы DSL сливаются:
# attr.useAlways[] (короткие имена) + columns с useAlways:true → <Field>ИмяРеквизита.Поле</Field>.
@@ -4312,6 +4354,9 @@ def emit_commands(lines, cmds, indent):
if cmd.get('action'):
lines.append(f'{inner}<Action>{cmd["action"]}</Action>')
if cmd.get('modifiesSavedData') is True:
lines.append(f'{inner}<ModifiesSavedData>true</ModifiesSavedData>')
emit_functional_options(lines, cmd.get('functionalOptions'), inner)
if cmd.get('currentRowUse'):
@@ -1,4 +1,4 @@
# form-decompile v0.55 — Decompile 1C managed Form.xml to JSON DSL (draft)
# form-decompile v0.56 — Decompile 1C managed Form.xml to JSON DSL (draft)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
param(
@@ -1120,6 +1120,34 @@ $ELEMENT_KEY = @{
'SearchStringAddition'='searchString'; 'ViewStatusAddition'='viewStatus'; 'SearchControlAddition'='searchControl'
}
# Простые скаляры элемента (pass-through, зеркало $script:genericScalars компилятора). kind bool/value.
$GENERIC_SCALARS = @(
@{ Tag='VerticalAlign'; Key='verticalAlign'; Kind='value' }
@{ Tag='ThroughAlign'; Key='throughAlign'; Kind='value' }
@{ Tag='EnableContentChange'; Key='enableContentChange'; Kind='bool' }
@{ Tag='PictureSize'; Key='pictureSize'; Kind='value' }
@{ Tag='TitleHeight'; Key='titleHeight'; Kind='value' }
@{ Tag='ChildItemsWidth'; Key='childItemsWidth'; Kind='value' }
@{ Tag='ShowLeftMargin'; Key='showLeftMargin'; Kind='bool' }
@{ Tag='CellHyperlink'; Key='cellHyperlink'; Kind='bool' }
@{ Tag='ViewMode'; Key='viewMode'; Kind='value' }
@{ Tag='VerticalScrollBar'; Key='verticalScrollBar'; Kind='value' }
@{ Tag='RowInputMode'; Key='rowInputMode'; Kind='value' }
@{ Tag='Mask'; Key='mask'; Kind='value' }
@{ Tag='CreateButton'; Key='createButton'; Kind='bool' }
)
# Захват generic-скаляров. Специфичная обработка (если ключ уже задан) — побеждает.
function Add-GenericScalars {
param($obj, $node)
foreach ($s in $GENERIC_SCALARS) {
if ($obj.Contains($s.Key)) { continue }
$v = Get-Child $node $s.Tag
if ($null -eq $v) { continue }
if ($s.Kind -eq 'bool') { $obj[$s.Key] = ($v -eq 'true') } else { $obj[$s.Key] = $v }
}
}
function Decompile-Children {
param($parentNode, [string]$childContainer = 'ChildItems')
$container = $parentNode.SelectSingleNode("lf:$childContainer", $ns)
@@ -1355,6 +1383,7 @@ function Decompile-Element {
$v = Get-Child $node $p; if ($null -ne $v) { $obj[($p.Substring(0,1).ToLower()+$p.Substring(1))] = (To-Bool $v) }
}
$cbr = Get-Child $node 'ChoiceButtonRepresentation'; if ($cbr) { $obj['choiceButtonRepresentation'] = $cbr }
if ((Get-Child $node 'TextEdit') -eq 'false') { $obj['textEdit'] = $false }
$cl = Decompile-ChoiceList $node; if ($cl) { $obj['choiceList'] = $cl }
Add-FormatProps $obj $node
# Параметры выбора / Связи параметров выбора / Связь по типу
@@ -1504,6 +1533,7 @@ function Decompile-Element {
$g = Get-Child $node 'Group'
$gmap = @{ 'Horizontal'='horizontal'; 'Vertical'='vertical'; 'AlwaysHorizontal'='alwaysHorizontal'; 'AlwaysVertical'='alwaysVertical' }
if ($g -and $gmap.ContainsKey($g)) { $obj['group'] = $gmap[$g] }
if ((Get-Child $node 'ShowTitle') -eq 'false') { $obj['showTitle'] = $false }
$kids = Decompile-Children $node
if ($kids) { $obj['children'] = $kids }
}
@@ -1568,6 +1598,7 @@ function Decompile-Element {
if ($autoTitle) { $obj['title'] = '' }
}
Add-Layout $obj $node
Add-GenericScalars $obj $node
# extendedTooltip: контент companion <ExtendedTooltip><Title> (любой элемент)
$etTitle = $node.SelectSingleNode("lf:ExtendedTooltip/lf:Title", $ns)
if ($etTitle) { $et = Get-MLFormattedValue $etTitle; if ($null -ne $et) { $obj['extendedTooltip'] = $et } }
@@ -1711,7 +1742,7 @@ if ($attrsNode) {
if ($stripped.Count -eq 1) { $ao['save'] = $stripped[0] } else { $ao['save'] = $stripped }
}
}
$fc = Get-Child $a 'FillChecking'; if ($fc) { $ao['fillChecking'] = $fc }
$fc = Get-Child $a 'FillCheck'; if ($fc) { $ao['fillCheck'] = $fc }
$afo = Decompile-FunctionalOptions $a; if ($afo) { $ao['functionalOptions'] = $afo }
$colsNode = $a.SelectSingleNode("lf:Columns", $ns)
if ($colsNode) {
@@ -1839,6 +1870,7 @@ if ($cmdsNode) {
foreach ($c in @($cmdsNode.SelectNodes("lf:Command", $ns))) {
$co = [ordered]@{}; $co['name'] = $c.GetAttribute("name")
$act = Get-Child $c 'Action'; if ($act) { $co['action'] = $act }
if ((Get-Child $c 'ModifiesSavedData') -eq 'true') { $co['modifiesSavedData'] = $true }
$tNode = $c.SelectSingleNode("lf:Title", $ns); if ($tNode) { $t = Get-LangText $tNode; if ($null -ne $t) { $co['title'] = $t } }
$ttNode = $c.SelectSingleNode("lf:ToolTip", $ns); if ($ttNode) { $t = Get-LangText $ttNode; if ($null -ne $t) { $co['tooltip'] = $t } }
$us = Decompile-XrFlag $c 'Use'; if ($null -ne $us) { $co['use'] = $us }
+14 -1
View File
@@ -253,7 +253,19 @@ companion-панели с собственным контентом. Оба не
| `headerHorizontalAlign` | `<HeaderHorizontalAlign>` | `Left`/`Right`/`Center`/`Auto` |
| `headerPicture` | `<HeaderPicture>` | Картинка в шапке колонки. Формат — см. «Картинка-ссылка» ниже |
| `footerPicture` | `<FooterPicture>` | Картинка в подвале колонки. Формат — см. «Картинка-ссылка» ниже |
| `verticalAlign` | `<VerticalAlign>` | `Top`/`Center`/`Bottom` |
| `throughAlign` | `<ThroughAlign>` | `Use`/`DontUse` (сквозное выравнивание группы) |
| `enableContentChange` | `<EnableContentChange>` | bool (группа/страницы) |
| `pictureSize` | `<PictureSize>` | `AutoSize`/`Proportionally`/`ByFontSize`/… (декорация-картинка) |
| `titleHeight` | `<TitleHeight>` | число |
| `childItemsWidth` | `<ChildItemsWidth>` | `Equal`/`LeftWide`/… (ширины дочерних в группе) |
| `showLeftMargin` | `<ShowLeftMargin>` | bool (группа) |
| `cellHyperlink` | `<CellHyperlink>` | bool |
| `mask` | `<Mask>` | строка маски ввода (input) |
| `createButton` | `<CreateButton>` | bool (input) |
| `viewMode` / `verticalScrollBar` / `rowInputMode` | `<ViewMode>`/… | свойства таблицы (pass-through) |
> Эти простые скаляры — pass-through (captured/emitted «как есть»), применимы там, где платформа их пишет.
> `defaultItem`/`enableStartDrag`/`fileDragMode`/`skipOnInput` + cell-свойства (`showInHeader`/`showInFooter`/`autoCellHeight`/`footerHorizontalAlign`/`headerHorizontalAlign`/`headerPicture`/`footerPicture`) — общие для любого поля-колонки (input, label, picField, check).
#### Картинка-ссылка (`headerPicture`/`footerPicture`/`valuesPicture`)
@@ -743,7 +755,7 @@ Pages поддерживает `pagesRepresentation`: `None`, `TabsOnTop`, `Tabs
| `valueType` | string | Тип значений у реквизита типа `ValueList` (`<Settings xsi:type="v8:TypeDescription">`). Грамматика — как у `type`, включая составной `A \| B`. **Три состояния**: нет ключа → нет `<Settings>`; `""` → пустой `<Settings…/>` (список без ограничения типа); тип → с типом. Forgiving-синонимы: `typeDescription` (≈1С «ОписаниеТипов» / XML), `описаниеТипов`, `типЗначений`. Пример: `"valueType": "CatalogRef.Контрагенты"` |
| `savedData` | bool | Сохраняемые данные (`<SavedData>`) |
| `save` | bool/string/array | Сохранение значения в пользовательских настройках (`<Save><Field>…`). `true``<Field>имя</Field>`; строка/массив строк → под-поля с авто-префиксом `имя.` (путь с точкой / UUID `1/0:…` / совпадающее с именем — берётся как есть). Нет ключа или `false` → не эмитится. Пример периода: `["Период","EndDate","StartDate","Variant"]` |
| `fillChecking` | string | `Show`, `DontShow` |
| `fillCheck` | bool/string | Проверка заполнения реквизита (`<FillCheck>`). `true``ShowError` (единственное значение в схеме); строка → verbatim. Синоним `fillChecking`. (`<FillChecking>` в схеме нет — был багом) |
| `columns` | array | Колонки для ValueTable/ValueTree (`{ name, type, title?, functionalOptions?, useAlways? }`) |
| `additionalColumns` | array | Доп. колонки табличных частей объекта: `[{ table: "Объект.ТабЧасть", columns: [<col>] }]`. У главного реквизита-объекта; `<col>` — та же грамматика, что у `columns`. Эмитятся в `<Columns>` после прямых колонок |
| `settings` | object | Настройки динамического списка (только `type: "DynamicList"`) |
@@ -861,6 +873,7 @@ Pages поддерживает `pagesRepresentation`: `None`, `TabsOnTop`, `Tabs
| `use` | bool/object | Доступность команды по ролям (`<Use>`). См. §4.1c |
| `functionalOptions` | array | Функциональные опции команды (см. §5) |
| `currentRowUse` | string | Использование текущей строки: `Auto`, `DontUse`, `Use` |
| `modifiesSavedData` | bool | Команда изменяет сохраняемые данные (`<ModifiesSavedData>`); эмитится только `true` |
| `shortcut` | string | Клавиатурное сочетание |
| `picture` | string | Ссылка на картинку |
| `representation` | string | `Auto`, `Picture`, `Text`, `PictureAndText` |
@@ -23,7 +23,7 @@
],
"attributes": [
{ "name": "Объект", "type": "DataProcessorObject.Типы", "main": true },
{ "name": "Строка", "type": "string(200)", "view": false, "save": true },
{ "name": "Строка", "type": "string(200)", "view": false, "save": true, "fillCheck": true },
{ "name": "Число", "type": "decimal(10,0,nonneg)", "edit": false },
{ "name": "Дата", "type": "dateTime", "title": "" },
{ "name": "Булево", "type": "boolean" },
@@ -27,7 +27,7 @@
{ "name": "Результат", "type": "string" }
],
"commands": [
{ "name": "Выполнить", "action": "ВыполнитьОбработка", "shortcut": "Ctrl+Enter", "use": false }
{ "name": "Выполнить", "action": "ВыполнитьОбработка", "shortcut": "Ctrl+Enter", "use": false, "modifiesSavedData": true }
]
}
}
+3 -3
View File
@@ -17,12 +17,12 @@
"title": "Группы",
"elements": [
{ "cmdBar": "КоманднаяПанель", "autofill": true },
{ "group": "horizontal", "name": "ГруппаШапка", "behavior": "usual", "showTitle": true, "title": "Шапка", "horizontalStretch": true, "groupHorizontalAlign": "Right", "children": [
{ "input": "Поле1", "path": "Поле1", "title": "Поле 1", "width": 20, "skipOnInput": true },
{ "group": "horizontal", "name": "ГруппаШапка", "behavior": "usual", "showTitle": true, "title": "Шапка", "horizontalStretch": true, "groupHorizontalAlign": "Right", "throughAlign": "Use", "verticalAlign": "Top", "childItemsWidth": "Equal", "children": [
{ "input": "Поле1", "path": "Поле1", "title": "Поле 1", "width": 20, "skipOnInput": true, "mask": "999-999" },
{ "input": "Поле2", "path": "Поле2", "title": "Поле 2" },
{ "labelField": "Метка", "path": "Поле1", "groupVerticalAlign": "Center" }
]},
{ "group": "vertical", "name": "ГруппаПодвал", "behavior": "collapsible", "collapsed": true, "title": { "ru": "Подвал", "en": "Footer" }, "children": [
{ "group": "vertical", "name": "ГруппаПодвал", "behavior": "collapsible", "collapsed": true, "title": { "ru": "Подвал", "en": "Footer" }, "showLeftMargin": false, "enableContentChange": false, "children": [
{ "input": "Поле3", "path": "Поле3", "title": "Поле 3" }
]}
],
+1 -1
View File
@@ -18,7 +18,7 @@
"properties": { "autoTitle": false },
"elements": [
{ "pages": "СтраницыМастера", "pagesRepresentation": "None", "tooltip": "Страницы мастера настройки", "children": [
{ "page": "Шаг1", "title": "", "children": [
{ "page": "Шаг1", "title": "", "showTitle": false, "children": [
{ "input": "Параметр1", "path": "Параметр1" }
]},
{ "page": "Шаг2", "title": "Результат", "tooltip": "Шаг \"Результат\"", "group": "horizontal", "children": [
@@ -60,6 +60,7 @@
<Save>
<Field>Строка</Field>
</Save>
<FillCheck>ShowError</FillCheck>
</Attribute>
<Attribute name="Число" id="15">
<Title>
@@ -73,6 +73,7 @@
<xr:Common>false</xr:Common>
</Use>
<Action>ВыполнитьОбработка</Action>
<ModifiesSavedData>true</ModifiesSavedData>
<Shortcut>Ctrl+Enter</Shortcut>
</Command>
</Commands>
@@ -26,6 +26,9 @@
<Behavior>Usual</Behavior>
<HorizontalStretch>true</HorizontalStretch>
<GroupHorizontalAlign>Right</GroupHorizontalAlign>
<VerticalAlign>Top</VerticalAlign>
<ThroughAlign>Use</ThroughAlign>
<ChildItemsWidth>Equal</ChildItemsWidth>
<ExtendedTooltip name="ГруппаШапкаРасширеннаяПодсказка" id="4"/>
<ChildItems>
<InputField name="Поле1" id="5">
@@ -38,6 +41,7 @@
</Title>
<SkipOnInput>true</SkipOnInput>
<Width>20</Width>
<Mask>999-999</Mask>
<ContextMenu name="Поле1КонтекстноеМеню" id="6"/>
<ExtendedTooltip name="Поле1РасширеннаяПодсказка" id="7"/>
</InputField>
@@ -74,6 +78,8 @@
<Group>Vertical</Group>
<Behavior>Collapsible</Behavior>
<Collapsed>true</Collapsed>
<EnableContentChange>false</EnableContentChange>
<ShowLeftMargin>false</ShowLeftMargin>
<ExtendedTooltip name="ГруппаПодвалРасширеннаяПодсказка" id="15"/>
<ChildItems>
<InputField name="Поле3" id="16">
@@ -20,6 +20,7 @@
<ExtendedTooltip name="СтраницыМастераРасширеннаяПодсказка" id="2"/>
<ChildItems>
<Page name="Шаг1" id="3">
<ShowTitle>false</ShowTitle>
<ExtendedTooltip name="Шаг1РасширеннаяПодсказка" id="4"/>
<ChildItems>
<InputField name="Параметр1" id="5">