feat(form-decompile,form-compile): спец-поля документ/датчик из ring-3 (SpreadSheet/HTML/Text/Formatted/ProgressBar/TrackBar)

Кластер ring-3: 6 листовых полей-«документ/датчик» больше не валят
декомпилятор в fast-fail. По корпусу SpreadSheetDocumentField — 21% форм
(самый массовый триггер ring-3), обгоняет CommandInterface.

Декомпилятор: +ELEMENT_KEY, общий Decompile-SimpleField (скелет поля) +
Add-GaugeScalars (числовые min/max/шаги без xsi:type — ≠ типизированных
input). Типоспец. enum/bool скаляры — через GENERIC_SCALARS.
enableDrag/enableStartDrag — фактическое значение (платформа эмитит явный
false на SS; заодно покрыло не-дин-список таблицы). Форменные ScalingMode/
VerticalSpacing → KNOWN_FORM_PROPS.

Компилятор(+py байт-в-байт): тип-ключи spreadsheet/html/textDoc/formattedDoc/
progressBar/trackBar + синонимы (XML-имя/рус), общий Emit-SimpleField,
GENERIC_SCALARS (output/protection/scrollbars/viewScalingMode/show*/…).

Спец-типы реквизитов с локальным xmlns на <v8:Type> (mxl:SpreadsheetDocument
7387, fd:FormattedDocument, d5p1:TextDocument/Chart/GanttChart/Flowchart/Geo/
DataAnalysis, pdfdoc:PDFDocument, pl:Planner) — резолв по полному значению
типа (префикс d5p1 неоднозначен).

