mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-06-14 18:04:58 +03:00
feat(skd-validate): catch broken XDTO in valueType and value
skd-validate was purely structural (names/refs/duplicates) and missed an
entire class of bugs that XDTO rejects at db-load-xml — exactly the
kinds of mistakes the LLM (or hand-edits) commonly introduce.
New section 16: valueType structural — each <v8:Type> must have a known
prefix (xs:/v8: or any prefix bound to enterprise/current-config),
qualifier blocks must match their preceding type, and qualifier
internals (Digits/FractionDigits/AllowedSign, Length/AllowedLength,
DateFractions) must use legal tokens.
New section 17: value content — <value xsi:type="dcscor:DesignTimeValue">
rejects literal placeholders ('_') and empty strings, since these are
the exact symptom of the titan team's BUG-2.
5 new fixtures cover: bare-decimal, missing-qualifiers,
qualifier/type mismatch, ref-literal '_', bad AllowedSign token.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -10,7 +10,7 @@ allowed-tools:
|
||||
|
||||
# /skd-validate — валидация СКД (DataCompositionSchema)
|
||||
|
||||
Проверяет структурную корректность Template.xml схемы компоновки данных. Выявляет ошибки формата, битые ссылки, дубликаты имён.
|
||||
Проверяет структурную корректность Template.xml схемы компоновки данных. Выявляет ошибки формата, битые ссылки, дубликаты имён, невалидный XDTO в `<valueType>` / `<value>` (отсутствие префикса `xs:`, несовпадение типа и квалификаторов, литералы вроде `_` в `DesignTimeValue`).
|
||||
|
||||
## Параметры
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# skd-validate v1.1 — Validate 1C DCS structure
|
||||
# skd-validate v1.2 — Validate 1C DCS structure
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
param(
|
||||
[Parameter(Mandatory)]
|
||||
@@ -734,6 +734,160 @@ if ($variantNodes.Count -eq 0) {
|
||||
}
|
||||
}
|
||||
|
||||
# --- 16. valueType structural checks ---
|
||||
# Catches broken XDTO that XML/structural checks miss (decimal without xs:,
|
||||
# missing qualifiers, mismatched qualifier blocks, unknown sign/length tokens).
|
||||
|
||||
$validTypeQualifier = @{
|
||||
'xs:decimal' = 'v8:NumberQualifiers'
|
||||
'xs:string' = 'v8:StringQualifiers'
|
||||
'xs:dateTime' = 'v8:DateQualifiers'
|
||||
'xs:boolean' = ''
|
||||
'v8:StandardPeriod' = ''
|
||||
'v8:UUID' = ''
|
||||
}
|
||||
$validSign = @('Any', 'Nonnegative', 'Negative')
|
||||
$validLength = @('Variable', 'Fixed')
|
||||
$validFractions = @('Date', 'DateTime', 'Time')
|
||||
|
||||
$valueTypeNodes = $root.SelectNodes("//s:valueType", $ns)
|
||||
$vtChecked = 0
|
||||
$vtOk = $true
|
||||
foreach ($vt in $valueTypeNodes) {
|
||||
$vtChecked++
|
||||
# Walk children in document order
|
||||
$children = @($vt.ChildNodes | Where-Object { $_.NodeType -eq 'Element' })
|
||||
$lastType = $null # short form like 'xs:decimal' or '' (ref types resolved to '')
|
||||
|
||||
foreach ($child in $children) {
|
||||
$qName = "$($child.Prefix):$($child.LocalName)"
|
||||
if ($child.LocalName -eq 'Type' -and $child.NamespaceURI -eq 'http://v8.1c.ru/8.1/data/core') {
|
||||
$t = $child.InnerText.Trim()
|
||||
if (-not $t) {
|
||||
Report-Error "valueType: <v8:Type> is empty"
|
||||
$vtOk = $false
|
||||
$lastType = $null
|
||||
continue
|
||||
}
|
||||
# Must have a known prefix — xs:, v8:, or any prefix bound to current-config namespace
|
||||
if ($t -match '^([A-Za-z][A-Za-z0-9]*):(.+)$') {
|
||||
$prefix = $Matches[1]
|
||||
$localName = $Matches[2]
|
||||
$lastType = $t
|
||||
if ($prefix -eq 'xs' -or $prefix -eq 'v8') {
|
||||
if (-not $validTypeQualifier.ContainsKey($t)) {
|
||||
Report-Error "valueType: unknown type '$t' (allowed: xs:decimal/xs:string/xs:dateTime/xs:boolean/v8:StandardPeriod or <prefix>:*Ref.X)"
|
||||
$vtOk = $false
|
||||
$lastType = $null
|
||||
}
|
||||
} else {
|
||||
# Inline-declared prefix — should resolve to current-config namespace
|
||||
$prefixNs = $child.GetNamespaceOfPrefix($prefix)
|
||||
if ($prefixNs -ne 'http://v8.1c.ru/8.1/data/enterprise/current-config') {
|
||||
Report-Error "valueType: type '$t' uses prefix '$prefix' which is not bound to enterprise/current-config namespace"
|
||||
$vtOk = $false
|
||||
$lastType = $null
|
||||
} elseif (-not ($localName -match '^[A-Za-z]+(Ref)?\.')) {
|
||||
Report-Error "valueType: ref type '$t' must look like '<prefix>:<Kind>.<Name>' (e.g. d5p1:CatalogRef.X)"
|
||||
$vtOk = $false
|
||||
$lastType = ''
|
||||
} else {
|
||||
$lastType = '' # ref type — no qualifier expected
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Report-Error "valueType: type '$t' has no namespace prefix (expected xs:/v8:/d5p1: — e.g. xs:decimal not decimal)"
|
||||
$vtOk = $false
|
||||
$lastType = $null
|
||||
}
|
||||
} elseif ($child.LocalName -match 'Qualifiers$' -and $child.NamespaceURI -eq 'http://v8.1c.ru/8.1/data/core') {
|
||||
# Qualifier block — must match preceding Type
|
||||
$expected = if ($lastType -and $validTypeQualifier.ContainsKey($lastType)) {
|
||||
$validTypeQualifier[$lastType]
|
||||
} else { $null }
|
||||
|
||||
if ($null -eq $expected -or $expected -eq '') {
|
||||
Report-Error "valueType: <$qName> after <v8:Type>$lastType</v8:Type> — this type has no qualifiers"
|
||||
$vtOk = $false
|
||||
} elseif ($qName -ne $expected) {
|
||||
Report-Error "valueType: <$qName> doesn't match <v8:Type>$lastType</v8:Type> (expected <$expected>)"
|
||||
$vtOk = $false
|
||||
} else {
|
||||
# Validate qualifier internals
|
||||
if ($qName -eq 'v8:NumberQualifiers') {
|
||||
$digits = $child.SelectSingleNode("v8:Digits", $ns)
|
||||
$frac = $child.SelectSingleNode("v8:FractionDigits", $ns)
|
||||
$sign = $child.SelectSingleNode("v8:AllowedSign", $ns)
|
||||
if (-not $digits -or -not ($digits.InnerText -match '^\d+$')) {
|
||||
Report-Error "v8:NumberQualifiers: <v8:Digits> missing or not a non-negative integer"
|
||||
$vtOk = $false
|
||||
}
|
||||
if (-not $frac -or -not ($frac.InnerText -match '^\d+$')) {
|
||||
Report-Error "v8:NumberQualifiers: <v8:FractionDigits> missing or not a non-negative integer"
|
||||
$vtOk = $false
|
||||
}
|
||||
if ($sign -and $sign.InnerText -and $sign.InnerText -notin $validSign) {
|
||||
Report-Error "v8:NumberQualifiers: <v8:AllowedSign>$($sign.InnerText)</v8:AllowedSign> — must be one of: $($validSign -join ', ')"
|
||||
$vtOk = $false
|
||||
}
|
||||
} elseif ($qName -eq 'v8:StringQualifiers') {
|
||||
$len = $child.SelectSingleNode("v8:Length", $ns)
|
||||
$al = $child.SelectSingleNode("v8:AllowedLength", $ns)
|
||||
if (-not $len -or -not ($len.InnerText -match '^\d+$')) {
|
||||
Report-Error "v8:StringQualifiers: <v8:Length> missing or not a non-negative integer"
|
||||
$vtOk = $false
|
||||
}
|
||||
if ($al -and $al.InnerText -and $al.InnerText -notin $validLength) {
|
||||
Report-Error "v8:StringQualifiers: <v8:AllowedLength>$($al.InnerText)</v8:AllowedLength> — must be one of: $($validLength -join ', ')"
|
||||
$vtOk = $false
|
||||
}
|
||||
} elseif ($qName -eq 'v8:DateQualifiers') {
|
||||
$df = $child.SelectSingleNode("v8:DateFractions", $ns)
|
||||
if ($df -and $df.InnerText -and $df.InnerText -notin $validFractions) {
|
||||
Report-Error "v8:DateQualifiers: <v8:DateFractions>$($df.InnerText)</v8:DateFractions> — must be one of: $($validFractions -join ', ')"
|
||||
$vtOk = $false
|
||||
}
|
||||
}
|
||||
}
|
||||
$lastType = $null # qualifier consumed; next must be another Type or end
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($vtChecked -gt 0 -and $vtOk) {
|
||||
Report-OK "$vtChecked valueType block(s): structure and qualifiers OK"
|
||||
}
|
||||
|
||||
if ($script:stopped) { & $finalize; exit 1 }
|
||||
|
||||
# --- 17. value content checks ---
|
||||
# Catches literal placeholders ("_") and empty strings in DesignTimeValue refs
|
||||
# that XDTO would reject at db-load-xml.
|
||||
|
||||
$valueNodes = @()
|
||||
$valueNodes += @($root.SelectNodes("//s:value[@xsi:type]", $ns))
|
||||
$valueNodes += @($root.SelectNodes("//dcscor:value[@xsi:type]", $ns))
|
||||
$vChecked = 0
|
||||
$vOk = $true
|
||||
foreach ($vn in $valueNodes) {
|
||||
if (-not $vn) { continue }
|
||||
$vChecked++
|
||||
$xsiType = $vn.GetAttribute("type", "http://www.w3.org/2001/XMLSchema-instance")
|
||||
$text = $vn.InnerText
|
||||
if ($xsiType -eq 'dcscor:DesignTimeValue') {
|
||||
if (-not $text -or $text.Trim() -eq '' -or $text.Trim() -eq '_') {
|
||||
Report-Error "<value xsi:type=`"dcscor:DesignTimeValue`">$text</value> — DesignTimeValue must be a reference path (e.g. Перечисление.X.Y), not '$text'"
|
||||
$vOk = $false
|
||||
} elseif (-not ($text -match '^[A-Za-zА-Яа-яЁё]+\.[A-Za-zА-Яа-яЁё0-9_]+')) {
|
||||
Report-Warn "<value xsi:type=`"dcscor:DesignTimeValue`">$text</value> — doesn't look like a typical ref path"
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($vChecked -gt 0 -and $vOk) {
|
||||
Report-OK "$vChecked <value> element(s) with xsi:type: content OK"
|
||||
}
|
||||
|
||||
if ($script:stopped) { & $finalize; exit 1 }
|
||||
|
||||
# --- Final output ---
|
||||
|
||||
& $finalize
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# skd-validate v1.1 — Validate 1C DCS structure (Python port)
|
||||
# skd-validate v1.2 — Validate 1C DCS structure (Python port)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
import argparse
|
||||
import os
|
||||
@@ -685,6 +685,146 @@ else:
|
||||
if v_ok:
|
||||
report_ok(f"{len(variant_nodes)} settingsVariant(s) found")
|
||||
|
||||
# ── 16. valueType structural checks ───────────────────────────
|
||||
# Catches broken XDTO that XML/structural checks miss (decimal without xs:,
|
||||
# missing qualifiers, mismatched qualifier blocks, unknown sign/length tokens).
|
||||
|
||||
import re as _re_vt
|
||||
|
||||
_VALID_TYPE_QUALIFIER = {
|
||||
'xs:decimal': 'v8:NumberQualifiers',
|
||||
'xs:string': 'v8:StringQualifiers',
|
||||
'xs:dateTime': 'v8:DateQualifiers',
|
||||
'xs:boolean': '',
|
||||
'v8:StandardPeriod': '',
|
||||
'v8:UUID': '',
|
||||
}
|
||||
_VALID_SIGN = ('Any', 'Nonnegative', 'Negative')
|
||||
_VALID_LENGTH = ('Variable', 'Fixed')
|
||||
_VALID_FRACTIONS = ('Date', 'DateTime', 'Time')
|
||||
_V8_NS_URI = 'http://v8.1c.ru/8.1/data/core'
|
||||
_CONFIG_NS_URI = 'http://v8.1c.ru/8.1/data/enterprise/current-config'
|
||||
|
||||
vt_nodes = find_all(root, "//s:valueType")
|
||||
vt_checked = 0
|
||||
vt_ok = True
|
||||
for vt in vt_nodes:
|
||||
vt_checked += 1
|
||||
last_type = None # short form 'xs:decimal' or '' (ref — no qualifiers)
|
||||
for child in vt:
|
||||
if not isinstance(child.tag, str):
|
||||
continue # comments etc.
|
||||
qname_local = etree.QName(child.tag).localname
|
||||
qname_ns = etree.QName(child.tag).namespace
|
||||
|
||||
if qname_local == 'Type' and qname_ns == _V8_NS_URI:
|
||||
t = (child.text or '').strip()
|
||||
if not t:
|
||||
report_error("valueType: <v8:Type> is empty")
|
||||
vt_ok = False
|
||||
last_type = None
|
||||
continue
|
||||
m = _re_vt.match(r'^([A-Za-z][A-Za-z0-9]*):(.+)$', t)
|
||||
if not m:
|
||||
report_error(f"valueType: type '{t}' has no namespace prefix (expected xs:/v8:/d5p1: — e.g. xs:decimal not decimal)")
|
||||
vt_ok = False
|
||||
last_type = None
|
||||
continue
|
||||
prefix, local = m.group(1), m.group(2)
|
||||
last_type = t
|
||||
if prefix in ('xs', 'v8'):
|
||||
if t not in _VALID_TYPE_QUALIFIER:
|
||||
report_error(f"valueType: unknown type '{t}' (allowed: xs:decimal/xs:string/xs:dateTime/xs:boolean/v8:StandardPeriod or <prefix>:*Ref.X)")
|
||||
vt_ok = False
|
||||
last_type = None
|
||||
else:
|
||||
# Inline-declared prefix — must resolve to current-config namespace
|
||||
prefix_ns = child.nsmap.get(prefix)
|
||||
if prefix_ns != _CONFIG_NS_URI:
|
||||
report_error(f"valueType: type '{t}' uses prefix '{prefix}' which is not bound to enterprise/current-config namespace")
|
||||
vt_ok = False
|
||||
last_type = None
|
||||
elif not _re_vt.match(r'^[A-Za-z]+(Ref)?\.', local):
|
||||
report_error(f"valueType: ref type '{t}' must look like '<prefix>:<Kind>.<Name>' (e.g. d5p1:CatalogRef.X)")
|
||||
vt_ok = False
|
||||
last_type = ''
|
||||
else:
|
||||
last_type = '' # ref — no qualifier expected
|
||||
|
||||
elif qname_local.endswith('Qualifiers') and qname_ns == _V8_NS_URI:
|
||||
q_name = f"v8:{qname_local}"
|
||||
expected = _VALID_TYPE_QUALIFIER.get(last_type) if last_type else None
|
||||
if expected is None or expected == '':
|
||||
report_error(f"valueType: <{q_name}> after <v8:Type>{last_type}</v8:Type> — this type has no qualifiers")
|
||||
vt_ok = False
|
||||
elif q_name != expected:
|
||||
report_error(f"valueType: <{q_name}> doesn't match <v8:Type>{last_type}</v8:Type> (expected <{expected}>)")
|
||||
vt_ok = False
|
||||
else:
|
||||
if q_name == 'v8:NumberQualifiers':
|
||||
digits = find(child, "v8:Digits")
|
||||
frac = find(child, "v8:FractionDigits")
|
||||
sign = find(child, "v8:AllowedSign")
|
||||
if digits is None or not _re_vt.match(r'^\d+$', text_of(digits)):
|
||||
report_error("v8:NumberQualifiers: <v8:Digits> missing or not a non-negative integer")
|
||||
vt_ok = False
|
||||
if frac is None or not _re_vt.match(r'^\d+$', text_of(frac)):
|
||||
report_error("v8:NumberQualifiers: <v8:FractionDigits> missing or not a non-negative integer")
|
||||
vt_ok = False
|
||||
if sign is not None and text_of(sign) and text_of(sign) not in _VALID_SIGN:
|
||||
report_error(f"v8:NumberQualifiers: <v8:AllowedSign>{text_of(sign)}</v8:AllowedSign> — must be one of: {', '.join(_VALID_SIGN)}")
|
||||
vt_ok = False
|
||||
elif q_name == 'v8:StringQualifiers':
|
||||
length = find(child, "v8:Length")
|
||||
al = find(child, "v8:AllowedLength")
|
||||
if length is None or not _re_vt.match(r'^\d+$', text_of(length)):
|
||||
report_error("v8:StringQualifiers: <v8:Length> missing or not a non-negative integer")
|
||||
vt_ok = False
|
||||
if al is not None and text_of(al) and text_of(al) not in _VALID_LENGTH:
|
||||
report_error(f"v8:StringQualifiers: <v8:AllowedLength>{text_of(al)}</v8:AllowedLength> — must be one of: {', '.join(_VALID_LENGTH)}")
|
||||
vt_ok = False
|
||||
elif q_name == 'v8:DateQualifiers':
|
||||
df = find(child, "v8:DateFractions")
|
||||
if df is not None and text_of(df) and text_of(df) not in _VALID_FRACTIONS:
|
||||
report_error(f"v8:DateQualifiers: <v8:DateFractions>{text_of(df)}</v8:DateFractions> — must be one of: {', '.join(_VALID_FRACTIONS)}")
|
||||
vt_ok = False
|
||||
last_type = None # consumed
|
||||
|
||||
if vt_checked > 0 and vt_ok:
|
||||
report_ok(f"{vt_checked} valueType block(s): structure and qualifiers OK")
|
||||
|
||||
if stopped:
|
||||
finalize()
|
||||
sys.exit(1)
|
||||
|
||||
# ── 17. value content checks ──────────────────────────────────
|
||||
# Catches literal placeholders ('_') and empty strings in DesignTimeValue refs
|
||||
# that XDTO would reject at db-load-xml.
|
||||
|
||||
value_nodes = find_all(root, "//s:value[@xsi:type]") + find_all(root, "//dcscor:value[@xsi:type]")
|
||||
v_checked = 0
|
||||
v_ok = True
|
||||
for vn in value_nodes:
|
||||
if vn is None:
|
||||
continue
|
||||
v_checked += 1
|
||||
xsi_type = vn.get(XSI_TYPE) or ''
|
||||
text = vn.text or ''
|
||||
if xsi_type == 'dcscor:DesignTimeValue':
|
||||
stripped = text.strip()
|
||||
if not stripped or stripped == '_':
|
||||
report_error(f"<value xsi:type=\"dcscor:DesignTimeValue\">{text}</value> — DesignTimeValue must be a reference path (e.g. Перечисление.X.Y), not '{text}'")
|
||||
v_ok = False
|
||||
elif not _re_vt.match(r'^[A-Za-zА-Яа-яЁё]+\.[A-Za-zА-Яа-яЁё0-9_]+', stripped):
|
||||
report_warn(f"<value xsi:type=\"dcscor:DesignTimeValue\">{text}</value> — doesn't look like a typical ref path")
|
||||
|
||||
if v_checked > 0 and v_ok:
|
||||
report_ok(f"{v_checked} <value> element(s) with xsi:type: content OK")
|
||||
|
||||
if stopped:
|
||||
finalize()
|
||||
sys.exit(1)
|
||||
|
||||
# ── Final output ──────────────────────────────────────────────
|
||||
|
||||
finalize()
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"name": "Ошибка: AllowedSign со значением вне Any/Nonnegative/Negative",
|
||||
"setup": "fixture:bad-allowed-sign",
|
||||
"params": { "templatePath": "Template.xml" },
|
||||
"expectError": true
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"name": "Ошибка: xs:decimal с неполными NumberQualifiers (нет Digits/FractionDigits)",
|
||||
"setup": "fixture:bad-decimal-no-qualifiers",
|
||||
"params": { "templatePath": "Template.xml" },
|
||||
"expectError": true
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"name": "Ошибка: <v8:Type>decimal</v8:Type> без префикса xs:",
|
||||
"setup": "fixture:bad-decimal-no-xs",
|
||||
"params": { "templatePath": "Template.xml" },
|
||||
"expectError": true
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"name": "Ошибка: xs:string с NumberQualifiers (несоответствие тип/qualifiers)",
|
||||
"setup": "fixture:bad-qualifier-mismatch",
|
||||
"params": { "templatePath": "Template.xml" },
|
||||
"expectError": true
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"name": "Ошибка: DesignTimeValue со значением '_' (BUG-2 от titan)",
|
||||
"setup": "fixture:bad-ref-literal",
|
||||
"params": { "templatePath": "Template.xml" },
|
||||
"expectError": true
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<DataCompositionSchema xmlns="http://v8.1c.ru/8.1/data-composition-system/schema"
|
||||
xmlns:dcscom="http://v8.1c.ru/8.1/data-composition-system/common"
|
||||
xmlns:dcscor="http://v8.1c.ru/8.1/data-composition-system/core"
|
||||
xmlns:dcsset="http://v8.1c.ru/8.1/data-composition-system/settings"
|
||||
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>ИсточникДанных1</name>
|
||||
<dataSourceType>Local</dataSourceType>
|
||||
</dataSource>
|
||||
<dataSet xsi:type="DataSetQuery">
|
||||
<name>Основной</name>
|
||||
<dataSource>ИсточникДанных1</dataSource>
|
||||
<query>SELECT 1</query>
|
||||
<field xsi:type="DataSetFieldField">
|
||||
<dataPath>Сумма</dataPath>
|
||||
<field>Сумма</field>
|
||||
<valueType>
|
||||
<v8:Type>xs:decimal</v8:Type>
|
||||
<v8:NumberQualifiers>
|
||||
<v8:Digits>10</v8:Digits>
|
||||
<v8:FractionDigits>2</v8:FractionDigits>
|
||||
<v8:AllowedSign>Garbage</v8:AllowedSign>
|
||||
</v8:NumberQualifiers>
|
||||
</valueType>
|
||||
</field>
|
||||
</dataSet>
|
||||
<settingsVariant>
|
||||
<dcsset:name>Основной</dcsset:name>
|
||||
<dcsset:settings/>
|
||||
</settingsVariant>
|
||||
</DataCompositionSchema>
|
||||
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<DataCompositionSchema xmlns="http://v8.1c.ru/8.1/data-composition-system/schema"
|
||||
xmlns:dcscom="http://v8.1c.ru/8.1/data-composition-system/common"
|
||||
xmlns:dcscor="http://v8.1c.ru/8.1/data-composition-system/core"
|
||||
xmlns:dcsset="http://v8.1c.ru/8.1/data-composition-system/settings"
|
||||
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>ИсточникДанных1</name>
|
||||
<dataSourceType>Local</dataSourceType>
|
||||
</dataSource>
|
||||
<dataSet xsi:type="DataSetQuery">
|
||||
<name>Основной</name>
|
||||
<dataSource>ИсточникДанных1</dataSource>
|
||||
<query>SELECT 1</query>
|
||||
<field xsi:type="DataSetFieldField">
|
||||
<dataPath>Сумма</dataPath>
|
||||
<field>Сумма</field>
|
||||
<valueType>
|
||||
<v8:Type>xs:decimal</v8:Type>
|
||||
<v8:NumberQualifiers>
|
||||
<v8:AllowedSign>Any</v8:AllowedSign>
|
||||
</v8:NumberQualifiers>
|
||||
</valueType>
|
||||
</field>
|
||||
</dataSet>
|
||||
<settingsVariant>
|
||||
<dcsset:name>Основной</dcsset:name>
|
||||
<dcsset:settings/>
|
||||
</settingsVariant>
|
||||
</DataCompositionSchema>
|
||||
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<DataCompositionSchema xmlns="http://v8.1c.ru/8.1/data-composition-system/schema"
|
||||
xmlns:dcscom="http://v8.1c.ru/8.1/data-composition-system/common"
|
||||
xmlns:dcscor="http://v8.1c.ru/8.1/data-composition-system/core"
|
||||
xmlns:dcsset="http://v8.1c.ru/8.1/data-composition-system/settings"
|
||||
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>ИсточникДанных1</name>
|
||||
<dataSourceType>Local</dataSourceType>
|
||||
</dataSource>
|
||||
<dataSet xsi:type="DataSetQuery">
|
||||
<name>Основной</name>
|
||||
<dataSource>ИсточникДанных1</dataSource>
|
||||
<query>SELECT 1</query>
|
||||
<field xsi:type="DataSetFieldField">
|
||||
<dataPath>Сумма</dataPath>
|
||||
<field>Сумма</field>
|
||||
<valueType>
|
||||
<v8:Type>decimal</v8:Type>
|
||||
</valueType>
|
||||
</field>
|
||||
</dataSet>
|
||||
<settingsVariant>
|
||||
<dcsset:name>Основной</dcsset:name>
|
||||
<dcsset:settings/>
|
||||
</settingsVariant>
|
||||
</DataCompositionSchema>
|
||||
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<DataCompositionSchema xmlns="http://v8.1c.ru/8.1/data-composition-system/schema"
|
||||
xmlns:dcscom="http://v8.1c.ru/8.1/data-composition-system/common"
|
||||
xmlns:dcscor="http://v8.1c.ru/8.1/data-composition-system/core"
|
||||
xmlns:dcsset="http://v8.1c.ru/8.1/data-composition-system/settings"
|
||||
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>ИсточникДанных1</name>
|
||||
<dataSourceType>Local</dataSourceType>
|
||||
</dataSource>
|
||||
<dataSet xsi:type="DataSetQuery">
|
||||
<name>Основной</name>
|
||||
<dataSource>ИсточникДанных1</dataSource>
|
||||
<query>SELECT 1</query>
|
||||
<field xsi:type="DataSetFieldField">
|
||||
<dataPath>Текст</dataPath>
|
||||
<field>Текст</field>
|
||||
<valueType>
|
||||
<v8:Type>xs:string</v8:Type>
|
||||
<v8:NumberQualifiers>
|
||||
<v8:Digits>10</v8:Digits>
|
||||
<v8:FractionDigits>2</v8:FractionDigits>
|
||||
<v8:AllowedSign>Any</v8:AllowedSign>
|
||||
</v8:NumberQualifiers>
|
||||
</valueType>
|
||||
</field>
|
||||
</dataSet>
|
||||
<settingsVariant>
|
||||
<dcsset:name>Основной</dcsset:name>
|
||||
<dcsset:settings/>
|
||||
</settingsVariant>
|
||||
</DataCompositionSchema>
|
||||
@@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<DataCompositionSchema xmlns="http://v8.1c.ru/8.1/data-composition-system/schema"
|
||||
xmlns:dcscom="http://v8.1c.ru/8.1/data-composition-system/common"
|
||||
xmlns:dcscor="http://v8.1c.ru/8.1/data-composition-system/core"
|
||||
xmlns:dcsset="http://v8.1c.ru/8.1/data-composition-system/settings"
|
||||
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>ИсточникДанных1</name>
|
||||
<dataSourceType>Local</dataSourceType>
|
||||
</dataSource>
|
||||
<dataSet xsi:type="DataSetQuery">
|
||||
<name>Основной</name>
|
||||
<dataSource>ИсточникДанных1</dataSource>
|
||||
<query>SELECT 1</query>
|
||||
<field xsi:type="DataSetFieldField">
|
||||
<dataPath>Поле1</dataPath>
|
||||
<field>Поле1</field>
|
||||
</field>
|
||||
</dataSet>
|
||||
<parameter>
|
||||
<name>Организация</name>
|
||||
<valueType>
|
||||
<v8:Type xmlns:d5p1="http://v8.1c.ru/8.1/data/enterprise/current-config">d5p1:CatalogRef.Организации</v8:Type>
|
||||
</valueType>
|
||||
<value xsi:type="dcscor:DesignTimeValue">_</value>
|
||||
</parameter>
|
||||
<settingsVariant>
|
||||
<dcsset:name>Основной</dcsset:name>
|
||||
<dcsset:settings/>
|
||||
</settingsVariant>
|
||||
</DataCompositionSchema>
|
||||
Reference in New Issue
Block a user