mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-08-17 00:30:23 +03:00
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:
co-authored by
Claude Opus 4.6
parent
fdfe4ac2f4
commit
46e065adb9
@@ -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.
|
||||
|
||||
@@ -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 ---
|
||||
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user