feat(skd-edit): add-drilldown operation for connecting DrillDown to DCS template resources

Adds DetailsAreaTemplateParameter + Расшифровка appearance binding
to all named templates for each specified resource. Comma-separated
value list, idempotent, nesting-aware template scan.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-04-08 20:36:50 +03:00
co-authored by Claude Opus 4.6
parent fdfe4ac2f4
commit 46e065adb9
6 changed files with 547 additions and 4 deletions
+11
View File
@@ -193,6 +193,17 @@ OrGroup: несколько условий через ` or ` в `when` объе
**Важно**: для параметров данных используйте префикс `ПараметрыДанных.` в поле фильтра.
### add-drilldown — подключить расшифровку к ресурсам в шаблонах
Value — имена ресурсов (как в полях/вычисляемых полях СКД) через запятую.
```
"ПоступлениеИзПроизводства, ВыбытиеПрочее"
"Сумма_Дт83, Сумма_Дт99, Сумма_68, Сумма_84"
```
Подключает DrillDown по `ИмяРесурса` ко всем шаблонам, содержащим указанные ресурсы. Идемпотентно.
### set-query — заменить текст запроса
Не поддерживает пакетный режим. Value — полный текст запроса или `@path/to/file.sql` (ссылка на внешний файл). Путь разрешается относительно Template.xml, затем CWD.
+157 -2
View File
@@ -1,4 +1,4 @@
# skd-edit v1.7 — Atomic 1C DCS editor
# skd-edit v1.8 — Atomic 1C DCS editor
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -8,7 +8,7 @@ param(
[ValidateSet(
"add-field","add-total","add-calculated-field","add-parameter","add-filter",
"add-dataParameter","add-order","add-selection","add-dataSetLink",
"add-dataSet","add-variant","add-conditionalAppearance",
"add-dataSet","add-variant","add-conditionalAppearance","add-drilldown",
"set-query","patch-query","set-outputParameter","set-structure",
"modify-field","modify-filter","modify-dataParameter","modify-parameter",
"clear-selection","clear-order","clear-filter",
@@ -1526,6 +1526,12 @@ if ($Operation -eq "set-query" -or $Operation -eq "set-structure" -or $Operation
$values = @($Value)
} elseif ($Operation -eq "patch-query") {
$values = @($Value -split ';;' | Where-Object { $_.Trim() })
} elseif ($Operation -eq "add-drilldown") {
if ($Value.Contains(';;')) {
$values = @($Value -split ';;' | ForEach-Object { $_.Trim() } | Where-Object { $_ })
} else {
$values = @($Value -split ',' | ForEach-Object { $_.Trim() } | Where-Object { $_ })
}
} else {
$values = @($Value -split ';;' | ForEach-Object { $_.Trim() } | Where-Object { $_ })
}
@@ -2538,6 +2544,155 @@ switch ($Operation) {
Write-Host "[OK] Filter for `"$fieldName`" removed from variant `"$varName`""
}
}
"add-drilldown" {
# String-based manipulation — templates use dcsat namespace with inline xmlns
$rawText = [System.IO.File]::ReadAllText($resolvedPath, [System.Text.Encoding]::UTF8)
$nl = "`r`n"
$dcsatNsDecl = 'xmlns:dcsat="http://v8.1c.ru/8.1/data-composition-system/area-template"'
# Find all outer <template> blocks by nesting-aware scan
$tplStarts = [System.Collections.ArrayList]::new()
$nameRegex = [regex]'<template>\s*<name>([^<]+)</name>'
foreach ($m in $nameRegex.Matches($rawText)) {
[void]$tplStarts.Add(@{ pos = $m.Index; name = $m.Groups[1].Value })
}
# For each start, find closing </template> at nesting depth 0
$tplBlocks = [System.Collections.ArrayList]::new()
foreach ($ts in $tplStarts) {
$depth = 1
$scanPos = $ts.pos + 10 # skip past opening <template>
while ($depth -gt 0 -and $scanPos -lt $rawText.Length) {
$nextOpen = $rawText.IndexOf("<template", $scanPos)
$nextClose = $rawText.IndexOf("</template>", $scanPos)
if ($nextClose -lt 0) { break }
if ($nextOpen -ge 0 -and $nextOpen -lt $nextClose) {
$depth++
$scanPos = $nextOpen + 10
} else {
$depth--
if ($depth -eq 0) {
$endPos = $nextClose + "</template>".Length
[void]$tplBlocks.Add(@{ name = $ts.name; start = $ts.pos; text = $rawText.Substring($ts.pos, $endPos - $ts.pos) })
}
$scanPos = $nextClose + 11
}
}
}
if ($tplBlocks.Count -eq 0) {
Write-Host "[WARN] No named templates found in schema"
}
# Collect all insertions as (position, text) — apply in reverse order
$insertions = [System.Collections.ArrayList]::new()
foreach ($tplBlock in $tplBlocks) {
$tplName = $tplBlock.name
$tplText = $tplBlock.text
$tplStart = $tplBlock.start
# Build map: expression → paramName from ExpressionAreaTemplateParameter
$exprMap = @{}
$exprRegex = [regex]'(?s)<parameter[^>]*ExpressionAreaTemplateParameter[^>]*>\s*<dcsat:name>([^<]+)</dcsat:name>\s*<dcsat:expression>([^<]+)</dcsat:expression>\s*</parameter>'
foreach ($em in $exprRegex.Matches($tplText)) {
$pName = $em.Groups[1].Value
$pExpr = $em.Groups[2].Value
$exprMap[$pExpr] = $pName
}
foreach ($resource in $values) {
$drillName = "Расшифровка_$resource"
# Idempotency: check if already exists
if ($tplText.Contains($drillName)) {
Write-Host "[INFO] $drillName already exists in $tplName — skipped"
continue
}
# Find ExpressionAreaTemplateParameter by expression
$paramName = $null
if ($exprMap.ContainsKey($resource)) {
$paramName = $exprMap[$resource]
} else {
Write-Host "[WARN] Expression `"$resource`" not found in template $tplName — skipped"
continue
}
$cellCount = 0
# Step 1: Insert DetailsAreaTemplateParameter after last </parameter> in template
$lastParamEndTag = "</parameter>"
$lastParamPos = $tplText.LastIndexOf($lastParamEndTag)
if ($lastParamPos -ge 0) {
$insertPos = $tplStart + $lastParamPos + $lastParamEndTag.Length
# Detect indent from context
$prevNewline = $tplText.LastIndexOf("`n", $lastParamPos)
$indent = "`t`t"
if ($prevNewline -ge 0) {
$lineStart = $prevNewline + 1
$indentMatch = [regex]::Match($tplText.Substring($lineStart), '^(\s*)')
if ($indentMatch.Success) { $indent = $indentMatch.Groups[1].Value }
}
$detailsXml = "$nl$indent<parameter $dcsatNsDecl xsi:type=`"dcsat:DetailsAreaTemplateParameter`">" +
"$nl$indent`t<dcsat:name>$drillName</dcsat:name>" +
"$nl$indent`t<dcsat:fieldExpression>" +
"$nl$indent`t`t<dcsat:field>ИмяРесурса</dcsat:field>" +
"$nl$indent`t`t<dcsat:expression>`"$resource`"</dcsat:expression>" +
"$nl$indent`t</dcsat:fieldExpression>" +
"$nl$indent`t<dcsat:mainAction>DrillDown</dcsat:mainAction>" +
"$nl$indent</parameter>"
[void]$insertions.Add(@{ pos = $insertPos; text = $detailsXml })
}
# Step 2: Insert appearance binding in cells referencing this parameter
$cellTag = '<dcsat:value xsi:type="dcscor:Parameter">' + $paramName + '</dcsat:value>'
$searchStart = 0
while (($cellIdx = $tplText.IndexOf($cellTag, $searchStart)) -ge 0) {
$cellEnd = $tplText.IndexOf("</dcsat:tableCell>", $cellIdx)
if ($cellEnd -lt 0) { break }
$appEnd = $tplText.LastIndexOf("</dcsat:appearance>", $cellEnd)
if ($appEnd -lt $cellIdx) { $searchStart = $cellEnd + 1; continue }
# Detect indent for appearance items — insert after \n, before indent of </dcsat:appearance>
$appPrevNl = $tplText.LastIndexOf("`n", $appEnd)
$appIndent = "`t`t`t`t`t`t"
if ($appPrevNl -ge 0) {
$appLineStart = $appPrevNl + 1
$appIndentMatch = [regex]::Match($tplText.Substring($appLineStart), '^(\s*)')
if ($appIndentMatch.Success) { $appIndent = $appIndentMatch.Groups[1].Value }
}
$itemIndent = $appIndent + "`t"
$appearanceXml = "$itemIndent<dcscor:item>$nl" +
"$itemIndent`t<dcscor:parameter>Расшифровка</dcscor:parameter>$nl" +
"$itemIndent`t<dcscor:value xsi:type=`"dcscor:Parameter`">$drillName</dcscor:value>$nl" +
"$itemIndent</dcscor:item>$nl"
# Insert after \n (before indent of closing tag), not before the tag itself
$insertAt = if ($appPrevNl -ge 0) { $tplStart + $appPrevNl + 1 } else { $tplStart + $appEnd }
[void]$insertions.Add(@{ pos = $insertAt; text = $appearanceXml })
$cellCount++
$searchStart = $cellEnd + 1
}
Write-Host "[OK] $drillName$tplName (param + $cellCount cell(s))"
}
}
# Apply insertions in reverse order to preserve offsets.
# For same position: reverse insertion order so first resource ends up first in file.
$idx = 0; foreach ($ins in $insertions) { $ins.seq = $idx; $idx++ }
$sorted = $insertions | Sort-Object { $_.pos }, { $_.seq } -Descending
foreach ($ins in $sorted) {
$rawText = $rawText.Insert($ins.pos, $ins.text)
}
# Write directly — skip DOM save
$enc = New-Object System.Text.UTF8Encoding($true)
[System.IO.File]::WriteAllText($resolvedPath, $rawText, $enc)
Write-Host "[OK] Saved $resolvedPath"
exit 0
}
}
# --- 9. Save ---
+152 -2
View File
@@ -1,4 +1,4 @@
# skd-edit v1.7 — Atomic 1C DCS editor (Python port)
# skd-edit v1.8 — Atomic 1C DCS editor (Python port)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import os
@@ -16,7 +16,7 @@ sys.stderr.reconfigure(encoding="utf-8")
VALID_OPS = [
"add-field", "add-total", "add-calculated-field", "add-parameter", "add-filter",
"add-dataParameter", "add-order", "add-selection", "add-dataSetLink",
"add-dataSet", "add-variant", "add-conditionalAppearance",
"add-dataSet", "add-variant", "add-conditionalAppearance", "add-drilldown",
"set-query", "patch-query", "set-outputParameter", "set-structure",
"modify-field", "modify-filter", "modify-dataParameter", "modify-parameter",
"clear-selection", "clear-order", "clear-filter",
@@ -1319,6 +1319,11 @@ if operation in ("set-query", "set-structure", "add-dataSet"):
values = [value_arg]
elif operation == "patch-query":
values = [v for v in value_arg.split(";;") if v.strip()]
elif operation == "add-drilldown":
if ";;" in value_arg:
values = [v.strip() for v in value_arg.split(";;") if v.strip()]
else:
values = [v.strip() for v in value_arg.split(",") if v.strip()]
else:
values = [v.strip() for v in value_arg.split(";;") if v.strip()]
@@ -2108,6 +2113,151 @@ elif operation == "remove-filter":
remove_node_with_whitespace(filter_item)
print(f'[OK] Filter for "{field_name}" removed from variant "{var_name}"')
elif operation == "add-drilldown":
# String-based manipulation — templates use dcsat namespace with inline xmlns
with open(resolved_path, "r", encoding="utf-8-sig") as f:
raw_text = f.read()
nl = "\r\n"
dcsat_ns_decl = 'xmlns:dcsat="http://v8.1c.ru/8.1/data-composition-system/area-template"'
# Find all outer <template> blocks by nesting-aware scan
name_regex = re.compile(r'<template>\s*<name>([^<]+)</name>')
tpl_starts = [(m.start(), m.group(1)) for m in name_regex.finditer(raw_text)]
# For each start, find closing </template> at nesting depth 0
tpl_blocks = []
for ts_pos, ts_name in tpl_starts:
depth = 1
scan_pos = ts_pos + 10 # skip past opening <template>
while depth > 0 and scan_pos < len(raw_text):
next_open = raw_text.find("<template", scan_pos)
next_close = raw_text.find("</template>", scan_pos)
if next_close < 0:
break
if next_open >= 0 and next_open < next_close:
depth += 1
scan_pos = next_open + 10
else:
depth -= 1
if depth == 0:
end_pos = next_close + len("</template>")
tpl_blocks.append((ts_name, ts_pos, raw_text[ts_pos:end_pos]))
scan_pos = next_close + 11
if not tpl_blocks:
print("[WARN] No named templates found in schema")
# Collect all insertions as (position, text) — apply in reverse order
insertions = []
expr_regex = re.compile(
r'(?s)<parameter[^>]*ExpressionAreaTemplateParameter[^>]*>\s*'
r'<dcsat:name>([^<]+)</dcsat:name>\s*'
r'<dcsat:expression>([^<]+)</dcsat:expression>\s*</parameter>'
)
for tpl_name, tpl_start, tpl_text in tpl_blocks:
# Build map: expression → paramName from ExpressionAreaTemplateParameter
expr_map = {}
for em in expr_regex.finditer(tpl_text):
p_name = em.group(1)
p_expr = em.group(2)
expr_map[p_expr] = p_name
for resource in values:
drill_name = f"Расшифровка_{resource}"
# Idempotency: check if already exists
if drill_name in tpl_text:
print(f"[INFO] {drill_name} already exists in {tpl_name} — skipped")
continue
# Find ExpressionAreaTemplateParameter by expression
param_name = expr_map.get(resource)
if param_name is None:
print(f'[WARN] Expression "{resource}" not found in template {tpl_name} — skipped')
continue
cell_count = 0
# Step 1: Insert DetailsAreaTemplateParameter after last </parameter> in template
last_param_end_tag = "</parameter>"
last_param_pos = tpl_text.rfind(last_param_end_tag)
if last_param_pos >= 0:
insert_pos = tpl_start + last_param_pos + len(last_param_end_tag)
# Detect indent from context
prev_nl = tpl_text.rfind("\n", 0, last_param_pos)
indent = "\t\t"
if prev_nl >= 0:
line_start = prev_nl + 1
indent_match = re.match(r'^(\s*)', tpl_text[line_start:])
if indent_match:
indent = indent_match.group(1)
details_xml = (
f'{nl}{indent}<parameter {dcsat_ns_decl} xsi:type="dcsat:DetailsAreaTemplateParameter">'
f'{nl}{indent}\t<dcsat:name>{drill_name}</dcsat:name>'
f'{nl}{indent}\t<dcsat:fieldExpression>'
f'{nl}{indent}\t\t<dcsat:field>ИмяРесурса</dcsat:field>'
f'{nl}{indent}\t\t<dcsat:expression>"{resource}"</dcsat:expression>'
f'{nl}{indent}\t</dcsat:fieldExpression>'
f'{nl}{indent}\t<dcsat:mainAction>DrillDown</dcsat:mainAction>'
f'{nl}{indent}</parameter>'
)
insertions.append((insert_pos, details_xml))
# Step 2: Insert appearance binding in cells referencing this parameter
cell_tag = f'<dcsat:value xsi:type="dcscor:Parameter">{param_name}</dcsat:value>'
search_start = 0
while True:
cell_idx = tpl_text.find(cell_tag, search_start)
if cell_idx < 0:
break
cell_end = tpl_text.find("</dcsat:tableCell>", cell_idx)
if cell_end < 0:
break
app_end = tpl_text.rfind("</dcsat:appearance>", cell_idx, cell_end)
if app_end < cell_idx:
search_start = cell_end + 1
continue
# Detect indent for appearance items — insert after \n, before indent of </dcsat:appearance>
app_prev_nl = tpl_text.rfind("\n", 0, app_end)
app_indent = "\t\t\t\t\t\t"
if app_prev_nl >= 0:
app_line_start = app_prev_nl + 1
app_indent_match = re.match(r'^(\s*)', tpl_text[app_line_start:])
if app_indent_match:
app_indent = app_indent_match.group(1)
item_indent = app_indent + "\t"
appearance_xml = (
f'{item_indent}<dcscor:item>{nl}'
f'{item_indent}\t<dcscor:parameter>Расшифровка</dcscor:parameter>{nl}'
f'{item_indent}\t<dcscor:value xsi:type="dcscor:Parameter">{drill_name}</dcscor:value>{nl}'
f'{item_indent}</dcscor:item>{nl}'
)
# Insert after \n (before indent of closing tag), not before the tag itself
insert_at = (tpl_start + app_prev_nl + 1) if app_prev_nl >= 0 else (tpl_start + app_end)
insertions.append((insert_at, appearance_xml))
cell_count += 1
search_start = cell_end + 1
print(f"[OK] {drill_name} \u2192 {tpl_name} (param + {cell_count} cell(s))")
# Apply insertions in reverse order to preserve offsets.
# For same position: reverse insertion order so first resource ends up first in file.
insertions = [(pos, text, seq) for seq, (pos, text) in enumerate(insertions)]
insertions.sort(key=lambda x: (x[0], x[2]), reverse=True)
for pos, text, _seq in insertions:
raw_text = raw_text[:pos] + text + raw_text[pos:]
# Write directly — skip lxml save
with open(resolved_path, "wb") as f:
f.write(b'\xef\xbb\xbf')
f.write(raw_text.encode("utf-8"))
print(f"[OK] Saved {resolved_path}")
sys.exit(0)
# ── 9. Save ─────────────────────────────────────────────────
xml_bytes = etree.tostring(tree, xml_declaration=True, encoding="UTF-8")
@@ -0,0 +1,9 @@
{
"name": "Добавление расшифровки ресурсов в шаблоны",
"setup": "fixture:drilldown-base",
"params": {
"templatePath": "Template.xml",
"operation": "add-drilldown",
"value": "Ресурс1, Ресурс2"
}
}
@@ -0,0 +1,97 @@
<?xml version="1.0" encoding="utf-8"?>
<dataCompositionSchema xmlns="http://v8.1c.ru/8.1/data-composition-system/schema" xmlns:dcsset="http://v8.1c.ru/8.1/data-composition-system/settings" xmlns:dcscor="http://v8.1c.ru/8.1/data-composition-system/core" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<dataSource>
<name>Источник</name>
<dataSourceType>Local</dataSourceType>
</dataSource>
<dataSet xsi:type="DataSetQuery">
<name>Основной</name>
<field xsi:type="DataSetFieldField">
<dataPath>Ресурс1</dataPath>
<field>Ресурс1</field>
</field>
<field xsi:type="DataSetFieldField">
<dataPath>Ресурс2</dataPath>
<field>Ресурс2</field>
</field>
<field xsi:type="DataSetFieldField">
<dataPath>Счет</dataPath>
<field>Счет</field>
</field>
<dataSource>Источник</dataSource>
<query>ВЫБРАТЬ 1</query>
</dataSet>
<template>
<name>Макет1</name>
<template xmlns:dcsat="http://v8.1c.ru/8.1/data-composition-system/area-template" xsi:type="dcsat:AreaTemplate">
<dcsat:item xsi:type="dcsat:TableRow">
<dcsat:tableCell>
<dcsat:item xsi:type="dcsat:Field">
<dcsat:value xsi:type="v8:LocalStringType">
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Заголовок</v8:content>
</v8:item>
</dcsat:value>
</dcsat:item>
</dcsat:tableCell>
</dcsat:item>
</template>
</template>
<template>
<name>Макет3</name>
<template xmlns:dcsat="http://v8.1c.ru/8.1/data-composition-system/area-template" xsi:type="dcsat:AreaTemplate">
<dcsat:item xsi:type="dcsat:TableRow">
<dcsat:tableCell>
<dcsat:item xsi:type="dcsat:Field">
<dcsat:value xsi:type="dcscor:Parameter">Счет</dcsat:value>
</dcsat:item>
<dcsat:appearance>
<dcscor:item>
<dcscor:parameter>Шрифт</dcscor:parameter>
<dcscor:value xsi:type="v8ui:Font" faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100" />
</dcscor:item>
</dcsat:appearance>
</dcsat:tableCell>
<dcsat:tableCell>
<dcsat:item xsi:type="dcsat:Field">
<dcsat:value xsi:type="dcscor:Parameter">Рес1</dcsat:value>
</dcsat:item>
<dcsat:appearance>
<dcscor:item>
<dcscor:parameter>Шрифт</dcscor:parameter>
<dcscor:value xsi:type="v8ui:Font" faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100" />
</dcscor:item>
</dcsat:appearance>
</dcsat:tableCell>
<dcsat:tableCell>
<dcsat:item xsi:type="dcsat:Field">
<dcsat:value xsi:type="dcscor:Parameter">Рес2</dcsat:value>
</dcsat:item>
<dcsat:appearance>
<dcscor:item>
<dcscor:parameter>Шрифт</dcscor:parameter>
<dcscor:value xsi:type="v8ui:Font" faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100" />
</dcscor:item>
</dcsat:appearance>
</dcsat:tableCell>
</dcsat:item>
</template>
<parameter xmlns:dcsat="http://v8.1c.ru/8.1/data-composition-system/area-template" xsi:type="dcsat:ExpressionAreaTemplateParameter">
<dcsat:name>Счет</dcsat:name>
<dcsat:expression>Представление(Счет)</dcsat:expression>
</parameter>
<parameter xmlns:dcsat="http://v8.1c.ru/8.1/data-composition-system/area-template" xsi:type="dcsat:ExpressionAreaTemplateParameter">
<dcsat:name>Рес1</dcsat:name>
<dcsat:expression>Ресурс1</dcsat:expression>
</parameter>
<parameter xmlns:dcsat="http://v8.1c.ru/8.1/data-composition-system/area-template" xsi:type="dcsat:ExpressionAreaTemplateParameter">
<dcsat:name>Рес2</dcsat:name>
<dcsat:expression>Ресурс2</dcsat:expression>
</parameter>
</template>
<settingsVariant>
<dcsset:name>Основной</dcsset:name>
<dcsset:settings />
</settingsVariant>
</dataCompositionSchema>
@@ -0,0 +1,121 @@
<?xml version="1.0" encoding="utf-8"?>
<dataCompositionSchema xmlns="http://v8.1c.ru/8.1/data-composition-system/schema" xmlns:dcsset="http://v8.1c.ru/8.1/data-composition-system/settings" xmlns:dcscor="http://v8.1c.ru/8.1/data-composition-system/core" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<dataSource>
<name>Источник</name>
<dataSourceType>Local</dataSourceType>
</dataSource>
<dataSet xsi:type="DataSetQuery">
<name>Основной</name>
<field xsi:type="DataSetFieldField">
<dataPath>Ресурс1</dataPath>
<field>Ресурс1</field>
</field>
<field xsi:type="DataSetFieldField">
<dataPath>Ресурс2</dataPath>
<field>Ресурс2</field>
</field>
<field xsi:type="DataSetFieldField">
<dataPath>Счет</dataPath>
<field>Счет</field>
</field>
<dataSource>Источник</dataSource>
<query>ВЫБРАТЬ 1</query>
</dataSet>
<template>
<name>Макет1</name>
<template xmlns:dcsat="http://v8.1c.ru/8.1/data-composition-system/area-template" xsi:type="dcsat:AreaTemplate">
<dcsat:item xsi:type="dcsat:TableRow">
<dcsat:tableCell>
<dcsat:item xsi:type="dcsat:Field">
<dcsat:value xsi:type="v8:LocalStringType">
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Заголовок</v8:content>
</v8:item>
</dcsat:value>
</dcsat:item>
</dcsat:tableCell>
</dcsat:item>
</template>
</template>
<template>
<name>Макет3</name>
<template xmlns:dcsat="http://v8.1c.ru/8.1/data-composition-system/area-template" xsi:type="dcsat:AreaTemplate">
<dcsat:item xsi:type="dcsat:TableRow">
<dcsat:tableCell>
<dcsat:item xsi:type="dcsat:Field">
<dcsat:value xsi:type="dcscor:Parameter">Счет</dcsat:value>
</dcsat:item>
<dcsat:appearance>
<dcscor:item>
<dcscor:parameter>Шрифт</dcscor:parameter>
<dcscor:value xsi:type="v8ui:Font" faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100" />
</dcscor:item>
</dcsat:appearance>
</dcsat:tableCell>
<dcsat:tableCell>
<dcsat:item xsi:type="dcsat:Field">
<dcsat:value xsi:type="dcscor:Parameter">Рес1</dcsat:value>
</dcsat:item>
<dcsat:appearance>
<dcscor:item>
<dcscor:parameter>Шрифт</dcscor:parameter>
<dcscor:value xsi:type="v8ui:Font" faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100" />
</dcscor:item>
<dcscor:item>
<dcscor:parameter>Расшифровка</dcscor:parameter>
<dcscor:value xsi:type="dcscor:Parameter">Расшифровка_Ресурс1</dcscor:value>
</dcscor:item>
</dcsat:appearance>
</dcsat:tableCell>
<dcsat:tableCell>
<dcsat:item xsi:type="dcsat:Field">
<dcsat:value xsi:type="dcscor:Parameter">Рес2</dcsat:value>
</dcsat:item>
<dcsat:appearance>
<dcscor:item>
<dcscor:parameter>Шрифт</dcscor:parameter>
<dcscor:value xsi:type="v8ui:Font" faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100" />
</dcscor:item>
<dcscor:item>
<dcscor:parameter>Расшифровка</dcscor:parameter>
<dcscor:value xsi:type="dcscor:Parameter">Расшифровка_Ресурс2</dcscor:value>
</dcscor:item>
</dcsat:appearance>
</dcsat:tableCell>
</dcsat:item>
</template>
<parameter xmlns:dcsat="http://v8.1c.ru/8.1/data-composition-system/area-template" xsi:type="dcsat:ExpressionAreaTemplateParameter">
<dcsat:name>Счет</dcsat:name>
<dcsat:expression>Представление(Счет)</dcsat:expression>
</parameter>
<parameter xmlns:dcsat="http://v8.1c.ru/8.1/data-composition-system/area-template" xsi:type="dcsat:ExpressionAreaTemplateParameter">
<dcsat:name>Рес1</dcsat:name>
<dcsat:expression>Ресурс1</dcsat:expression>
</parameter>
<parameter xmlns:dcsat="http://v8.1c.ru/8.1/data-composition-system/area-template" xsi:type="dcsat:ExpressionAreaTemplateParameter">
<dcsat:name>Рес2</dcsat:name>
<dcsat:expression>Ресурс2</dcsat:expression>
</parameter>
<parameter xmlns:dcsat="http://v8.1c.ru/8.1/data-composition-system/area-template" xsi:type="dcsat:DetailsAreaTemplateParameter">
<dcsat:name>Расшифровка_Ресурс1</dcsat:name>
<dcsat:fieldExpression>
<dcsat:field>ИмяРесурса</dcsat:field>
<dcsat:expression>"Ресурс1"</dcsat:expression>
</dcsat:fieldExpression>
<dcsat:mainAction>DrillDown</dcsat:mainAction>
</parameter>
<parameter xmlns:dcsat="http://v8.1c.ru/8.1/data-composition-system/area-template" xsi:type="dcsat:DetailsAreaTemplateParameter">
<dcsat:name>Расшифровка_Ресурс2</dcsat:name>
<dcsat:fieldExpression>
<dcsat:field>ИмяРесурса</dcsat:field>
<dcsat:expression>"Ресурс2"</dcsat:expression>
</dcsat:fieldExpression>
<dcsat:mainAction>DrillDown</dcsat:mainAction>
</parameter>
</template>
<settingsVariant>
<dcsset:name>Основной</dcsset:name>
<dcsset:settings />
</settingsVariant>
</dataCompositionSchema>