mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-08-04 18:50:23 +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:
co-authored by
Claude Opus 4.7
parent
05374100c1
commit
a5a1636918
@@ -10,7 +10,7 @@ allowed-tools:
|
|||||||
|
|
||||||
# /skd-validate — валидация СКД (DataCompositionSchema)
|
# /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
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
param(
|
param(
|
||||||
[Parameter(Mandatory)]
|
[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 ---
|
# --- Final output ---
|
||||||
|
|
||||||
& $finalize
|
& $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
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
import argparse
|
import argparse
|
||||||
import os
|
import os
|
||||||
@@ -685,6 +685,146 @@ else:
|
|||||||
if v_ok:
|
if v_ok:
|
||||||
report_ok(f"{len(variant_nodes)} settingsVariant(s) found")
|
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 ──────────────────────────────────────────────
|
# ── Final output ──────────────────────────────────────────────
|
||||||
|
|
||||||
finalize()
|
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