Выборка 2.17: ring3 61→37 (−24 формы), match 156→166, 0 dec/compile-fail.
Кейс special-fields (все 6 типов + спец-типы) сертифицирован загрузкой в 1С.
Регресс 40/40 (ps1+py).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-09 19:25:12 +03:00
co-authored by Claude Opus 4.8
parent 24e7116b7d
commit 7905615091
14 changed files with 871 additions and 15 deletions
@@ -1,4 +1,4 @@
# form-compile v1.94 — Compile 1C managed form from JSON or object metadata
# form-compile v1.95 — Compile 1C managed form from JSON or object metadata
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[string]$JsonPath,
@@ -2153,6 +2153,28 @@ function Emit-SingleType {
return
}
# Спец-типы платформы с собственным namespace (объявляется ЛОКАЛЬНО на <v8:Type>).
# Префикс d5p1 неоднозначен (5 разных URI), поэтому маппинг по полному значению типа.
# К таким типам привязаны спец-поля: mxl→SpreadSheetDocumentField, fd→FormattedDocumentField,
# d5p1:TextDocument→TextDocumentField, pdfdoc→PDF, pl→Planner, chart/geo/graphscheme/data-analysis.
$specialTypeNs = @{
"mxl:SpreadsheetDocument" = "http://v8.1c.ru/8.2/data/spreadsheet"
"fd:FormattedDocument" = "http://v8.1c.ru/8.2/data/formatted-document"
"d5p1:TextDocument" = "http://v8.1c.ru/8.1/data/txtedt"
"d5p1:Chart" = "http://v8.1c.ru/8.2/data/chart"
"d5p1:GanttChart" = "http://v8.1c.ru/8.2/data/chart"
"d5p1:FlowchartContextType" = "http://v8.1c.ru/8.2/data/graphscheme"
"d5p1:DataAnalysisTimeIntervalUnitType" = "http://v8.1c.ru/8.2/data/data-analysis"
"d5p1:GeographicalSchema" = "http://v8.1c.ru/8.2/data/geo"
"pdfdoc:PDFDocument" = "http://v8.1c.ru/8.3/data/pdf"
"pl:Planner" = "http://v8.1c.ru/8.3/data/planner"
}
if ($specialTypeNs.ContainsKey($typeStr)) {
$pref = $typeStr.Substring(0, $typeStr.IndexOf(':'))
X "$indent<v8:Type xmlns:$pref=`"$($specialTypeNs[$typeStr])`">$typeStr</v8:Type>"
return
}
# Fallback with validation
if ($script:knownInvalidTypes.ContainsKey($typeStr)) {
throw "Invalid form attribute type '$typeStr': $($script:knownInvalidTypes[$typeStr])"
@@ -2524,6 +2546,19 @@ function Emit-Element {
"SearchControl" = "searchControl"
"управлениеПоиском" = "searchControl"
"Управление поиском" = "searchControl"
# Спец-поля (документ/датчик) — XML-имя/рус. → канон
"SpreadSheetDocumentField" = "spreadsheet"
"ПолеТабличногоДокумента" = "spreadsheet"
"HTMLDocumentField" = "html"
"ПолеHTMLДокумента" = "html"
"TextDocumentField" = "textDoc"
"ПолеТекстовогоДокумента" = "textDoc"
"FormattedDocumentField" = "formattedDoc"
"ПолеФорматированногоДокумента" = "formattedDoc"
"ProgressBarField" = "progressBar"
"ПолеИндикатора" = "progressBar"
"TrackBarField" = "trackBar"
"ПолеПолосыРегулирования" = "trackBar"
}
foreach ($pair in $synonyms.GetEnumerator()) {
if ($null -ne $el.PSObject.Properties[$pair.Key] -and $null -eq $el.PSObject.Properties[$pair.Value]) {
@@ -2556,7 +2591,7 @@ function Emit-Element {
# у popup/button/cmdBar. Тип-ключ владельца (popup/button/…) должен выиграть.
# pages/page ПЕРЕД group: у Page/Pages ключ 'group' — это направление раскладки детей
# (<Group>Horizontal</Group>), а не тип UsualGroup. Реальная UsualGroup ключа page/pages не несёт.
foreach ($key in @("columnGroup","buttonGroup","pages","page","group","input","check","radio","label","labelField","table","button","calendar","cmdBar","popup","searchString","viewStatus","searchControl","picField","picture")) {
foreach ($key in @("columnGroup","buttonGroup","pages","page","group","input","check","radio","label","labelField","table","button","calendar","cmdBar","popup","searchString","viewStatus","searchControl","picField","picture","spreadsheet","html","textDoc","formattedDoc","progressBar","trackBar")) {
if ($el.$key -ne $null) {
$typeKey = $key
break
@@ -2573,6 +2608,12 @@ function Emit-Element {
# type keys
"group"=1;"columnGroup"=1;"buttonGroup"=1;"input"=1;"check"=1;"radio"=1;"label"=1;"labelField"=1;"table"=1;"pages"=1;"page"=1
"button"=1;"picture"=1;"picField"=1;"calendar"=1;"cmdBar"=1;"popup"=1
# спец-поля (документ/датчик) — тип-ключи + типоспец. скаляры
"spreadsheet"=1;"html"=1;"textDoc"=1;"formattedDoc"=1;"progressBar"=1;"trackBar"=1
"showPercent"=1;"largeStep"=1;"markingStep"=1;"step"=1
"horizontalScrollBar"=1;"viewScalingMode"=1;"output"=1;"selectionShowMode"=1;"protection"=1
"edit"=1;"showGrid"=1;"showGroups"=1;"showHeaders"=1;"showRowAndColumnNames"=1;"showCellNames"=1
"pointerType"=1;"drawingSelectionShowMode"=1;"warningOnEditRepresentation"=1;"markingAppearance"=1
# columnGroup-specific
"showInHeader"=1
# radio-specific
@@ -2680,6 +2721,12 @@ function Emit-Element {
"calendar" { Emit-Calendar -el $el -name $name -id $id -indent $indent }
"cmdBar" { Emit-CommandBar -el $el -name $name -id $id -indent $indent }
"popup" { Emit-Popup -el $el -name $name -id $id -indent $indent }
"spreadsheet" { Emit-SimpleField -el $el -name $name -id $id -indent $indent -xmlTag "SpreadSheetDocumentField" -typeKey "spreadsheet" }
"html" { Emit-SimpleField -el $el -name $name -id $id -indent $indent -xmlTag "HTMLDocumentField" -typeKey "html" }
"textDoc" { Emit-SimpleField -el $el -name $name -id $id -indent $indent -xmlTag "TextDocumentField" -typeKey "textDoc" }
"formattedDoc" { Emit-SimpleField -el $el -name $name -id $id -indent $indent -xmlTag "FormattedDocumentField" -typeKey "formattedDoc" }
"progressBar" { Emit-SimpleField -el $el -name $name -id $id -indent $indent -xmlTag "ProgressBarField" -typeKey "progressBar" }
"trackBar" { Emit-SimpleField -el $el -name $name -id $id -indent $indent -xmlTag "TrackBarField" -typeKey "trackBar" }
}
}
@@ -2732,7 +2779,8 @@ function Emit-CommonElementProps {
$siv = if ($el.skipOnInput -eq $true) { 'true' } else { 'false' }
X "$indent<SkipOnInput>$siv</SkipOnInput>"
}
if ($el.enableStartDrag -eq $true) { X "$indent<EnableStartDrag>true</EnableStartDrag>" }
# EnableStartDrag — фактическое значение (платформа эмитит и явный false, напр. SpreadSheet)
if ($null -ne $el.enableStartDrag) { X "$indent<EnableStartDrag>$(if ($el.enableStartDrag){'true'}else{'false'})</EnableStartDrag>" }
if ($el.fileDragMode) { X "$indent<FileDragMode>$($el.fileDragMode)</FileDragMode>" }
# Cell-свойства поля в таблице (общие для Input/Label/Picture/CheckBox): захват «как есть»
foreach ($p in @(@('showInHeader','ShowInHeader'), @('showInFooter','ShowInFooter'), @('autoCellHeight','AutoCellHeight'))) {
@@ -2849,6 +2897,23 @@ $script:genericScalars = @(
@{ Tag='CreateButton'; Key='createButton'; Kind='bool' }
@{ Tag='FixingInTable'; Key='fixingInTable'; Kind='value' }
@{ Tag='VerticalSpacing'; Key='verticalSpacing'; Kind='value' }
# Спец-поля (документ/датчик) — типоспец. enum/bool скаляры pass-through
@{ Tag='HorizontalScrollBar'; Key='horizontalScrollBar'; Kind='value' }
@{ Tag='ViewScalingMode'; Key='viewScalingMode'; Kind='value' }
@{ Tag='Output'; Key='output'; Kind='value' }
@{ Tag='SelectionShowMode'; Key='selectionShowMode'; Kind='value' }
@{ Tag='PointerType'; Key='pointerType'; Kind='value' }
@{ Tag='DrawingSelectionShowMode'; Key='drawingSelectionShowMode'; Kind='value' }
@{ Tag='WarningOnEditRepresentation'; Key='warningOnEditRepresentation'; Kind='value' }
@{ Tag='MarkingAppearance'; Key='markingAppearance'; Kind='value' }
@{ Tag='Protection'; Key='protection'; Kind='bool' }
@{ Tag='Edit'; Key='edit'; Kind='bool' }
@{ Tag='ShowGrid'; Key='showGrid'; Kind='bool' }
@{ Tag='ShowGroups'; Key='showGroups'; Kind='bool' }
@{ Tag='ShowHeaders'; Key='showHeaders'; Kind='bool' }
@{ Tag='ShowRowAndColumnNames'; Key='showRowAndColumnNames'; Kind='bool' }
@{ Tag='ShowCellNames'; Key='showCellNames'; Kind='bool' }
@{ Tag='ShowPercent'; Key='showPercent'; Kind='bool' }
)
function Emit-GenericScalars {
@@ -3809,7 +3874,7 @@ function Emit-Table {
if ($el.verticalLines -eq $false) { X "$inner<VerticalLines>false</VerticalLines>" }
if ($el.horizontalLines -eq $false) { X "$inner<HorizontalLines>false</HorizontalLines>" }
if ($el.initialTreeView) { X "$inner<InitialTreeView>$($el.initialTreeView)</InitialTreeView>" }
if ($el.enableDrag -eq $true) { X "$inner<EnableDrag>true</EnableDrag>" }
if ($null -ne $el.enableDrag) { X "$inner<EnableDrag>$(if ($el.enableDrag){'true'}else{'false'})</EnableDrag>" }
if ($el.rowPictureDataPath) { X "$inner<RowPictureDataPath>$($el.rowPictureDataPath)</RowPictureDataPath>" }
if ($el.rowsPicture) {
# Строка = Ref (LoadTransparent дефолт false); объект {src, loadTransparent} → факт. значение
@@ -4153,6 +4218,45 @@ function Emit-Calendar {
X "$indent</CalendarField>"
}
# Спец-поля «документ/датчик» (SpreadSheet/HTML/Text/Formatted/ProgressBar/TrackBar):
# единый скелет поля (path/title/flags/titleLocation/editMode/layout/companions/events).
# Типоспец. enum/bool скаляры — через generic (Emit-Layout→Emit-GenericScalars);
# числовые скаляры датчиков (min/max/шаги) — без xsi:type (≠ типизированных InputField).
# enableDrag/enableStartDrag — общие (Emit-CommonElementProps), фактическое значение.
function Emit-SimpleField {
param($el, [string]$name, [int]$id, [string]$indent, [string]$xmlTag, [string]$typeKey)
X "$indent<$xmlTag name=`"$name`" id=`"$id`"$(DI-Attr $el)>"
$inner = "$indent`t"
if ($el.path) { X "$inner<DataPath>$($el.path)</DataPath>" }
Emit-Title -el $el -name $name -indent $inner -auto:(-not $el.path)
Emit-CommonFlags -el $el -indent $inner
if ($el.titleLocation) { X "$inner<TitleLocation>$(Map-TitleLoc "$($el.titleLocation)")</TitleLocation>" }
if ($el.editMode) { X "$inner<EditMode>$($el.editMode)</EditMode>" }
Emit-Layout -el $el -indent $inner
# EnableDrag — фактическое значение (SpreadSheet; платформа эмитит явный false). enableStartDrag — через Emit-Layout.
if ($null -ne $el.enableDrag) { X "$inner<EnableDrag>$(if ($el.enableDrag){'true'}else{'false'})</EnableDrag>" }
# Датчики (ProgressBar/TrackBar) — числовые скаляры (без xsi:type)
foreach ($p in @(@('minValue','MinValue'), @('maxValue','MaxValue'), @('largeStep','LargeStep'), @('markingStep','MarkingStep'), @('step','Step'))) {
if ($null -ne $el.($p[0])) { X "$inner<$($p[1])>$($el.($p[0]))</$($p[1])>" }
}
# Оформление (цвета/шрифты/граница) — перед компаньонами
Emit-Appearance -el $el -indent $inner -profile 'field'
# Companions
Emit-CompanionPanel -tag "ContextMenu" -name "${name}КонтекстноеМеню" -indent $inner -panel $el.contextMenu
Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner -content $el.extendedTooltip
Emit-Events -el $el -elementName $name -indent $inner -typeKey $typeKey
X "$indent</$xmlTag>"
}
function Emit-CommandBar {
param($el, [string]$name, [int]$id, [string]$indent)
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# form-compile v1.94 — Compile 1C managed form from JSON or object metadata
# form-compile v1.95 — Compile 1C managed form from JSON or object metadata
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import copy
@@ -1829,6 +1829,12 @@ KNOWN_KEYS = {
"choiceForm", "choiceHistoryOnInput", "footerDataPath", "minValue", "maxValue",
# Button — пометка toggle-кнопки
"checked",
# спец-поля (документ/датчик) — тип-ключи + типоспец. скаляры
"spreadsheet", "html", "textDoc", "formattedDoc", "progressBar", "trackBar",
"showPercent", "largeStep", "markingStep", "step",
"horizontalScrollBar", "viewScalingMode", "output", "selectionShowMode", "protection",
"edit", "showGrid", "showGroups", "showHeaders", "showRowAndColumnNames", "showCellNames",
"pointerType", "drawingSelectionShowMode", "warningOnEditRepresentation", "markingAppearance",
}
# picture/picField — НИЗКИЙ приоритет: 'picture' это и тип (PictureDecoration), и свойство-иконка
@@ -1836,7 +1842,8 @@ KNOWN_KEYS = {
# pages/page ПЕРЕД group: у Page/Pages ключ 'group' — это направление раскладки детей
# (<Group>Horizontal</Group>), а не тип UsualGroup. Реальная UsualGroup ключа page/pages не несёт.
TYPE_KEYS = ["columnGroup", "buttonGroup", "pages", "page", "group", "input", "check", "radio", "label", "labelField", "table",
"button", "calendar", "cmdBar", "popup", "searchString", "viewStatus", "searchControl", "picField", "picture"]
"button", "calendar", "cmdBar", "popup", "searchString", "viewStatus", "searchControl", "picField", "picture",
"spreadsheet", "html", "textDoc", "formattedDoc", "progressBar", "trackBar"]
# Synonyms: model often writes XML name or Russian (ПолеПереключателя/RadioButtonField → radio)
ELEMENT_TYPE_SYNONYMS = {
@@ -1889,6 +1896,19 @@ ELEMENT_TYPE_SYNONYMS = {
"SearchControl": "searchControl",
"управлениеПоиском": "searchControl",
"Управление поиском": "searchControl",
# Спец-поля (документ/датчик) — XML-имя/рус. → канон
"SpreadSheetDocumentField": "spreadsheet",
"ПолеТабличногоДокумента": "spreadsheet",
"HTMLDocumentField": "html",
"ПолеHTMLДокумента": "html",
"TextDocumentField": "textDoc",
"ПолеТекстовогоДокумента": "textDoc",
"FormattedDocumentField": "formattedDoc",
"ПолеФорматированногоДокумента": "formattedDoc",
"ProgressBarField": "progressBar",
"ПолеИндикатора": "progressBar",
"TrackBarField": "trackBar",
"ПолеПолосыРегулирования": "trackBar",
}
# Тип-синонимы, применяемые ТОЛЬКО к строковому значению (имя элемента); объект/массив
@@ -2511,8 +2531,9 @@ def emit_common_element_props(lines, el, indent):
if 'skipOnInput' in el and el['skipOnInput'] is not None:
siv = 'true' if el['skipOnInput'] is True else 'false'
lines.append(f"{indent}<SkipOnInput>{siv}</SkipOnInput>")
if el.get('enableStartDrag') is True:
lines.append(f"{indent}<EnableStartDrag>true</EnableStartDrag>")
# EnableStartDrag — фактическое значение (платформа эмитит и явный false, напр. SpreadSheet)
if el.get('enableStartDrag') is not None:
lines.append(f'{indent}<EnableStartDrag>{"true" if el["enableStartDrag"] else "false"}</EnableStartDrag>')
if el.get('fileDragMode'):
lines.append(f"{indent}<FileDragMode>{el['fileDragMode']}</FileDragMode>")
# Cell-свойства поля в таблице (общие для Input/Label/Picture/CheckBox): захват «как есть»
@@ -2697,6 +2718,23 @@ GENERIC_SCALARS = [
('CreateButton', 'createButton', 'bool'),
('FixingInTable', 'fixingInTable', 'value'),
('VerticalSpacing', 'verticalSpacing', 'value'),
# Spec-fields (document/gauge) - type-specific enum/bool scalars pass-through
('HorizontalScrollBar', 'horizontalScrollBar', 'value'),
('ViewScalingMode', 'viewScalingMode', 'value'),
('Output', 'output', 'value'),
('SelectionShowMode', 'selectionShowMode', 'value'),
('PointerType', 'pointerType', 'value'),
('DrawingSelectionShowMode', 'drawingSelectionShowMode', 'value'),
('WarningOnEditRepresentation', 'warningOnEditRepresentation', 'value'),
('MarkingAppearance', 'markingAppearance', 'value'),
('Protection', 'protection', 'bool'),
('Edit', 'edit', 'bool'),
('ShowGrid', 'showGrid', 'bool'),
('ShowGroups', 'showGroups', 'bool'),
('ShowHeaders', 'showHeaders', 'bool'),
('ShowRowAndColumnNames', 'showRowAndColumnNames', 'bool'),
('ShowCellNames', 'showCellNames', 'bool'),
('ShowPercent', 'showPercent', 'bool'),
]
@@ -2971,6 +3009,27 @@ def emit_single_type(lines, type_str, indent):
lines.append(f'{indent}<v8:Type>cfg:{type_str}</v8:Type>')
return
# Спец-типы платформы с собственным namespace (объявляется ЛОКАЛЬНО на <v8:Type>).
# Префикс d5p1 неоднозначен (5 разных URI), поэтому маппинг по полному значению типа.
# К таким типам привязаны спец-поля: mxl→SpreadSheetDocumentField, fd→FormattedDocumentField,
# d5p1:TextDocument→TextDocumentField, pdfdoc→PDF, pl→Planner, chart/geo/graphscheme/data-analysis.
special_type_ns = {
"mxl:SpreadsheetDocument": "http://v8.1c.ru/8.2/data/spreadsheet",
"fd:FormattedDocument": "http://v8.1c.ru/8.2/data/formatted-document",
"d5p1:TextDocument": "http://v8.1c.ru/8.1/data/txtedt",
"d5p1:Chart": "http://v8.1c.ru/8.2/data/chart",
"d5p1:GanttChart": "http://v8.1c.ru/8.2/data/chart",
"d5p1:FlowchartContextType": "http://v8.1c.ru/8.2/data/graphscheme",
"d5p1:DataAnalysisTimeIntervalUnitType": "http://v8.1c.ru/8.2/data/data-analysis",
"d5p1:GeographicalSchema": "http://v8.1c.ru/8.2/data/geo",
"pdfdoc:PDFDocument": "http://v8.1c.ru/8.3/data/pdf",
"pl:Planner": "http://v8.1c.ru/8.3/data/planner",
}
if type_str in special_type_ns:
pref = type_str.split(':', 1)[0]
lines.append(f'{indent}<v8:Type xmlns:{pref}="{special_type_ns[type_str]}">{type_str}</v8:Type>')
return
# Fallback with validation
if type_str in KNOWN_INVALID_TYPES:
raise ValueError(f"Invalid form attribute type '{type_str}': {KNOWN_INVALID_TYPES[type_str]}")
@@ -3068,6 +3127,12 @@ def emit_element(lines, el, indent, in_cmd_bar=False):
'searchString': lambda lines, el, name, eid, indent: emit_addition(lines, el, name, eid, 'searchString', indent),
'viewStatus': lambda lines, el, name, eid, indent: emit_addition(lines, el, name, eid, 'viewStatus', indent),
'searchControl': lambda lines, el, name, eid, indent: emit_addition(lines, el, name, eid, 'searchControl', indent),
'spreadsheet': lambda lines, el, name, eid, indent: emit_simple_field(lines, el, name, eid, indent, 'SpreadSheetDocumentField', 'spreadsheet'),
'html': lambda lines, el, name, eid, indent: emit_simple_field(lines, el, name, eid, indent, 'HTMLDocumentField', 'html'),
'textDoc': lambda lines, el, name, eid, indent: emit_simple_field(lines, el, name, eid, indent, 'TextDocumentField', 'textDoc'),
'formattedDoc': lambda lines, el, name, eid, indent: emit_simple_field(lines, el, name, eid, indent, 'FormattedDocumentField', 'formattedDoc'),
'progressBar': lambda lines, el, name, eid, indent: emit_simple_field(lines, el, name, eid, indent, 'ProgressBarField', 'progressBar'),
'trackBar': lambda lines, el, name, eid, indent: emit_simple_field(lines, el, name, eid, indent, 'TrackBarField', 'trackBar'),
}
emitter = emitters.get(type_key)
@@ -3519,8 +3584,8 @@ def emit_table(lines, el, name, eid, indent):
lines.append(f'{inner}<HorizontalLines>false</HorizontalLines>')
if el.get('initialTreeView'):
lines.append(f'{inner}<InitialTreeView>{el["initialTreeView"]}</InitialTreeView>')
if el.get('enableDrag') is True:
lines.append(f'{inner}<EnableDrag>true</EnableDrag>')
if el.get('enableDrag') is not None:
lines.append(f'{inner}<EnableDrag>{"true" if el["enableDrag"] else "false"}</EnableDrag>')
if el.get('rowPictureDataPath'):
lines.append(f'{inner}<RowPictureDataPath>{el["rowPictureDataPath"]}</RowPictureDataPath>')
if el.get('rowsPicture'):
@@ -3805,6 +3870,45 @@ def emit_picture_field(lines, el, name, eid, indent):
lines.append(f'{indent}</PictureField>')
def emit_simple_field(lines, el, name, eid, indent, xml_tag, type_key):
# Спец-поля "документ/датчик" (SpreadSheet/HTML/Text/Formatted/ProgressBar/TrackBar):
# единый скелет поля. Типоспец. enum/bool скаляры — через generic (emit_layout);
# числовые скаляры датчиков (min/max/шаги) — без xsi:type; enableDrag — фактическое значение.
lines.append(f'{indent}<{xml_tag} name="{name}" id="{eid}"{di_attr(el)}>')
inner = f'{indent}\t'
if el.get('path'):
lines.append(f'{inner}<DataPath>{el["path"]}</DataPath>')
emit_title(lines, el, name, inner, auto=not el.get('path'))
emit_common_flags(lines, el, inner)
if el.get('titleLocation'):
lines.append(f'{inner}<TitleLocation>{map_title_loc(el["titleLocation"])}</TitleLocation>')
if el.get('editMode'):
lines.append(f'{inner}<EditMode>{el["editMode"]}</EditMode>')
emit_layout(lines, el, inner)
# EnableDrag — фактическое значение (SpreadSheet; платформа эмитит явный false). enableStartDrag — через emit_layout.
if el.get('enableDrag') is not None:
lines.append(f'{inner}<EnableDrag>{"true" if el["enableDrag"] else "false"}</EnableDrag>')
# Датчики (ProgressBar/TrackBar) — числовые скаляры (без xsi:type)
for key, tag in (('minValue', 'MinValue'), ('maxValue', 'MaxValue'), ('largeStep', 'LargeStep'), ('markingStep', 'MarkingStep'), ('step', 'Step')):
if el.get(key) is not None:
lines.append(f'{inner}<{tag}>{el[key]}</{tag}>')
# Оформление (цвета/шрифты/граница) — перед компаньонами
emit_appearance(lines, el, inner, 'field')
# Companions
emit_companion_panel(lines, 'ContextMenu', f'{name}КонтекстноеМеню', inner, el.get('contextMenu'))
emit_companion(lines, 'ExtendedTooltip', f'{name}РасширеннаяПодсказка', inner, el.get('extendedTooltip'))
emit_events(lines, el, name, inner, type_key)
lines.append(f'{indent}</{xml_tag}>')
def emit_calendar(lines, el, name, eid, indent):
lines.append(f'{indent}<CalendarField name="{name}" id="{eid}"{di_attr(el)}>')
inner = f'{indent}\t'
@@ -1,4 +1,4 @@
# form-decompile v0.70 — Decompile 1C managed Form.xml to JSON DSL (draft)
# form-decompile v0.71 — Decompile 1C managed Form.xml to JSON DSL (draft)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
param(
@@ -788,7 +788,9 @@ function Add-Layout {
# Общие свойства элемента (любой тип): default/drag/skip
if ((Get-Child $node 'DefaultItem') -eq 'true') { $obj['defaultItem'] = $true }
$soi = Get-Child $node 'SkipOnInput'; if ($null -ne $soi) { $obj['skipOnInput'] = ($soi -eq 'true') }
if ((Get-Child $node 'EnableStartDrag') -eq 'true') { $obj['enableStartDrag'] = $true }
# EnableStartDrag/EnableDrag — фактическое значение (платформа эмитит и явный false, напр. SpreadSheet)
$esd = Get-Child $node 'EnableStartDrag'; if ($null -ne $esd) { $obj['enableStartDrag'] = ($esd -eq 'true') }
$edr = Get-Child $node 'EnableDrag'; if ($null -ne $edr) { $obj['enableDrag'] = ($edr -eq 'true') }
$fdm = Get-Child $node 'FileDragMode'; if ($fdm) { $obj['fileDragMode'] = $fdm }
# AutoMaxWidth: компилятор додумывает false для multiLine-input без явного ключа (multiLineDefault).
# Захват факт. значения; multiLine-input без тега → autoMaxWidth:true (суппресс эвристики).
@@ -1147,7 +1149,9 @@ $ELEMENT_KEY = @{
'RadioButtonField'='radio'; 'LabelDecoration'='label'; 'LabelField'='labelField';
'PictureDecoration'='picture'; 'PictureField'='picField'; 'CalendarField'='calendar';
'Table'='table'; 'Pages'='pages'; 'Page'='page'; 'Button'='button'; 'CommandBar'='cmdBar'; 'Popup'='popup';
'SearchStringAddition'='searchString'; 'ViewStatusAddition'='viewStatus'; 'SearchControlAddition'='searchControl'
'SearchStringAddition'='searchString'; 'ViewStatusAddition'='viewStatus'; 'SearchControlAddition'='searchControl';
'SpreadSheetDocumentField'='spreadsheet'; 'HTMLDocumentField'='html'; 'TextDocumentField'='textDoc';
'FormattedDocumentField'='formattedDoc'; 'ProgressBarField'='progressBar'; 'TrackBarField'='trackBar'
}
# Простые скаляры элемента (pass-through, зеркало $script:genericScalars компилятора). kind bool/value.
@@ -1167,6 +1171,23 @@ $GENERIC_SCALARS = @(
@{ Tag='CreateButton'; Key='createButton'; Kind='bool' }
@{ Tag='FixingInTable'; Key='fixingInTable'; Kind='value' }
@{ Tag='VerticalSpacing'; Key='verticalSpacing'; Kind='value' }
# Спец-поля (документ/датчик) — типоспец. enum/bool скаляры pass-through (зеркало компилятора)
@{ Tag='HorizontalScrollBar'; Key='horizontalScrollBar'; Kind='value' }
@{ Tag='ViewScalingMode'; Key='viewScalingMode'; Kind='value' }
@{ Tag='Output'; Key='output'; Kind='value' }
@{ Tag='SelectionShowMode'; Key='selectionShowMode'; Kind='value' }
@{ Tag='PointerType'; Key='pointerType'; Kind='value' }
@{ Tag='DrawingSelectionShowMode'; Key='drawingSelectionShowMode'; Kind='value' }
@{ Tag='WarningOnEditRepresentation'; Key='warningOnEditRepresentation'; Kind='value' }
@{ Tag='MarkingAppearance'; Key='markingAppearance'; Kind='value' }
@{ Tag='Protection'; Key='protection'; Kind='bool' }
@{ Tag='Edit'; Key='edit'; Kind='bool' }
@{ Tag='ShowGrid'; Key='showGrid'; Kind='bool' }
@{ Tag='ShowGroups'; Key='showGroups'; Kind='bool' }
@{ Tag='ShowHeaders'; Key='showHeaders'; Kind='bool' }
@{ Tag='ShowRowAndColumnNames'; Key='showRowAndColumnNames'; Kind='bool' }
@{ Tag='ShowCellNames'; Key='showCellNames'; Kind='bool' }
@{ Tag='ShowPercent'; Key='showPercent'; Kind='bool' }
)
# Захват generic-скаляров. Специфичная обработка (если ключ уже задан) — побеждает.
@@ -1350,6 +1371,28 @@ function Decompile-TableAdditions {
return $null
}
# Спец-поля «документ/датчик» — общий скелет поля (имя/path/CommonProps/TitleLocation/editMode).
# Типоспец. enum/bool скаляры ловит пост-switch Add-GenericScalars; layout/companions — общий хвост.
function Decompile-SimpleField {
param($obj, $node, [string]$name, [string]$key)
$obj[$key] = $name
$dp = Get-Child $node 'DataPath'; if ($dp) { $obj['path'] = $dp }
Add-CommonProps $obj $node $name
$tl = Get-Child $node 'TitleLocation'; if ($tl) { $obj['titleLocation'] = $tl.ToLower() }
$em = Get-Child $node 'EditMode'; if ($em) { $obj['editMode'] = $em }
}
# Числовые скаляры датчиков (ProgressBar/TrackBar) — без xsi:type (≠ типизированных InputField).
function Add-GaugeScalars {
param($obj, $node, $tags)
foreach ($p in $tags) {
$v = Get-Child $node $p
if ($null -eq $v) { continue }
$key = $p.Substring(0,1).ToLower() + $p.Substring(1)
if ($v -match '^-?\d+$') { $obj[$key] = [int]$v } else { $obj[$key] = $v }
}
}
function Decompile-Element {
param($node)
$tag = $node.LocalName
@@ -1521,7 +1564,7 @@ function Decompile-Element {
$crs = Get-Child $node 'ChangeRowSet'; if ($null -ne $crs) { $obj['changeRowSet'] = ($crs -eq 'true') }
$cro = Get-Child $node 'ChangeRowOrder'; if ($null -ne $cro) { $obj['changeRowOrder'] = ($cro -eq 'true') }
if ((Get-Child $node 'AutoInsertNewRow') -eq 'true') { $obj['autoInsertNewRow'] = $true }
if ((Get-Child $node 'EnableDrag') -eq 'true') { $obj['enableDrag'] = $true }
# enableDrag — теперь общий (Add-Layout, фактическое значение)
if ($node.SelectSingleNode("lf:RowFilter", $ns)) { $obj['rowFilter'] = $null }
if ((Get-Child $node 'Header') -eq 'false') { $obj['header'] = $false }
if ((Get-Child $node 'Footer') -eq 'true') { $obj['footer'] = $true }
@@ -1653,6 +1696,12 @@ function Decompile-Element {
'SearchStringAddition' { $obj[$key] = $name; Add-AdditionCore $obj $node $name }
'ViewStatusAddition' { $obj[$key] = $name; Add-AdditionCore $obj $node $name }
'SearchControlAddition' { $obj[$key] = $name; Add-AdditionCore $obj $node $name }
'SpreadSheetDocumentField' { Decompile-SimpleField $obj $node $name $key }
'HTMLDocumentField' { Decompile-SimpleField $obj $node $name $key }
'TextDocumentField' { Decompile-SimpleField $obj $node $name $key }
'FormattedDocumentField' { Decompile-SimpleField $obj $node $name $key }
'ProgressBarField' { Decompile-SimpleField $obj $node $name $key; Add-GaugeScalars $obj $node @('MinValue','MaxValue') }
'TrackBarField' { Decompile-SimpleField $obj $node $name $key; Add-GaugeScalars $obj $node @('MinValue','MaxValue','LargeStep','MarkingStep','Step') }
}
# DisplayImportance — атрибут открывающего тега (адаптивная важность отображения), захват «как есть».
$di = $node.GetAttribute("DisplayImportance"); if ($di) { $obj['displayImportance'] = $di }
@@ -1709,7 +1758,7 @@ $titleNode = $root.SelectSingleNode("lf:Title", $ns)
if ($titleNode) { $t = Get-LangText $titleNode; if ($null -ne $t) { $dsl['title'] = $t } }
# properties (прямые скаляры под <Form>, PascalCase → camelCase)
$KNOWN_FORM_PROPS = @('AutoTitle','WindowOpeningMode','CommandBarLocation','SaveDataInSettings','AutoSaveDataInSettings','AutoTime','UsePostingMode','RepostOnWrite','AutoURL','AutoFillCheck','Customizable','EnterKeyBehavior','VerticalScroll','Width','Height','Group','UseForFoldersAndItems','SaveWindowSettings')
$KNOWN_FORM_PROPS = @('AutoTitle','WindowOpeningMode','CommandBarLocation','SaveDataInSettings','AutoSaveDataInSettings','AutoTime','UsePostingMode','RepostOnWrite','AutoURL','AutoFillCheck','Customizable','EnterKeyBehavior','VerticalScroll','Width','Height','Group','UseForFoldersAndItems','SaveWindowSettings','ScalingMode','VerticalSpacing')
$props = [ordered]@{}
foreach ($pn in $KNOWN_FORM_PROPS) {
$v = Get-Child $root $pn
+38
View File
@@ -735,6 +735,29 @@ Pages поддерживает `pagesRepresentation`: `None`, `TabsOnTop`, `Tabs
| `representation` | string | `Auto`, `Picture`, `Text`, `PictureAndText` |
| `children` | array | Кнопки (`button`) внутри группы |
#### Спец-поля «документ/датчик»
Поля для отображения специальных данных. Структурно — обычные поля (скелет `path`/`title`/`titleLocation`/
flags/layout/оформление/companions/события общий), плюс собственные скаляры. Привязываются к реквизиту
соответствующего платформенного типа (см. §8 «Платформенные типы»).
| Ключ типа | XML-элемент | Тип реквизита | Спец. скаляры |
|-----------|-------------|---------------|----------------|
| `spreadsheet` | SpreadSheetDocumentField | `mxl:SpreadsheetDocument` | `output` (Disable/Enable), `protection`, `verticalScrollBar`/`horizontalScrollBar`, `viewScalingMode`, `selectionShowMode`, `pointerType`, `showGrid`/`showGroups`/`showHeaders`/`showRowAndColumnNames`/`showCellNames`, `edit`, `enableDrag`/`enableStartDrag` (фактическое значение) |
| `html` | HTMLDocumentField | `string` | `output`, `warningOnEditRepresentation` |
| `textDoc` | TextDocumentField | `d5p1:TextDocument` | `editMode` |
| `formattedDoc` | FormattedDocumentField | `fd:FormattedDocument` | `editMode` |
| `progressBar` | ProgressBarField | число | `showPercent`, `minValue`/`maxValue` (без `xsi:type`, ≠ типизированных у `input`) |
| `trackBar` | TrackBarField | число | `minValue`/`maxValue`/`largeStep`/`markingStep`/`step` (числовые), `markingAppearance` |
```json
{ "spreadsheet": "ТаблицаОтчета", "path": "ТаблицаОтчета", "titleLocation": "none", "readOnly": true, "output": "Disable", "protection": true }
{ "trackBar": "Масштаб", "path": "Масштаб", "minValue": 20, "maxValue": 400, "markingStep": 20 }
```
Forgiving-синонимы типа: XML-имя (`SpreadSheetDocumentField`) и рус. (`ПолеТабличногоДокумента`, `ПолеИндикатора`, …).
Скаляры `output`/`protection`/… — generic pass-through; bool как `true`/`false`, enum verbatim.
#### autoCmdBar — командная панель формы
Командная панель самой формы (`<AutoCommandBar id="-1">`). Задаётся как элемент в `elements`; компилятор автоматически вынимает его из дерева. Нужен только если в панель помещаются **явные** кнопки/группы или меняется выравнивание/автозаполнение — иначе панель формируется автоматически.
@@ -950,6 +973,21 @@ Pages поддерживает `pagesRepresentation`: `None`, `TabsOnTop`, `Tabs
> Платформенные `v8:`-типы можно писать без префикса или по-русски — компилятор приводит к каноничному `v8:X`. Уже-префиксованную форму (`v8:StandardPeriod`) принимает как есть.
**Спец-типы с собственным namespace** (для спец-полей). Хранятся verbatim с префиксом; компилятор объявляет
namespace **локально** на `<v8:Type>`. Префикс `d5p1` неоднозначен (несколько URI) — резолв по полному значению типа.
| DSL | XML (с локальным xmlns) |
|-----|-----|
| `"mxl:SpreadsheetDocument"` | `<v8:Type xmlns:mxl="http://v8.1c.ru/8.2/data/spreadsheet">mxl:SpreadsheetDocument</v8:Type>` |
| `"fd:FormattedDocument"` | `xmlns:fd="…/formatted-document"` |
| `"d5p1:TextDocument"` | `xmlns:d5p1="…/txtedt"` |
| `"d5p1:Chart"` / `"d5p1:GanttChart"` | `xmlns:d5p1="…/chart"` |
| `"d5p1:FlowchartContextType"` | `xmlns:d5p1="…/graphscheme"` |
| `"d5p1:GeographicalSchema"` | `xmlns:d5p1="…/geo"` |
| `"d5p1:DataAnalysisTimeIntervalUnitType"` | `xmlns:d5p1="…/data-analysis"` |
| `"pdfdoc:PDFDocument"` | `xmlns:pdfdoc="…/pdf"` |
| `"pl:Planner"` | `xmlns:pl="…/planner"` |
### Наборы типов (TypeSet → `<v8:TypeSet>`)
«Набор типов» вместо конкретного типа. Развязка с обычным типом — по наличию `.Имя`:
@@ -0,0 +1,252 @@
<?xml version="1.0" encoding="utf-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.17">
<Configuration uuid="UUID-001">
<InternalInfo>
<xr:ContainedObject>
<xr:ClassId>UUID-002</xr:ClassId>
<xr:ObjectId>UUID-003</xr:ObjectId>
</xr:ContainedObject>
<xr:ContainedObject>
<xr:ClassId>UUID-004</xr:ClassId>
<xr:ObjectId>UUID-005</xr:ObjectId>
</xr:ContainedObject>
<xr:ContainedObject>
<xr:ClassId>UUID-006</xr:ClassId>
<xr:ObjectId>UUID-007</xr:ObjectId>
</xr:ContainedObject>
<xr:ContainedObject>
<xr:ClassId>UUID-008</xr:ClassId>
<xr:ObjectId>UUID-009</xr:ObjectId>
</xr:ContainedObject>
<xr:ContainedObject>
<xr:ClassId>UUID-010</xr:ClassId>
<xr:ObjectId>UUID-011</xr:ObjectId>
</xr:ContainedObject>
<xr:ContainedObject>
<xr:ClassId>UUID-012</xr:ClassId>
<xr:ObjectId>UUID-013</xr:ObjectId>
</xr:ContainedObject>
<xr:ContainedObject>
<xr:ClassId>UUID-014</xr:ClassId>
<xr:ObjectId>UUID-015</xr:ObjectId>
</xr:ContainedObject>
</InternalInfo>
<Properties>
<Name>TestConfig</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>TestConfig</v8:content>
</v8:item>
</Synonym>
<Comment />
<NamePrefix />
<ConfigurationExtensionCompatibilityMode>Version8_3_24</ConfigurationExtensionCompatibilityMode>
<DefaultRunMode>ManagedApplication</DefaultRunMode>
<UsePurposes>
<v8:Value xsi:type="app:ApplicationUsePurpose">PlatformApplication</v8:Value>
</UsePurposes>
<ScriptVariant>Russian</ScriptVariant>
<DefaultRoles />
<Vendor></Vendor>
<Version></Version>
<UpdateCatalogAddress />
<IncludeHelpInContents>false</IncludeHelpInContents>
<UseManagedFormInOrdinaryApplication>false</UseManagedFormInOrdinaryApplication>
<UseOrdinaryFormInManagedApplication>false</UseOrdinaryFormInManagedApplication>
<AdditionalFullTextSearchDictionaries />
<CommonSettingsStorage />
<ReportsUserSettingsStorage />
<ReportsVariantsStorage />
<FormDataSettingsStorage />
<DynamicListsUserSettingsStorage />
<URLExternalDataStorage />
<Content />
<DefaultReportForm />
<DefaultReportVariantForm />
<DefaultReportSettingsForm />
<DefaultReportAppearanceTemplate />
<DefaultDynamicListSettingsForm />
<DefaultSearchForm />
<DefaultDataHistoryChangeHistoryForm />
<DefaultDataHistoryVersionDataForm />
<DefaultDataHistoryVersionDifferencesForm />
<DefaultCollaborationSystemUsersChoiceForm />
<RequiredMobileApplicationPermissions />
<UsedMobileApplicationFunctionalities>
<app:functionality>
<app:functionality>Biometrics</app:functionality>
<app:use>true</app:use>
</app:functionality>
<app:functionality>
<app:functionality>Location</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>BackgroundLocation</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>BluetoothPrinters</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>WiFiPrinters</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>Contacts</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>Calendars</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>PushNotifications</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>LocalNotifications</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>InAppPurchases</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>PersonalComputerFileExchange</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>Ads</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>NumberDialing</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>CallProcessing</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>CallLog</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>AutoSendSMS</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>ReceiveSMS</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>SMSLog</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>Camera</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>Microphone</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>MusicLibrary</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>PictureAndVideoLibraries</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>AudioPlaybackAndVibration</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>BackgroundAudioPlaybackAndVibration</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>InstallPackages</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>OSBackup</app:functionality>
<app:use>true</app:use>
</app:functionality>
<app:functionality>
<app:functionality>ApplicationUsageStatistics</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>BarcodeScanning</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>BackgroundAudioRecording</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>AllFilesAccess</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>Videoconferences</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>NFC</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>DocumentScanning</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>SpeechToText</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>Geofences</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>IncomingShareRequests</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality>
<app:use>false</app:use>
</app:functionality>
</UsedMobileApplicationFunctionalities>
<StandaloneConfigurationRestrictionRoles />
<MobileApplicationURLs />
<AllowedIncomingShareRequestTypes />
<MainClientApplicationWindowMode>Normal</MainClientApplicationWindowMode>
<DefaultInterface />
<DefaultStyle />
<DefaultLanguage>Language.Русский</DefaultLanguage>
<BriefInformation />
<DetailedInformation />
<Copyright />
<VendorInformationAddress />
<ConfigurationInformationAddress />
<DataLockControlMode>Managed</DataLockControlMode>
<ObjectAutonumerationMode>NotAutoFree</ObjectAutonumerationMode>
<ModalityUseMode>DontUse</ModalityUseMode>
<SynchronousPlatformExtensionAndAddInCallUseMode>DontUse</SynchronousPlatformExtensionAndAddInCallUseMode>
<InterfaceCompatibilityMode>TaxiEnableVersion8_2</InterfaceCompatibilityMode>
<DatabaseTablespacesUseMode>DontUse</DatabaseTablespacesUseMode>
<CompatibilityMode>Version8_3_24</CompatibilityMode>
<DefaultConstantsForm />
</Properties>
<ChildObjects>
<Language>Русский</Language>
<DataProcessor>СпецПоля</DataProcessor>
</ChildObjects>
</Configuration>
</MetaDataObject>
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.17">
<DataProcessor uuid="UUID-001">
<InternalInfo>
<xr:GeneratedType name="DataProcessorObject.СпецПоля" category="Object">
<xr:TypeId>UUID-002</xr:TypeId>
<xr:ValueId>UUID-003</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="DataProcessorManager.СпецПоля" category="Manager">
<xr:TypeId>UUID-004</xr:TypeId>
<xr:ValueId>UUID-005</xr:ValueId>
</xr:GeneratedType>
</InternalInfo>
<Properties>
<Name>СпецПоля</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Спец поля</v8:content>
</v8:item>
</Synonym>
<Comment />
<UseStandardCommands>false</UseStandardCommands>
<DefaultForm>DataProcessor.СпецПоля.Form.Форма</DefaultForm>
<AuxiliaryForm />
<IncludeHelpInContents>false</IncludeHelpInContents>
<ExtendedPresentation />
<Explanation />
</Properties>
<ChildObjects>
<Form>Форма</Form>
</ChildObjects>
</DataProcessor>
</MetaDataObject>
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.17">
<Form uuid="UUID-001">
<Properties>
<Name>Форма</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Форма</v8:content>
</v8:item>
</Synonym>
<Comment/>
<FormType>Managed</FormType>
<IncludeHelpInContents>false</IncludeHelpInContents>
<UsePurposes>
<v8:Value xsi:type="app:ApplicationUsePurpose">PlatformApplication</v8:Value>
<v8:Value xsi:type="app:ApplicationUsePurpose">MobilePlatformApplication</v8:Value>
</UsePurposes>
<ExtendedPresentation/>
</Properties>
</Form>
</MetaDataObject>
@@ -0,0 +1,164 @@
<?xml version="1.0" encoding="UTF-8"?>
<Form xmlns="http://v8.1c.ru/8.3/xcf/logform" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:dcscor="http://v8.1c.ru/8.1/data-composition-system/core" xmlns:dcssch="http://v8.1c.ru/8.1/data-composition-system/schema" xmlns:dcsset="http://v8.1c.ru/8.1/data-composition-system/settings" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.17">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Спец-поля</v8:content>
</v8:item>
</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<ChildItems>
<SpreadSheetDocumentField name="ТаблицаОтчета" id="1">
<DataPath>ТаблицаОтчета</DataPath>
<ReadOnly>true</ReadOnly>
<TitleLocation>None</TitleLocation>
<EnableStartDrag>false</EnableStartDrag>
<VerticalScrollBar>true</VerticalScrollBar>
<HorizontalScrollBar>true</HorizontalScrollBar>
<ViewScalingMode>Normal</ViewScalingMode>
<Output>Disable</Output>
<Protection>true</Protection>
<ShowGrid>false</ShowGrid>
<ShowHeaders>false</ShowHeaders>
<EnableDrag>false</EnableDrag>
<ContextMenu name="ТаблицаОтчетаКонтекстноеМеню" id="2"/>
<ExtendedTooltip name="ТаблицаОтчетаРасширеннаяПодсказка" id="3"/>
</SpreadSheetDocumentField>
<FormattedDocumentField name="Описание" id="4">
<DataPath>Описание</DataPath>
<ReadOnly>true</ReadOnly>
<TitleLocation>None</TitleLocation>
<EditMode>EnterOnInput</EditMode>
<ContextMenu name="ОписаниеКонтекстноеМеню" id="5"/>
<ExtendedTooltip name="ОписаниеРасширеннаяПодсказка" id="6"/>
</FormattedDocumentField>
<HTMLDocumentField name="Содержимое" id="7">
<DataPath>Содержимое</DataPath>
<TitleLocation>None</TitleLocation>
<Width>37</Width>
<HorizontalStretch>false</HorizontalStretch>
<Output>Enable</Output>
<WarningOnEditRepresentation>DontShow</WarningOnEditRepresentation>
<ContextMenu name="СодержимоеКонтекстноеМеню" id="8"/>
<ExtendedTooltip name="СодержимоеРасширеннаяПодсказка" id="9"/>
</HTMLDocumentField>
<TextDocumentField name="ТекстXML" id="10">
<DataPath>ТекстXML</DataPath>
<ReadOnly>true</ReadOnly>
<TitleLocation>None</TitleLocation>
<Width>56</Width>
<ContextMenu name="ТекстXMLКонтекстноеМеню" id="11"/>
<ExtendedTooltip name="ТекстXMLРасширеннаяПодсказка" id="12"/>
</TextDocumentField>
<ProgressBarField name="Прогресс" id="13">
<DataPath>ПроцентВыполнения</DataPath>
<TitleLocation>None</TitleLocation>
<Width>30</Width>
<ShowPercent>true</ShowPercent>
<MaxValue>10000</MaxValue>
<ContextMenu name="ПрогрессКонтекстноеМеню" id="14"/>
<ExtendedTooltip name="ПрогрессРасширеннаяПодсказка" id="15"/>
</ProgressBarField>
<TrackBarField name="Масштаб" id="16">
<DataPath>Масштаб</DataPath>
<TitleLocation>None</TitleLocation>
<Width>50</Width>
<MarkingAppearance>TopLeft</MarkingAppearance>
<MinValue>20</MinValue>
<MaxValue>400</MaxValue>
<LargeStep>5</LargeStep>
<MarkingStep>20</MarkingStep>
<ContextMenu name="МасштабКонтекстноеМеню" id="17"/>
<ExtendedTooltip name="МасштабРасширеннаяПодсказка" id="18"/>
</TrackBarField>
</ChildItems>
<Attributes>
<Attribute name="Объект" id="19">
<Type>
<v8:Type>cfg:DataProcessorObject.СпецПоля</v8:Type>
</Type>
<MainAttribute>true</MainAttribute>
</Attribute>
<Attribute name="ТаблицаОтчета" id="20">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Таблица отчета</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type xmlns:mxl="http://v8.1c.ru/8.2/data/spreadsheet">mxl:SpreadsheetDocument</v8:Type>
</Type>
</Attribute>
<Attribute name="Описание" id="21">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Описание</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type xmlns:fd="http://v8.1c.ru/8.2/data/formatted-document">fd:FormattedDocument</v8:Type>
</Type>
</Attribute>
<Attribute name="Содержимое" id="22">
<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="ТекстXML" id="23">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Текст XML</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type xmlns:d5p1="http://v8.1c.ru/8.1/data/txtedt">d5p1:TextDocument</v8:Type>
</Type>
</Attribute>
<Attribute name="ПроцентВыполнения" id="24">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Процент выполнения</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:decimal</v8:Type>
<v8:NumberQualifiers>
<v8:Digits>5</v8:Digits>
<v8:FractionDigits>2</v8:FractionDigits>
<v8:AllowedSign>Nonnegative</v8:AllowedSign>
</v8:NumberQualifiers>
</Type>
</Attribute>
<Attribute name="Масштаб" id="25">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Масштаб</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type>xs:decimal</v8:Type>
<v8:NumberQualifiers>
<v8:Digits>10</v8:Digits>
<v8:FractionDigits>0</v8:FractionDigits>
<v8:AllowedSign>Any</v8:AllowedSign>
</v8:NumberQualifiers>
</Type>
</Attribute>
</Attributes>
</Form>
@@ -0,0 +1,19 @@
#Область ОбработчикиСобытийФормы
#КонецОбласти
#Область ОбработчикиСобытийЭлементовФормы
#КонецОбласти
#Область ОбработчикиКомандФормы
#КонецОбласти
#Область ОбработчикиОповещений
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<ClientApplicationInterface xmlns="http://v8.1c.ru/8.2/managed-application/core" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="InterfaceLayouter">
<top>
<panel id="UUID-001">
<uuid>UUID-002</uuid>
</panel>
</top>
<left>
<panel id="UUID-003">
<uuid>UUID-004</uuid>
</panel>
</left>
<panelDef id="UUID-004"/>
<panelDef id="UUID-005"/>
<panelDef id="UUID-006"/>
<panelDef id="UUID-002"/>
<panelDef id="UUID-007"/>
</ClientApplicationInterface>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.17">
<Language uuid="UUID-001">
<Properties>
<Name>Русский</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Русский</v8:content>
</v8:item>
</Synonym>
<Comment/>
<LanguageCode>ru</LanguageCode>
</Properties>
</Language>
</MetaDataObject>
@@ -0,0 +1,36 @@
{
"name": "Форма со спец-полями (документ/датчик)",
"preRun": [
{
"script": "meta-compile/scripts/meta-compile",
"input": { "type": "DataProcessor", "name": "СпецПоля" },
"args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" }
},
{
"script": "form-add/scripts/form-add",
"args": { "-ObjectPath": "{workDir}/DataProcessors/СпецПоля.xml", "-FormName": "Форма" }
}
],
"params": { "outputPath": "DataProcessors/СпецПоля/Forms/Форма/Ext/Form.xml" },
"validatePath": "DataProcessors/СпецПоля/Forms/Форма/Ext/Form.xml",
"input": {
"title": "Спец-поля",
"elements": [
{ "spreadsheet": "ТаблицаОтчета", "path": "ТаблицаОтчета", "titleLocation": "none", "readOnly": true, "verticalScrollBar": "true", "horizontalScrollBar": "true", "viewScalingMode": "Normal", "output": "Disable", "protection": true, "showGrid": false, "showHeaders": false, "enableDrag": false, "enableStartDrag": false },
{ "formattedDoc": "Описание", "path": "Описание", "titleLocation": "none", "readOnly": true, "editMode": "EnterOnInput" },
{ "html": "Содержимое", "path": "Содержимое", "titleLocation": "none", "width": 37, "horizontalStretch": false, "output": "Enable", "warningOnEditRepresentation": "DontShow" },
{ "textDoc": "ТекстXML", "path": "ТекстXML", "titleLocation": "none", "readOnly": true, "width": 56 },
{ "progressBar": "Прогресс", "path": "ПроцентВыполнения", "titleLocation": "none", "showPercent": true, "maxValue": 10000, "width": 30 },
{ "trackBar": "Масштаб", "path": "Масштаб", "titleLocation": "none", "minValue": 20, "maxValue": 400, "largeStep": 5, "markingStep": 20, "markingAppearance": "TopLeft", "width": 50 }
],
"attributes": [
{ "name": "Объект", "type": "DataProcessorObject.СпецПоля", "main": true },
{ "name": "ТаблицаОтчета", "type": "mxl:SpreadsheetDocument" },
{ "name": "Описание", "type": "fd:FormattedDocument" },
{ "name": "Содержимое", "type": "string" },
{ "name": "ТекстXML", "type": "d5p1:TextDocument" },
{ "name": "ПроцентВыполнения", "type": "decimal(5,2,nonneg)" },
{ "name": "Масштаб", "type": "decimal(10,0)" }
]
}
}