feat(skd-edit): empty parameter values, decimal/time/fix/composite

Brings skd-edit to parity with the skd-compile fixes from 449f814 / 0537410
/ ff2d851. Same helpers (Test-EmptyValue / Build-EmptyValueXml in ps1,
is_empty_value / build_empty_value_xml in py) shared by add-parameter,
modify-parameter (value=...), availableValues, add-dataParameter and
modify-dataParameter.

Behavior:
- Sentinel empty (null / "" / "_" / "null") serializes per declared type,
  matching what 1C Designer writes — ref/no-type → xsi:nil, string →
  xsi:type="xs:string" empty, date/time/decimal/boolean → typed zero,
  StandardPeriod → Custom + zero dates, dataParameters → dcscor:value
  xsi:nil="true". @valueList omits <value> entirely.
- Build-ValueTypeXml accepts bare decimal (10,2), decimal(N) (N,0),
  string(N,fix) (AllowedLength=Fixed), time (DateFractions=Time), and
  composite array of types.
- Parse-ParamShorthand / Parse-DataParamShorthand regex .+ → .* so a
  trailing `=` is treated as the empty-value sentinel. New @valueList flag.

New test cases: empty-param-values-add / -modify / empty-dataparam-values.
Three outdated skd-edit snapshots regenerated to reflect upstream skd-compile
empty-value emission (rename-parameter, reorder-parameters,
conditional-appearance-v2).

Regression: 41/41 ps1 + 41/41 py runner; 41/41 verify-snapshots ps1 + py
(live load into 1С 8.3.24). skd-compile 23/23 and skd-validate 15/15
unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-05-20 13:38:52 +03:00
parent ff2d8513c4
commit 6e14f2502e
11 changed files with 734 additions and 53 deletions
+135 -29
View File
@@ -1,4 +1,4 @@
# skd-edit v1.22 — Atomic 1C DCS editor
# skd-edit v1.23 — Atomic 1C DCS editor
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -337,7 +337,7 @@ function Parse-CalcShorthand {
function Parse-ParamShorthand {
param([string]$s)
$result = @{ name = ""; type = ""; value = $null; autoDates = $false; title = $null; hidden = $false; always = $false; availableValues = @() }
$result = @{ name = ""; type = ""; value = $null; autoDates = $false; title = $null; hidden = $false; always = $false; availableValues = @(); valueListAllowed = $false }
# Extract availableValue=... (must be before main parse — captures to end of string)
if ($s -match '\s*availableValue=(.+)$') {
@@ -350,6 +350,11 @@ function Parse-ParamShorthand {
$s = $s -replace '\s*@autoDates', ''
}
if ($s -match '@valueList\b') {
$result.valueListAllowed = $true
$s = $s -replace '\s*@valueList\b', ''
}
if ($s -match '@hidden\b') {
$result.hidden = $true
$s = $s -replace '\s*@hidden\b', ''
@@ -366,11 +371,14 @@ function Parse-ParamShorthand {
$s = ($s -replace '\s*\[[^\]]*\]\s*', ' ').Trim()
}
if ($s -match '^([^:]+):\s*(\S+)(\s*=\s*(.+))?$') {
# Split "Name: Type = Value" — RHS may be empty (`= ` / `=`) → treated as empty-value sentinel
if ($s -match '^([^:]+):\s*(\S+)(\s*=\s*(.*))?$') {
$result.name = $Matches[1].Trim()
$result.type = Resolve-TypeStr ($Matches[2].Trim())
if ($Matches[4]) {
$result.value = $Matches[4].Trim()
$hasEq = $null -ne $Matches[3]
$rhs = $Matches[4]
if ($hasEq) {
$result.value = if ($rhs) { $rhs.Trim() } else { "" }
}
} else {
$result.name = $s.Trim()
@@ -490,17 +498,16 @@ function Parse-DataParamShorthand {
$s = $s.Trim()
if ($s -match '^([^=]+)=\s*(.+)$') {
if ($s -match '^([^=]+)=\s*(.*)$') {
$result.parameter = $Matches[1].Trim()
$valStr = $Matches[2].Trim()
$periodVariants = @("Custom","Today","ThisWeek","ThisTenDays","ThisMonth","ThisQuarter","ThisHalfYear","ThisYear","FromBeginningOfThisWeek","FromBeginningOfThisTenDays","FromBeginningOfThisMonth","FromBeginningOfThisQuarter","FromBeginningOfThisHalfYear","FromBeginningOfThisYear","LastWeek","LastTenDays","LastMonth","LastQuarter","LastHalfYear","LastYear","NextDay","NextWeek","NextTenDays","NextMonth","NextQuarter","NextHalfYear","NextYear","TillEndOfThisWeek","TillEndOfThisTenDays","TillEndOfThisMonth","TillEndOfThisQuarter","TillEndOfThisHalfYear","TillEndOfThisYear")
if ($periodVariants -contains $valStr) {
# Empty / sentinel — record as "" so caller emits xsi:nil
if ($valStr -eq "" -or $valStr -eq "_" -or $valStr.ToLowerInvariant() -eq "null") {
$result.value = ""
} elseif ($periodVariants -contains $valStr) {
$result.value = @{ variant = $valStr }
} elseif ($valStr -match '^\d{4}-\d{2}-\d{2}T') {
$result.value = $valStr
} elseif ($valStr -eq "true" -or $valStr -eq "false") {
$result.value = $valStr
} else {
$result.value = $valStr
}
@@ -744,10 +751,21 @@ function Parse-AvailableValueList {
# --- 4. Build-* functions (XML fragment generators) ---
function Build-ValueTypeXml {
param([string]$typeStr, [string]$indent)
param($typeStr, [string]$indent)
if (-not $typeStr) { return "" }
$typeStr = Resolve-TypeStr $typeStr
# Composite: array of types — concatenate per-type fragments
if ($typeStr -is [array] -or $typeStr -is [System.Collections.IList]) {
$parts = @()
foreach ($t in $typeStr) {
$p = Build-ValueTypeXml -typeStr "$t" -indent $indent
if ($p) { $parts += $p }
}
return $parts -join "`n"
}
$typeStr = Resolve-TypeStr "$typeStr"
$lines = @()
if ($typeStr -eq "boolean") {
@@ -755,20 +773,27 @@ function Build-ValueTypeXml {
return $lines -join "`n"
}
if ($typeStr -match '^string(\((\d+)\))?$') {
# string, string(N), string(N,fix) — fix → AllowedLength=Fixed
if ($typeStr -match '^string(\((\d+)(,(fix|fixed))?\))?$') {
$len = if ($Matches[2]) { $Matches[2] } else { "0" }
$al = if ($Matches[4]) { "Fixed" } else { "Variable" }
$lines += "$indent<v8:Type>xs:string</v8:Type>"
$lines += "$indent<v8:StringQualifiers>"
$lines += "$indent`t<v8:Length>$len</v8:Length>"
$lines += "$indent`t<v8:AllowedLength>Variable</v8:AllowedLength>"
$lines += "$indent`t<v8:AllowedLength>$al</v8:AllowedLength>"
$lines += "$indent</v8:StringQualifiers>"
return $lines -join "`n"
}
if ($typeStr -match '^decimal\((\d+),(\d+)(,nonneg)?\)$') {
$digits = $Matches[1]
$fraction = $Matches[2]
$sign = if ($Matches[3]) { "Nonnegative" } else { "Any" }
# decimal forms — bare decimal = money 10,2; decimal(N) = integer N,0
if ($typeStr -match '^decimal(\((\d+)(,(\d+))?(,nonneg)?\))?$') {
if (-not $Matches[1]) {
$digits = "10"; $fraction = "2"; $sign = "Any"
} else {
$digits = $Matches[2]
$fraction = if ($Matches[4]) { $Matches[4] } else { "0" }
$sign = if ($Matches[5]) { "Nonnegative" } else { "Any" }
}
$lines += "$indent<v8:Type>xs:decimal</v8:Type>"
$lines += "$indent<v8:NumberQualifiers>"
$lines += "$indent`t<v8:Digits>$digits</v8:Digits>"
@@ -778,10 +803,12 @@ function Build-ValueTypeXml {
return $lines -join "`n"
}
if ($typeStr -match '^(date|dateTime)$') {
# date / dateTime / time — all xs:dateTime, differ only in DateFractions
if ($typeStr -match '^(date|dateTime|time)$') {
$fractions = switch ($typeStr) {
"date" { "Date" }
"dateTime" { "DateTime" }
"time" { "Time" }
}
$lines += "$indent<v8:Type>xs:dateTime</v8:Type>"
$lines += "$indent<v8:DateQualifiers>"
@@ -809,6 +836,52 @@ function Build-ValueTypeXml {
return $lines -join "`n"
}
# Sentinel-normalized empty check — null / "" / "_" / "null" (case-insensitive).
function Test-EmptyValue {
param($v)
if ($null -eq $v) { return $true }
$s = "$v".Trim()
if ($s -eq "") { return $true }
if ($s -eq "_") { return $true }
if ($s.ToLowerInvariant() -eq "null") { return $true }
return $false
}
# Returns XML fragment string for a type-aware empty <value>.
# Empty + valueListAllowed → omit entirely (returns $null).
# tagPrefix used for dcscor: in data parameters.
function Build-EmptyValueXml {
param([string]$type, [string]$indent, [string]$tagPrefix = "", [string]$tagName = "value", [bool]$valueListAllowed = $false)
if ($valueListAllowed) { return $null }
$t = if ($null -eq $type) { "" } else { "$type" }
# Strip well-known XML schema prefixes so callers can pass raw <v8:Type> text
$t = $t -replace '^xs:', '' -replace '^v8:', '' -replace '^d\d+p\d+:', ''
$pf = $tagPrefix
$tn = $tagName
$lines = @()
if ($t -eq "") {
$lines += "$indent<${pf}${tn} xsi:nil=`"true`"/>"
} elseif ($t -eq "StandardPeriod") {
$lines += "$indent<${pf}${tn} xsi:type=`"v8:StandardPeriod`">"
$lines += "$indent`t<v8:variant xsi:type=`"v8:StandardPeriodVariant`">Custom</v8:variant>"
$lines += "$indent`t<v8:startDate>0001-01-01T00:00:00</v8:startDate>"
$lines += "$indent`t<v8:endDate>0001-01-01T00:00:00</v8:endDate>"
$lines += "$indent</${pf}${tn}>"
} elseif ($t -match '^string') {
$lines += "$indent<${pf}${tn} xsi:type=`"xs:string`"/>"
} elseif ($t -match '^(date|time)') {
$lines += "$indent<${pf}${tn} xsi:type=`"xs:dateTime`">0001-01-01T00:00:00</${pf}${tn}>"
} elseif ($t -match '^decimal') {
$lines += "$indent<${pf}${tn} xsi:type=`"xs:decimal`">0</${pf}${tn}>"
} elseif ($t -eq "boolean") {
$lines += "$indent<${pf}${tn} xsi:type=`"xs:boolean`">false</${pf}${tn}>"
} else {
# Ref types or unknown — safe nil
$lines += "$indent<${pf}${tn} xsi:nil=`"true`"/>"
}
return $lines -join "`n"
}
function Build-MLTextXml {
param([string]$tag, [string]$text, [string]$indent)
$lines = @()
@@ -1022,8 +1095,13 @@ function Build-AvailableValueFragment {
$lines = @()
$lines += "$indent<availableValue>"
$valueLines = Build-ParamValueXml -type $declaredType -value $item.value -indent "$indent`t"
foreach ($vl in $valueLines) { $lines += $vl }
if (Test-EmptyValue $item.value) {
$emptyXml = Build-EmptyValueXml -type $declaredType -indent "$indent`t" -tagPrefix "" -tagName "value" -valueListAllowed $false
if ($emptyXml) { $lines += $emptyXml }
} else {
$valueLines = Build-ParamValueXml -type $declaredType -value $item.value -indent "$indent`t"
foreach ($vl in $valueLines) { $lines += $vl }
}
if ($item.presentation) {
$lines += "$indent`t<presentation xsi:type=`"v8:LocalStringType`">"
$lines += "$indent`t`t<v8:item>"
@@ -1056,9 +1134,15 @@ function Build-ParamFragment {
$lines += "$i`t</valueType>"
}
$vla = [bool]$parsed.valueListAllowed
if ($null -ne $parsed.value) {
$valueLines = Build-ParamValueXml -type $parsed.type -value $parsed.value -indent "$i`t"
foreach ($vl in $valueLines) { $lines += $vl }
if (Test-EmptyValue $parsed.value) {
$emptyXml = Build-EmptyValueXml -type $parsed.type -indent "$i`t" -tagPrefix "" -tagName "value" -valueListAllowed $vla
if ($emptyXml) { $lines += $emptyXml }
} else {
$valueLines = Build-ParamValueXml -type $parsed.type -value $parsed.value -indent "$i`t"
foreach ($vl in $valueLines) { $lines += $vl }
}
}
if ($parsed.hidden) {
@@ -1066,6 +1150,10 @@ function Build-ParamFragment {
$lines += "$i`t<availableAsField>false</availableAsField>"
}
if ($vla) {
$lines += "$i`t<valueListAllowed>true</valueListAllowed>"
}
if ($parsed.availableValues -and $parsed.availableValues.Count -gt 0) {
foreach ($av in $parsed.availableValues) {
$avLines = Build-AvailableValueFragment -item $av -declaredType $parsed.type -indent "$i`t"
@@ -1207,6 +1295,8 @@ function Build-DataParamFragment {
$lines += "$i`t`t<v8:startDate>0001-01-01T00:00:00</v8:startDate>"
$lines += "$i`t`t<v8:endDate>0001-01-01T00:00:00</v8:endDate>"
$lines += "$i`t</dcscor:value>"
} elseif (Test-EmptyValue $parsed.value) {
$lines += "$i`t<dcscor:value xsi:nil=`"true`"/>"
} elseif ("$($parsed.value)" -match '^\d{4}-\d{2}-\d{2}T') {
$lines += "$i`t<dcscor:value xsi:type=`"xs:dateTime`">$(Esc-Xml "$($parsed.value)")</dcscor:value>"
} elseif ("$($parsed.value)" -eq "true" -or "$($parsed.value)" -eq "false") {
@@ -2107,8 +2197,20 @@ switch ($Operation) {
}
}
}
$valueLines = Build-ParamValueXml -type $declaredType -value $value -indent $childIndent
$fragXml = $valueLines -join "`n"
# Detect valueListAllowed flag on the parameter — empty value should be omitted
$vlaSet = $false
foreach ($ch in $paramEl.ChildNodes) {
if ($ch.NodeType -eq 'Element' -and $ch.LocalName -eq 'valueListAllowed' -and $ch.NamespaceURI -eq $schNs) {
if ($ch.InnerText.Trim() -eq 'true') { $vlaSet = $true }
break
}
}
if (Test-EmptyValue $value) {
$fragXml = Build-EmptyValueXml -type $declaredType -indent $childIndent -tagPrefix "" -tagName "value" -valueListAllowed $vlaSet
} else {
$valueLines = Build-ParamValueXml -type $declaredType -value $value -indent $childIndent
$fragXml = $valueLines -join "`n"
}
$wasExisting = ($null -ne $existing)
if ($existing) {
@@ -2127,9 +2229,11 @@ switch ($Operation) {
}
}
}
$nodes = Import-Fragment $xmlDoc $fragXml
foreach ($node in $nodes) {
Insert-BeforeElement $paramEl $node $refNode $childIndent
if ($fragXml) {
$nodes = Import-Fragment $xmlDoc $fragXml
foreach ($node in $nodes) {
Insert-BeforeElement $paramEl $node $refNode $childIndent
}
}
$verb = if ($wasExisting) { "updated" } else { "added" }
$script:Dirty = $true; Write-Host "[OK] Parameter `"$paramName`": value $verb to $value"
@@ -3072,6 +3176,8 @@ switch ($Operation) {
$valLines += "$itemIndent`t<v8:startDate>0001-01-01T00:00:00</v8:startDate>"
$valLines += "$itemIndent`t<v8:endDate>0001-01-01T00:00:00</v8:endDate>"
$valLines += "$itemIndent</dcscor:value>"
} elseif (Test-EmptyValue $parsed.value) {
$valLines += "$itemIndent<dcscor:value xsi:nil=`"true`"/>"
} elseif ("$($parsed.value)" -match '^\d{4}-\d{2}-\d{2}T') {
$valLines += "$itemIndent<dcscor:value xsi:type=`"xs:dateTime`">$(Esc-Xml "$($parsed.value)")</dcscor:value>"
} elseif ("$($parsed.value)" -eq "true" -or "$($parsed.value)" -eq "false") {
+123 -24
View File
@@ -1,4 +1,4 @@
# skd-edit v1.22 — Atomic 1C DCS editor (Python port)
# skd-edit v1.23 — Atomic 1C DCS editor (Python port)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import os
@@ -335,7 +335,7 @@ def parse_calc_shorthand(s):
def parse_param_shorthand(s):
result = {"name": "", "type": "", "value": None, "autoDates": False, "title": None, "hidden": False, "always": False, "availableValues": []}
result = {"name": "", "type": "", "value": None, "autoDates": False, "title": None, "hidden": False, "always": False, "availableValues": [], "valueListAllowed": False}
# Extract availableValue=... (must be before main parse — captures to end of string)
m_av = re.search(r'\s*availableValue=(.+)$', s)
@@ -347,6 +347,10 @@ def parse_param_shorthand(s):
result["autoDates"] = True
s = re.sub(r'\s*@autoDates', '', s)
if re.search(r'@valueList\b', s):
result["valueListAllowed"] = True
s = re.sub(r'\s*@valueList\b', '', s)
if re.search(r'@hidden\b', s):
result["hidden"] = True
s = re.sub(r'\s*@hidden\b', '', s)
@@ -361,12 +365,13 @@ def parse_param_shorthand(s):
result["title"] = m.group(1).strip()
s = re.sub(r'\s*\[[^\]]*\]\s*', ' ', s).strip()
m = re.match(r'^([^:]+):\s*(\S+)(\s*=\s*(.+))?$', s)
# Allow empty RHS (`= ` / `=`) as empty-value sentinel
m = re.match(r'^([^:]+):\s*(\S+)(\s*=\s*(.*))?$', s)
if m:
result["name"] = m.group(1).strip()
result["type"] = resolve_type_str(m.group(2).strip())
if m.group(4):
result["value"] = m.group(4).strip()
if m.group(3) is not None:
result["value"] = m.group(4).strip() if m.group(4) else ""
else:
result["name"] = s.strip()
@@ -466,7 +471,7 @@ def parse_data_param_shorthand(s):
s = s.strip()
m = re.match(r'^([^=]+)=\s*(.+)$', s)
m = re.match(r'^([^=]+)=\s*(.*)$', s)
if m:
result["parameter"] = m.group(1).strip()
val_str = m.group(2).strip()
@@ -480,7 +485,10 @@ def parse_data_param_shorthand(s):
"TillEndOfThisWeek", "TillEndOfThisTenDays", "TillEndOfThisMonth",
"TillEndOfThisQuarter", "TillEndOfThisHalfYear", "TillEndOfThisYear",
]
if val_str in period_variants:
# Empty / sentinel — record as "" so caller emits xsi:nil
if val_str == "" or val_str == "_" or val_str.lower() == "null":
result["value"] = ""
elif val_str in period_variants:
result["value"] = {"variant": val_str}
else:
result["value"] = val_str
@@ -684,8 +692,13 @@ def parse_available_value_list(s):
def build_available_value_fragment(item, declared_type, indent):
"""Return XML lines for a single <availableValue> block."""
lines = [f"{indent}<availableValue>"]
for vl in build_param_value_xml(declared_type, item["value"], f"{indent}\t"):
lines.append(vl)
if is_empty_value(item.get("value")):
empty_xml = build_empty_value_xml(declared_type, f"{indent}\t", "", "value", False)
if empty_xml:
lines.append(empty_xml)
else:
for vl in build_param_value_xml(declared_type, item["value"], f"{indent}\t"):
lines.append(vl)
if item.get("presentation"):
lines.append(f'{indent}\t<presentation xsi:type="v8:LocalStringType">')
lines.append(f"{indent}\t\t<v8:item>")
@@ -702,27 +715,44 @@ def build_available_value_fragment(item, declared_type, indent):
def build_value_type_xml(type_str, indent):
if not type_str:
return ""
type_str = resolve_type_str(type_str)
# Composite: list/tuple → concatenate per-type fragments
if isinstance(type_str, (list, tuple)):
parts = []
for t in type_str:
p = build_value_type_xml(str(t), indent)
if p:
parts.append(p)
return "\n".join(parts)
type_str = resolve_type_str(str(type_str))
lines = []
if type_str == "boolean":
lines.append(f"{indent}<v8:Type>xs:boolean</v8:Type>")
return "\n".join(lines)
m = re.match(r'^string(\((\d+)\))?$', type_str)
# string, string(N), string(N,fix) — fix → AllowedLength=Fixed
m = re.match(r'^string(\((\d+)(,(fix|fixed))?\))?$', type_str)
if m:
length = m.group(2) if m.group(2) else "0"
al = "Fixed" if m.group(4) else "Variable"
lines.append(f"{indent}<v8:Type>xs:string</v8:Type>")
lines.append(f"{indent}<v8:StringQualifiers>")
lines.append(f"{indent}\t<v8:Length>{length}</v8:Length>")
lines.append(f"{indent}\t<v8:AllowedLength>Variable</v8:AllowedLength>")
lines.append(f"{indent}\t<v8:AllowedLength>{al}</v8:AllowedLength>")
lines.append(f"{indent}</v8:StringQualifiers>")
return "\n".join(lines)
m = re.match(r'^decimal\((\d+),(\d+)(,nonneg)?\)$', type_str)
# decimal — bare = 10,2; decimal(N) = N,0
m = re.match(r'^decimal(\((\d+)(,(\d+))?(,nonneg)?\))?$', type_str)
if m:
digits, fraction = m.group(1), m.group(2)
sign = "Nonnegative" if m.group(3) else "Any"
if not m.group(1):
digits, fraction, sign = "10", "2", "Any"
else:
digits = m.group(2)
fraction = m.group(4) if m.group(4) else "0"
sign = "Nonnegative" if m.group(5) else "Any"
lines.append(f"{indent}<v8:Type>xs:decimal</v8:Type>")
lines.append(f"{indent}<v8:NumberQualifiers>")
lines.append(f"{indent}\t<v8:Digits>{digits}</v8:Digits>")
@@ -731,9 +761,10 @@ def build_value_type_xml(type_str, indent):
lines.append(f"{indent}</v8:NumberQualifiers>")
return "\n".join(lines)
m = re.match(r'^(date|dateTime)$', type_str)
# date / dateTime / time — all xs:dateTime
m = re.match(r'^(date|dateTime|time)$', type_str)
if m:
fractions = "Date" if type_str == "date" else "DateTime"
fractions = {"date": "Date", "dateTime": "DateTime", "time": "Time"}[type_str]
lines.append(f"{indent}<v8:Type>xs:dateTime</v8:Type>")
lines.append(f"{indent}<v8:DateQualifiers>")
lines.append(f"{indent}\t<v8:DateFractions>{fractions}</v8:DateFractions>")
@@ -756,6 +787,52 @@ def build_value_type_xml(type_str, indent):
return "\n".join(lines)
def is_empty_value(v):
"""Empty sentinel — None / '' / '_' / 'null' (case-insensitive)."""
if v is None:
return True
s = str(v).strip()
if s == "":
return True
if s == "_":
return True
if s.lower() == "null":
return True
return False
def build_empty_value_xml(type_str, indent, tag_prefix="", tag_name="value", value_list_allowed=False):
"""Type-aware empty <value> fragment. Returns None when valueListAllowed (omit)."""
if value_list_allowed:
return None
t = "" if type_str is None else str(type_str)
# Strip well-known XML schema prefixes so callers can pass raw <v8:Type> text
t = re.sub(r'^xs:', '', t)
t = re.sub(r'^v8:', '', t)
t = re.sub(r'^d\d+p\d+:', '', t)
pf, tn = tag_prefix, tag_name
lines = []
if t == "":
lines.append(f'{indent}<{pf}{tn} xsi:nil="true"/>')
elif t == "StandardPeriod":
lines.append(f'{indent}<{pf}{tn} xsi:type="v8:StandardPeriod">')
lines.append(f'{indent}\t<v8:variant xsi:type="v8:StandardPeriodVariant">Custom</v8:variant>')
lines.append(f'{indent}\t<v8:startDate>0001-01-01T00:00:00</v8:startDate>')
lines.append(f'{indent}\t<v8:endDate>0001-01-01T00:00:00</v8:endDate>')
lines.append(f'{indent}</{pf}{tn}>')
elif re.match(r'^string', t):
lines.append(f'{indent}<{pf}{tn} xsi:type="xs:string"/>')
elif re.match(r'^(date|time)', t):
lines.append(f'{indent}<{pf}{tn} xsi:type="xs:dateTime">0001-01-01T00:00:00</{pf}{tn}>')
elif re.match(r'^decimal', t):
lines.append(f'{indent}<{pf}{tn} xsi:type="xs:decimal">0</{pf}{tn}>')
elif t == "boolean":
lines.append(f'{indent}<{pf}{tn} xsi:type="xs:boolean">false</{pf}{tn}>')
else:
lines.append(f'{indent}<{pf}{tn} xsi:nil="true"/>')
return "\n".join(lines)
def build_mltext_xml(tag, text, indent):
lines = [
f'{indent}<{tag} xsi:type="v8:LocalStringType">',
@@ -934,14 +1011,23 @@ def build_param_fragment(parsed, indent):
lines.append(build_value_type_xml(parsed["type"], f"{i}\t\t"))
lines.append(f"{i}\t</valueType>")
vla = bool(parsed.get("valueListAllowed"))
if parsed["value"] is not None:
for vl in build_param_value_xml(parsed.get("type", ""), parsed["value"], f"{i}\t"):
lines.append(vl)
if is_empty_value(parsed["value"]):
empty_xml = build_empty_value_xml(parsed.get("type", ""), f"{i}\t", "", "value", vla)
if empty_xml:
lines.append(empty_xml)
else:
for vl in build_param_value_xml(parsed.get("type", ""), parsed["value"], f"{i}\t"):
lines.append(vl)
if parsed.get("hidden"):
lines.append(f"{i}\t<useRestriction>true</useRestriction>")
lines.append(f"{i}\t<availableAsField>false</availableAsField>")
if vla:
lines.append(f"{i}\t<valueListAllowed>true</valueListAllowed>")
for av in parsed.get("availableValues", []) or []:
for l in build_available_value_fragment(av, parsed.get("type", ""), f"{i}\t"):
lines.append(l)
@@ -1065,6 +1151,8 @@ def build_data_param_fragment(parsed, indent):
lines.append(f"{i}\t\t<v8:startDate>0001-01-01T00:00:00</v8:startDate>")
lines.append(f"{i}\t\t<v8:endDate>0001-01-01T00:00:00</v8:endDate>")
lines.append(f"{i}\t</dcscor:value>")
elif is_empty_value(val):
lines.append(f'{i}\t<dcscor:value xsi:nil="true"/>')
elif re.match(r'^\d{4}-\d{2}-\d{2}T', str(val)):
lines.append(f'{i}\t<dcscor:value xsi:type="xs:dateTime">{esc_xml(str(val))}</dcscor:value>')
elif str(val) in ("true", "false"):
@@ -1802,8 +1890,16 @@ elif operation == "modify-parameter":
if isinstance(tnode.tag, str) and local_name(tnode) == "Type":
declared_type = re.sub(r'^d\d+p\d+:', '', (tnode.text or "").strip())
break
value_lines = build_param_value_xml(declared_type, value, child_indent)
frag_xml = "\n".join(value_lines)
# Detect valueListAllowed — empty value should be omitted when set
vla_set = False
vla_el = next((ch for ch in param_el if isinstance(ch.tag, str) and local_name(ch) == "valueListAllowed" and etree.QName(ch.tag).namespace == SCH_NS), None)
if vla_el is not None and (vla_el.text or "").strip() == "true":
vla_set = True
if is_empty_value(value):
frag_xml = build_empty_value_xml(declared_type, child_indent, "", "value", vla_set)
else:
value_lines = build_param_value_xml(declared_type, value, child_indent)
frag_xml = "\n".join(value_lines)
was_existing = existing is not None
if existing is not None:
# Find next-element sibling as ref before removing
@@ -1812,9 +1908,10 @@ elif operation == "modify-parameter":
remove_node_with_whitespace(existing)
else:
ref_node = next((ch for ch in param_el if isinstance(ch.tag, str) and local_name(ch) in ("useRestriction", "availableValue", "denyIncompleteValues", "use")), None)
nodes = import_fragment(xml_doc, frag_xml)
for node in nodes:
insert_before_element(param_el, node, ref_node, child_indent)
if frag_xml:
nodes = import_fragment(xml_doc, frag_xml)
for node in nodes:
insert_before_element(param_el, node, ref_node, child_indent)
verb = "updated" if was_existing else "added"
dirty = True; print(f'[OK] Parameter "{param_name}": value {verb} to {value}')
elif existing is not None:
@@ -2543,6 +2640,8 @@ elif operation == "modify-dataParameter":
val_lines.append(f"{item_indent}\t<v8:startDate>0001-01-01T00:00:00</v8:startDate>")
val_lines.append(f"{item_indent}\t<v8:endDate>0001-01-01T00:00:00</v8:endDate>")
val_lines.append(f"{item_indent}</dcscor:value>")
elif is_empty_value(pv):
val_lines.append(f'{item_indent}<dcscor:value xsi:nil="true"/>')
elif re.match(r'^\d{4}-\d{2}-\d{2}T', str(pv)):
val_lines.append(f'{item_indent}<dcscor:value xsi:type="xs:dateTime">{esc_xml(str(pv))}</dcscor:value>')
elif str(pv) in ("true", "false"):
@@ -0,0 +1,37 @@
{
"name": "modify-dataParameter: пустые значения (sentinel-формы) → dcscor:value xsi:nil",
"preRun": [
{
"script": "skd-compile/scripts/skd-compile",
"input": {
"dataSets": [{
"name": "Основной",
"query": "ВЫБРАТЬ 1 КАК Поле1",
"fields": ["Поле1: decimal(1,0)"]
}],
"parameters": [
"Период: StandardPeriod = LastMonth",
"Организация: string = Альфа"
],
"settingsVariants": [{
"name": "Основной",
"settings": {
"selection": ["Auto"],
"dataParameters": ["Период = LastMonth", "Организация = Альфа"],
"structure": "details"
}
}]
},
"args": { "-DefinitionFile": "{inputFile}", "-OutputPath": "{workDir}/Template.xml" }
},
{
"script": "skd-edit/scripts/skd-edit",
"args": { "-TemplatePath": "{workDir}/Template.xml", "-Operation": "modify-dataParameter", "-Value": "Период = _" }
}
],
"params": {
"templatePath": "Template.xml",
"operation": "modify-dataParameter",
"value": "Организация = null"
}
}
@@ -0,0 +1,21 @@
{
"name": "add-parameter: пустые значения и расширенные типы (decimal bare, time, string fix, sentinels)",
"preRun": [
{
"script": "skd-compile/scripts/skd-compile",
"input": {
"dataSets": [{
"name": "Основной",
"query": "ВЫБРАТЬ 1 КАК Поле1",
"fields": ["Поле1: decimal(1,0)"]
}]
},
"args": { "-DefinitionFile": "{inputFile}", "-OutputPath": "{workDir}/Template.xml" }
}
],
"params": {
"templatePath": "Template.xml",
"operation": "add-parameter",
"value": "ПарСтрока: string =;;ПарСтрокаНулл: string = null;;ПарСтрокаПодч: string = _;;ПарДата: date =;;ПарВремя: time =;;ПарВремяНепусто: time = 0001-01-01T12:30:00;;ПарДатаВремя: dateTime = _;;ПарЧислоБар: decimal =;;ПарЧислоН: decimal(8) =;;ПарБул: boolean =;;ПарПериод: StandardPeriod = _;;ПарСсылка: CatalogRef.Номенклатура = null;;ПарСтрокаФикс: string(10,fix) =;;ПарСписок: string @valueList = _"
}
}
@@ -0,0 +1,39 @@
{
"name": "modify-parameter: установка пустого значения через sentinel-формы (value=_, value=null)",
"preRun": [
{
"script": "skd-compile/scripts/skd-compile",
"input": {
"dataSets": [{
"name": "Основной",
"query": "ВЫБРАТЬ 1 КАК Поле1",
"fields": ["Поле1: decimal(1,0)"]
}],
"parameters": [
"ПарСтрока: string = ABC",
"ПарДата: date = 2025-01-15T00:00:00",
"ПарЧисло: decimal = 42",
"ПарСсылка: CatalogRef.Номенклатура = Справочник.Номенклатура.НашаОрганизация"
]
},
"args": { "-DefinitionFile": "{inputFile}", "-OutputPath": "{workDir}/Template.xml" }
},
{
"script": "skd-edit/scripts/skd-edit",
"args": { "-TemplatePath": "{workDir}/Template.xml", "-Operation": "modify-parameter", "-Value": "ПарСтрока value=_" }
},
{
"script": "skd-edit/scripts/skd-edit",
"args": { "-TemplatePath": "{workDir}/Template.xml", "-Operation": "modify-parameter", "-Value": "ПарДата value=null" }
},
{
"script": "skd-edit/scripts/skd-edit",
"args": { "-TemplatePath": "{workDir}/Template.xml", "-Operation": "modify-parameter", "-Value": "ПарЧисло value=_" }
}
],
"params": {
"templatePath": "Template.xml",
"operation": "modify-parameter",
"value": "ПарСсылка value=null"
}
}
@@ -37,6 +37,7 @@
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</valueType>
<value xsi:type="xs:string"/>
</parameter>
<settingsVariant>
<dcsset:name>Основной</dcsset:name>
@@ -0,0 +1,84 @@
<?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>
<field xsi:type="DataSetFieldField">
<dataPath>Поле1</dataPath>
<field>Поле1</field>
<valueType>
<v8:Type>xs:decimal</v8:Type>
<v8:NumberQualifiers>
<v8:Digits>1</v8:Digits>
<v8:FractionDigits>0</v8:FractionDigits>
<v8:AllowedSign>Any</v8:AllowedSign>
</v8:NumberQualifiers>
</valueType>
</field>
<dataSource>ИсточникДанных1</dataSource>
<query>ВЫБРАТЬ 1 КАК Поле1</query>
</dataSet>
<parameter>
<name>Период</name>
<valueType>
<v8:Type>v8:StandardPeriod</v8:Type>
</valueType>
<value xsi:type="v8:StandardPeriod">
<v8:variant xsi:type="v8:StandardPeriodVariant">LastMonth</v8:variant>
<v8:startDate>0001-01-01T00:00:00</v8:startDate>
<v8:endDate>0001-01-01T00:00:00</v8:endDate>
</value>
</parameter>
<parameter>
<name>Организация</name>
<valueType>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>0</v8:Length>
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</valueType>
<value xsi:type="xs:string">Альфа</value>
</parameter>
<settingsVariant>
<dcsset:name>Основной</dcsset:name>
<dcsset:presentation xsi:type="v8:LocalStringType">
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Основной</v8:content>
</v8:item>
</dcsset:presentation>
<dcsset:settings xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows">
<dcsset:selection>
</dcsset:selection>
<dcsset:dataParameters>
<dcscor:item xsi:type="dcsset:SettingsParameterValue">
<dcscor:parameter>Период</dcscor:parameter>
<dcscor:value xsi:nil="true"/>
</dcscor:item>
<dcscor:item xsi:type="dcsset:SettingsParameterValue">
<dcscor:parameter>Организация</dcscor:parameter>
<dcscor:value xsi:nil="true"/>
</dcscor:item>
</dcsset:dataParameters>
<dcsset:item xsi:type="dcsset:StructureItemGroup">
<dcsset:order>
<dcsset:item xsi:type="dcsset:OrderItemAuto"/>
</dcsset:order>
<dcsset:selection>
<dcsset:item xsi:type="dcsset:SelectedItemAuto"/>
</dcsset:selection>
</dcsset:item>
</dcsset:settings>
</settingsVariant>
</DataCompositionSchema>
@@ -0,0 +1,196 @@
<?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>
<field xsi:type="DataSetFieldField">
<dataPath>Поле1</dataPath>
<field>Поле1</field>
<valueType>
<v8:Type>xs:decimal</v8:Type>
<v8:NumberQualifiers>
<v8:Digits>1</v8:Digits>
<v8:FractionDigits>0</v8:FractionDigits>
<v8:AllowedSign>Any</v8:AllowedSign>
</v8:NumberQualifiers>
</valueType>
</field>
<dataSource>ИсточникДанных1</dataSource>
<query>ВЫБРАТЬ 1 КАК Поле1</query>
</dataSet>
<parameter>
<name>ПарСтрока</name>
<valueType>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>0</v8:Length>
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</valueType>
<value xsi:type="xs:string"/>
</parameter>
<parameter>
<name>ПарСтрокаНулл</name>
<valueType>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>0</v8:Length>
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</valueType>
<value xsi:type="xs:string"/>
</parameter>
<parameter>
<name>ПарСтрокаПодч</name>
<valueType>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>0</v8:Length>
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</valueType>
<value xsi:type="xs:string"/>
</parameter>
<parameter>
<name>ПарДата</name>
<valueType>
<v8:Type>xs:dateTime</v8:Type>
<v8:DateQualifiers>
<v8:DateFractions>Date</v8:DateFractions>
</v8:DateQualifiers>
</valueType>
<value xsi:type="xs:dateTime">0001-01-01T00:00:00</value>
</parameter>
<parameter>
<name>ПарВремя</name>
<valueType>
<v8:Type>xs:dateTime</v8:Type>
<v8:DateQualifiers>
<v8:DateFractions>Time</v8:DateFractions>
</v8:DateQualifiers>
</valueType>
<value xsi:type="xs:dateTime">0001-01-01T00:00:00</value>
</parameter>
<parameter>
<name>ПарВремяНепусто</name>
<valueType>
<v8:Type>xs:dateTime</v8:Type>
<v8:DateQualifiers>
<v8:DateFractions>Time</v8:DateFractions>
</v8:DateQualifiers>
</valueType>
<value xsi:type="xs:dateTime">0001-01-01T12:30:00</value>
</parameter>
<parameter>
<name>ПарДатаВремя</name>
<valueType>
<v8:Type>xs:dateTime</v8:Type>
<v8:DateQualifiers>
<v8:DateFractions>DateTime</v8:DateFractions>
</v8:DateQualifiers>
</valueType>
<value xsi:type="xs:dateTime">0001-01-01T00:00:00</value>
</parameter>
<parameter>
<name>ПарЧислоБар</name>
<valueType>
<v8:Type>xs:decimal</v8:Type>
<v8:NumberQualifiers>
<v8:Digits>10</v8:Digits>
<v8:FractionDigits>2</v8:FractionDigits>
<v8:AllowedSign>Any</v8:AllowedSign>
</v8:NumberQualifiers>
</valueType>
<value xsi:type="xs:decimal">0</value>
</parameter>
<parameter>
<name>ПарЧислоН</name>
<valueType>
<v8:Type>xs:decimal</v8:Type>
<v8:NumberQualifiers>
<v8:Digits>8</v8:Digits>
<v8:FractionDigits>0</v8:FractionDigits>
<v8:AllowedSign>Any</v8:AllowedSign>
</v8:NumberQualifiers>
</valueType>
<value xsi:type="xs:decimal">0</value>
</parameter>
<parameter>
<name>ПарБул</name>
<valueType>
<v8:Type>xs:boolean</v8:Type>
</valueType>
<value xsi:type="xs:boolean">false</value>
</parameter>
<parameter>
<name>ПарПериод</name>
<valueType>
<v8:Type>v8:StandardPeriod</v8:Type>
</valueType>
<value xsi:type="v8:StandardPeriod">
<v8:variant xsi:type="v8:StandardPeriodVariant">Custom</v8:variant>
<v8:startDate>0001-01-01T00:00:00</v8:startDate>
<v8:endDate>0001-01-01T00:00:00</v8:endDate>
</value>
</parameter>
<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:nil="true"/>
</parameter>
<parameter>
<name>ПарСтрокаФикс</name>
<valueType>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>10</v8:Length>
<v8:AllowedLength>Fixed</v8:AllowedLength>
</v8:StringQualifiers>
</valueType>
<value xsi:type="xs:string"/>
</parameter>
<parameter>
<name>ПарСписок</name>
<valueType>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>0</v8:Length>
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</valueType>
<valueListAllowed>true</valueListAllowed>
</parameter>
<settingsVariant>
<dcsset:name>Основной</dcsset:name>
<dcsset:presentation xsi:type="v8:LocalStringType">
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Основной</v8:content>
</v8:item>
</dcsset:presentation>
<dcsset:settings xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows">
<dcsset:selection>
</dcsset:selection>
<dcsset:item xsi:type="dcsset:StructureItemGroup">
<dcsset:order>
<dcsset:item xsi:type="dcsset:OrderItemAuto"/>
</dcsset:order>
<dcsset:selection>
<dcsset:item xsi:type="dcsset:SelectedItemAuto"/>
</dcsset:selection>
</dcsset:item>
</dcsset:settings>
</settingsVariant>
</DataCompositionSchema>
@@ -0,0 +1,92 @@
<?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>
<field xsi:type="DataSetFieldField">
<dataPath>Поле1</dataPath>
<field>Поле1</field>
<valueType>
<v8:Type>xs:decimal</v8:Type>
<v8:NumberQualifiers>
<v8:Digits>1</v8:Digits>
<v8:FractionDigits>0</v8:FractionDigits>
<v8:AllowedSign>Any</v8:AllowedSign>
</v8:NumberQualifiers>
</valueType>
</field>
<dataSource>ИсточникДанных1</dataSource>
<query>ВЫБРАТЬ 1 КАК Поле1</query>
</dataSet>
<parameter>
<name>ПарСтрока</name>
<valueType>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>0</v8:Length>
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</valueType>
<value xsi:type="xs:string"/>
</parameter>
<parameter>
<name>ПарДата</name>
<valueType>
<v8:Type>xs:dateTime</v8:Type>
<v8:DateQualifiers>
<v8:DateFractions>Date</v8:DateFractions>
</v8:DateQualifiers>
</valueType>
<value xsi:type="xs:dateTime">0001-01-01T00:00:00</value>
</parameter>
<parameter>
<name>ПарЧисло</name>
<valueType>
<v8:Type>xs:decimal</v8:Type>
<v8:NumberQualifiers>
<v8:Digits>10</v8:Digits>
<v8:FractionDigits>2</v8:FractionDigits>
<v8:AllowedSign>Any</v8:AllowedSign>
</v8:NumberQualifiers>
</valueType>
<value xsi:type="xs:decimal">0</value>
</parameter>
<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:nil="true"/>
</parameter>
<settingsVariant>
<dcsset:name>Основной</dcsset:name>
<dcsset:presentation xsi:type="v8:LocalStringType">
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Основной</v8:content>
</v8:item>
</dcsset:presentation>
<dcsset:settings xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows">
<dcsset:selection>
</dcsset:selection>
<dcsset:item xsi:type="dcsset:StructureItemGroup">
<dcsset:order>
<dcsset:item xsi:type="dcsset:OrderItemAuto"/>
</dcsset:order>
<dcsset:selection>
<dcsset:item xsi:type="dcsset:SelectedItemAuto"/>
</dcsset:selection>
</dcsset:item>
</dcsset:settings>
</settingsVariant>
</DataCompositionSchema>
@@ -86,6 +86,7 @@
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</valueType>
<value xsi:type="xs:string"/>
</parameter>
<settingsVariant>
<dcsset:name>Основной</dcsset:name>
@@ -111,6 +112,7 @@
<dcscor:item xsi:type="dcsset:SettingsParameterValue">
<dcscor:use>false</dcscor:use>
<dcscor:parameter>Организация</dcscor:parameter>
<dcscor:value xsi:nil="true"/>
</dcscor:item>
</dcsset:dataParameters>
<dcsset:item xsi:type="dcsset:StructureItemGroup">
@@ -47,6 +47,7 @@
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</valueType>
<value xsi:type="xs:string"/>
</parameter>
<parameter>
<name>ПорядокОкругленияСумм</name>
@@ -57,6 +58,7 @@
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</valueType>
<value xsi:type="xs:string"/>
</parameter>
<parameter>
<name>Организация</name>
@@ -67,12 +69,14 @@
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</valueType>
<value xsi:type="xs:string"/>
</parameter>
<parameter>
<name>ПрекращаемаяДеятельность</name>
<valueType>
<v8:Type>xs:boolean</v8:Type>
</valueType>
<value xsi:type="xs:boolean">false</value>
</parameter>
<settingsVariant>