feat(meta-compile,meta-decompile): поддержка AccountingRegister + CalculationRegister (v1.47/v0.39)

Девятый и десятый типы — завершают семейство регистров (4 бух + 2 расч, самые сложные типы модели).
Оба byte-exact: AccountingRegister 4/4 match TOTAL 0, CalculationRegister 2/2 match TOTAL 0.
Регресс 49/49 ps1+py, ps1==py identical. 1С-cert ✓ оба (db-load-xml + db-update).

Общее:
- Новые контексты Emit-Attribute register-account/register-calc (ресурсы/измерения через богатый эмиттер).
- Декомпилятор: снят гейт +оба типа; захват спецсвойств; Attr-ToDsl +balance/accountingFlag/
  extDimensionAccountingFlag/baseDimension/scheduleLink; opt-out standardAttributes:"".

AccountingRegister:
- Рерайт Emit-AccountingRegisterProperties: верный порядок + пропущенный EnableTotalsSplitting; comment/
  useStandardCommands/includeHelp/формы/презентации; спецсвойства ChartOfAccounts/Correspondence/PeriodAdjustmentLength.
- Измерение: Balance+AccountingFlag+DenyIncompleteValues; ресурс: Balance+AccountingFlag+ExtDimensionAccountingFlag
  (без Indexing). AccountingFlag/ExtDimensionAccountingFlag — ссылки на признаки учёта ПС.
- SA-кастомизация linkByType (ExtDimensionN→Account): Emit-StandardAttribute +xr:LinkByType, SA-override +захват.

CalculationRegister:
- Рерайт Emit-CalculationRegisterProperties: comment/useStandardCommands/формы/презентации; исправлен порядок
  ChartOfCalculationTypes (был перед Periodicity). SA уже совпадал (переменный по ActionPeriod/BasePeriod).
- Измерение: DenyIncompleteValues+BaseDimension+ScheduleLink; реквизит: ScheduleLink; ресурс: только FullTextSearch.
  Реквизиты РР идут контекстом register-calc (несут ScheduleLink).

spec §7.6a/§7.6b, кейсы accounting-register/calculation-register.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-07-06 20:42:46 +03:00
parent dd22e2e17f
commit 239499a3f8
6 changed files with 260 additions and 81 deletions
@@ -1,4 +1,4 @@
# meta-compile v1.46 — Compile 1C metadata object from JSON
# meta-compile v1.47 — Compile 1C metadata object from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -843,6 +843,11 @@ function Parse-AttributeShorthand {
mainFilter = if ($val.mainFilter -eq $true) { $true } else { $false }
denyIncompleteValues = if ($val.denyIncompleteValues -eq $true) { $true } else { $false }
useInTotals = if ($null -ne $val.useInTotals) { ($val.useInTotals -eq $true) } else { $true }
baseDimension = if ($val.baseDimension -eq $true) { $true } else { $false }
scheduleLink = $val.scheduleLink
balance = if ($val.balance -eq $true) { $true } else { $false }
accountingFlag = $val.accountingFlag
extDimensionAccountingFlag = $val.extDimensionAccountingFlag
}
}
@@ -1092,7 +1097,18 @@ function Emit-StandardAttribute {
$efmt = OvOr 'EditFormat' $null
$chi = OvOr 'ChoiceHistoryOnInput' 'Auto'
X "$indent<xr:StandardAttribute name=`"$attrName`">"
X "$indent`t<xr:LinkByType/>"
# LinkByType стандартного реквизита (напр. ExtDimensionN→Account у регистра бухгалтерии). DataPath verbatim (полный).
$lbt = OvOr 'LinkByType' $null
if ($lbt) {
$lbtDp = if ($lbt.dataPath) { "$($lbt.dataPath)" } else { "$lbt" }
$lbtLi = if ($null -ne $lbt.linkItem) { $lbt.linkItem } else { 0 }
X "$indent`t<xr:LinkByType>"
X "$indent`t`t<xr:DataPath>$(Esc-Xml $lbtDp)</xr:DataPath>"
X "$indent`t`t<xr:LinkItem>$lbtLi</xr:LinkItem>"
X "$indent`t</xr:LinkByType>"
} else {
X "$indent`t<xr:LinkByType/>"
}
X "$indent`t<xr:FillChecking>$fc</xr:FillChecking>"
X "$indent`t<xr:MultiLine>false</xr:MultiLine>"
X "$indent`t<xr:FillFromFillingValue>$ffv</xr:FillFromFillingValue>"
@@ -1167,6 +1183,7 @@ function Emit-StandardAttributes {
if ($null -ne $d.format) { $ov['Format'] = $d.format } # строка ИЛИ {ru,en}
if ($null -ne $d.editFormat) { $ov['EditFormat'] = $d.editFormat }
if ($d.choiceForm) { $ov['ChoiceForm'] = "$($d.choiceForm)" }
if ($null -ne $d.linkByType) { $ov['LinkByType'] = $d.linkByType }
}
}
Emit-StandardAttribute "$indent`t" $a $ov
@@ -1607,7 +1624,7 @@ function Emit-Attribute {
# FillFromFillingValue — not for tabular/processor/chart/register-other/register-accum
# (Chart*, AccumulationRegister/AccountingRegister/CalculationRegister don't support these)
if ($context -notin @("tabular", "processor", "chart", "register-other", "register-accum")) {
if ($context -notin @("tabular", "processor", "chart", "register-other", "register-accum", "register-calc", "register-account")) {
# Флаг-shorthand `master` у ведущего измерения регистра конвенционально ставит и FillFromFillingValue=true
# (эргономика авторинга; декомпилятор пишет key-форму master:true + явный fillFromFillingValue → роундтрип цел).
$ffv = if ($parsed.fillFromFillingValue -eq $true -or ($elemTag -eq "Dimension" -and $parsed.flags -contains "master")) { "true" } else { "false" }
@@ -1615,7 +1632,7 @@ function Emit-Attribute {
}
# FillValue — same restriction
if ($context -notin @("tabular", "processor", "chart", "register-other", "register-accum")) {
if ($context -notin @("tabular", "processor", "chart", "register-other", "register-accum", "register-calc", "register-account")) {
Emit-FillValue "$indent`t`t" $typeStr $parsed.fillValue $parsed.hasFillValue
}
@@ -1653,6 +1670,33 @@ function Emit-Attribute {
X "$indent`t`t<DenyIncompleteValues>$denyIncomplete</DenyIncompleteValues>"
}
# Измерение регистра расчёта: DenyIncompleteValues + BaseDimension (между ChoiceHistoryOnInput и ScheduleLink/Indexing).
if ($elemTag -eq "Dimension" -and $context -eq "register-calc") {
$denyIncomplete = if ($parsed.denyIncompleteValues -eq $true -or $parsed.flags -contains "denyincomplete") { "true" } else { "false" }
$baseDimension = if ($parsed.baseDimension -eq $true -or $parsed.flags -contains "base") { "true" } else { "false" }
X "$indent`t`t<DenyIncompleteValues>$denyIncomplete</DenyIncompleteValues>"
X "$indent`t`t<BaseDimension>$baseDimension</BaseDimension>"
}
# Регистр расчёта: ScheduleLink у измерений и реквизитов (НЕ ресурсов), перед Indexing. Дефолт пустой.
if ($context -eq "register-calc" -and $elemTag -in @("Dimension", "Attribute")) {
if ($parsed.scheduleLink) { X "$indent`t`t<ScheduleLink>$(Esc-Xml "$($parsed.scheduleLink)")</ScheduleLink>" }
else { X "$indent`t`t<ScheduleLink/>" }
}
# Измерение/ресурс регистра бухгалтерии: Balance + AccountingFlag (ссылка на признак учёта ПС), затем
# DenyIncompleteValues (измерение) / ExtDimensionAccountingFlag (ресурс). Всё между ChoiceHistoryOnInput и Indexing.
if ($context -eq "register-account" -and $elemTag -in @("Dimension", "Resource")) {
$balance = if ($parsed.balance -eq $true -or $parsed.flags -contains "balance") { "true" } else { "false" }
X "$indent`t`t<Balance>$balance</Balance>"
if ($parsed.accountingFlag) { X "$indent`t`t<AccountingFlag>$(Esc-Xml "$($parsed.accountingFlag)")</AccountingFlag>" } else { X "$indent`t`t<AccountingFlag/>" }
if ($elemTag -eq "Dimension") {
$denyIncomplete = if ($parsed.denyIncompleteValues -eq $true -or $parsed.flags -contains "denyincomplete") { "true" } else { "false" }
X "$indent`t`t<DenyIncompleteValues>$denyIncomplete</DenyIncompleteValues>"
} else {
if ($parsed.extDimensionAccountingFlag) { X "$indent`t`t<ExtDimensionAccountingFlag>$(Esc-Xml "$($parsed.extDimensionAccountingFlag)")</ExtDimensionAccountingFlag>" } else { X "$indent`t`t<ExtDimensionAccountingFlag/>" }
}
}
# Use — only for catalog top-level attributes
if ($context -eq "catalog") {
$use = if ($parsed.use) { $parsed.use } else { "ForItem" }
@@ -1663,8 +1707,8 @@ function Emit-Attribute {
if ($context -notin @("processor", "processor-tabular")) {
# Признаки учёта ПС (account-flag) не имеют <Indexing>/<FullTextSearch>, но имеют <DataHistory>.
if ($context -ne "account-flag") {
# Ресурс регистра накопления НЕ имеет <Indexing> (только <FullTextSearch>); измерение/реквизит — имеют.
if (-not ($context -eq "register-accum" -and $elemTag -eq "Resource")) {
# Ресурс регистра накопления/расчёта/бухгалтерии НЕ имеет <Indexing> (только <FullTextSearch>); измерение/реквизит — имеют.
if (-not ($context -in @("register-accum", "register-calc", "register-account") -and $elemTag -eq "Resource")) {
$indexing = "DontIndex"
if ($parsed.flags -contains "index") { $indexing = "Index" }
if ($parsed.flags -contains "indexadditional") { $indexing = "IndexWithAdditionalOrder" }
@@ -1681,7 +1725,7 @@ function Emit-Attribute {
X "$indent`t`t<UseInTotals>$useInTotals</UseInTotals>"
}
# DataHistory — not for Chart* types and non-InformationRegister register family
if ($context -notin @("chart", "register-other", "register-accum")) {
if ($context -notin @("chart", "register-other", "register-accum", "register-calc", "register-account")) {
$dh = if ($parsed.dataHistory) { $parsed.dataHistory } else { "Use" }
X "$indent`t`t<DataHistory>$dh</DataHistory>"
}
@@ -2902,13 +2946,14 @@ function Emit-AccountingRegisterProperties {
X "$i<Name>$(Esc-Xml $objName)</Name>"
Emit-MLText $i "Synonym" $synonym
X "$i<Comment/>"
X "$i<UseStandardCommands>true</UseStandardCommands>"
X "$i<DefaultListForm/>"
X "$i<AuxiliaryListForm/>"
if ($def.comment) { X "$i<Comment>$(Esc-XmlText "$($def.comment)")</Comment>" } else { X "$i<Comment/>" }
$useStdCmd = if (Get-BoolProp "useStandardCommands" $true) { "true" } else { "false" }
X "$i<UseStandardCommands>$useStdCmd</UseStandardCommands>"
$inclHelp = if (Get-BoolProp "includeHelpInContents" $false) { "true" } else { "false" }
X "$i<IncludeHelpInContents>$inclHelp</IncludeHelpInContents>"
$chartOfAccounts = if ($def.chartOfAccounts) { "$($def.chartOfAccounts)" } else { "" }
if ($chartOfAccounts) { X "$i<ChartOfAccounts>$chartOfAccounts</ChartOfAccounts>" }
if ($chartOfAccounts) { X "$i<ChartOfAccounts>$(Esc-Xml $chartOfAccounts)</ChartOfAccounts>" }
else { X "$i<ChartOfAccounts/>" }
$correspondence = if ($def.correspondence -eq $true) { "true" } else { "false" }
@@ -2917,19 +2962,23 @@ function Emit-AccountingRegisterProperties {
$periodAdjLen = if ($null -ne $def.periodAdjustmentLength) { "$($def.periodAdjustmentLength)" } else { "0" }
X "$i<PeriodAdjustmentLength>$periodAdjLen</PeriodAdjustmentLength>"
X "$i<IncludeHelpInContents>false</IncludeHelpInContents>"
Emit-FormRef $i "DefaultListForm" $def.defaultListForm
Emit-FormRef $i "AuxiliaryListForm" $def.auxiliaryListForm
Emit-StandardAttributes $i "AccountingRegister"
$dataLockControlMode = Get-EnumProp "DataLockControlMode" "dataLockControlMode" "Automatic"
X "$i<DataLockControlMode>$dataLockControlMode</DataLockControlMode>"
$enableTotalsSplitting = if ($def.enableTotalsSplitting -eq $false) { "false" } else { "true" }
X "$i<EnableTotalsSplitting>$enableTotalsSplitting</EnableTotalsSplitting>"
$fullTextSearch = Get-EnumProp "FullTextSearch" "fullTextSearch" "Use"
X "$i<FullTextSearch>$fullTextSearch</FullTextSearch>"
X "$i<ListPresentation/>"
X "$i<ExtendedListPresentation/>"
X "$i<Explanation/>"
Emit-MLText $i "ListPresentation" $def.listPresentation
Emit-MLText $i "ExtendedListPresentation" $def.extendedListPresentation
Emit-MLText $i "Explanation" $def.explanation
}
# Стандартные ТЧ Плана видов расчёта: Ведущие/Вытесняющие/Базовые виды расчёта. Обёртка платформенно-константна
@@ -3049,14 +3098,11 @@ function Emit-CalculationRegisterProperties {
X "$i<Name>$(Esc-Xml $objName)</Name>"
Emit-MLText $i "Synonym" $synonym
X "$i<Comment/>"
X "$i<UseStandardCommands>true</UseStandardCommands>"
X "$i<DefaultListForm/>"
X "$i<AuxiliaryListForm/>"
$chartOfCalcTypes = if ($def.chartOfCalculationTypes) { "$($def.chartOfCalculationTypes)" } else { "" }
if ($chartOfCalcTypes) { X "$i<ChartOfCalculationTypes>$chartOfCalcTypes</ChartOfCalculationTypes>" }
else { X "$i<ChartOfCalculationTypes/>" }
if ($def.comment) { X "$i<Comment>$(Esc-XmlText "$($def.comment)")</Comment>" } else { X "$i<Comment/>" }
$useStdCmd = if (Get-BoolProp "useStandardCommands" $true) { "true" } else { "false" }
X "$i<UseStandardCommands>$useStdCmd</UseStandardCommands>"
Emit-FormRef $i "DefaultListForm" $def.defaultListForm
Emit-FormRef $i "AuxiliaryListForm" $def.auxiliaryListForm
$periodicity = Get-EnumProp "InformationRegisterPeriodicity" "periodicity" "Month"
X "$i<Periodicity>$periodicity</Periodicity>"
@@ -3068,15 +3114,20 @@ function Emit-CalculationRegisterProperties {
X "$i<BasePeriod>$basePeriod</BasePeriod>"
$schedule = if ($def.schedule) { "$($def.schedule)" } else { "" }
if ($schedule) { X "$i<Schedule>$schedule</Schedule>" } else { X "$i<Schedule/>" }
if ($schedule) { X "$i<Schedule>$(Esc-Xml $schedule)</Schedule>" } else { X "$i<Schedule/>" }
$scheduleValue = if ($def.scheduleValue) { "$($def.scheduleValue)" } else { "" }
if ($scheduleValue) { X "$i<ScheduleValue>$scheduleValue</ScheduleValue>" } else { X "$i<ScheduleValue/>" }
if ($scheduleValue) { X "$i<ScheduleValue>$(Esc-Xml $scheduleValue)</ScheduleValue>" } else { X "$i<ScheduleValue/>" }
$scheduleDate = if ($def.scheduleDate) { "$($def.scheduleDate)" } else { "" }
if ($scheduleDate) { X "$i<ScheduleDate>$scheduleDate</ScheduleDate>" } else { X "$i<ScheduleDate/>" }
if ($scheduleDate) { X "$i<ScheduleDate>$(Esc-Xml $scheduleDate)</ScheduleDate>" } else { X "$i<ScheduleDate/>" }
X "$i<IncludeHelpInContents>false</IncludeHelpInContents>"
$chartOfCalcTypes = if ($def.chartOfCalculationTypes) { "$($def.chartOfCalculationTypes)" } else { "" }
if ($chartOfCalcTypes) { X "$i<ChartOfCalculationTypes>$(Esc-Xml $chartOfCalcTypes)</ChartOfCalculationTypes>" }
else { X "$i<ChartOfCalculationTypes/>" }
$inclHelp = if (Get-BoolProp "includeHelpInContents" $false) { "true" } else { "false" }
X "$i<IncludeHelpInContents>$inclHelp</IncludeHelpInContents>"
Emit-StandardAttributes $i "CalculationRegister"
@@ -3086,9 +3137,9 @@ function Emit-CalculationRegisterProperties {
$fullTextSearch = Get-EnumProp "FullTextSearch" "fullTextSearch" "Use"
X "$i<FullTextSearch>$fullTextSearch</FullTextSearch>"
X "$i<ListPresentation/>"
X "$i<ExtendedListPresentation/>"
X "$i<Explanation/>"
Emit-MLText $i "ListPresentation" $def.listPresentation
Emit-MLText $i "ExtendedListPresentation" $def.extendedListPresentation
Emit-MLText $i "Explanation" $def.explanation
}
# --- 13e. Wave 5: BusinessProcess, Task ---
@@ -3698,12 +3749,11 @@ if ($objType -in @("InformationRegister","AccumulationRegister","AccountingRegis
if ($dims.Count -gt 0 -or $resources.Count -gt 0 -or $regAttrs.Count -gt 0 -or $regCommands.Count -gt 0) {
$hasChildren = $true
X "`t`t<ChildObjects>"
# InformationRegister.Attribute supports FillFromFillingValue/FillValue/DataHistory;
# AccumulationRegister/AccountingRegister/CalculationRegister.Attribute do NOT.
$regCtx = if ($objType -eq "InformationRegister") { "register-info" } else { "register-other" }
# InformationRegister/AccumulationRegister: ресурсы/измерения — через богатый Emit-Attribute (общий слой
# object-свойств). Прочие регистры (Accounting/Calculation) — легаси Emit-Resource/Emit-Dimension (пока не портированы).
$dimResCtx = switch ($objType) { "InformationRegister" { "register-info" } "AccumulationRegister" { "register-accum" } default { $null } }
# InformationRegister.Attribute supports FillFromFillingValue/FillValue/DataHistory; прочие — нет.
# CalculationRegister.Attribute несёт <ScheduleLink> → отдельный контекст register-calc.
$regCtx = switch ($objType) { "InformationRegister" { "register-info" } "CalculationRegister" { "register-calc" } default { "register-other" } }
# Все семейства регистров: ресурсы/измерения — через богатый Emit-Attribute (общий слой object-свойств).
$dimResCtx = switch ($objType) { "InformationRegister" { "register-info" } "AccumulationRegister" { "register-accum" } "CalculationRegister" { "register-calc" } "AccountingRegister" { "register-account" } default { $null } }
foreach ($r in $resources) {
if ($dimResCtx) { Emit-Attribute "`t`t`t" $r $dimResCtx "Resource" }
else { Emit-Resource "`t`t`t" $r $objType }
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# meta-compile v1.46 — Compile 1C metadata object from JSON
# meta-compile v1.47 — Compile 1C metadata object from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
@@ -870,6 +870,11 @@ def parse_attribute_shorthand(val):
'mainFilter': val.get('mainFilter') is True,
'denyIncompleteValues': val.get('denyIncompleteValues') is True,
'useInTotals': (val.get('useInTotals') is True) if val.get('useInTotals') is not None else True,
'baseDimension': val.get('baseDimension') is True,
'scheduleLink': val.get('scheduleLink'),
'balance': val.get('balance') is True,
'accountingFlag': val.get('accountingFlag'),
'extDimensionAccountingFlag': val.get('extDimensionAccountingFlag'),
}
def parse_enum_value_shorthand(val):
@@ -1106,7 +1111,17 @@ def emit_standard_attribute(indent, attr_name, ov=None):
efmt = ov.get('EditFormat')
chi = ov.get('ChoiceHistoryOnInput', 'Auto')
X(f'{indent}<xr:StandardAttribute name="{attr_name}">')
X(f'{indent}\t<xr:LinkByType/>')
# LinkByType стандартного реквизита (напр. ExtDimensionN→Account у регистра бухгалтерии). DataPath verbatim.
lbt = ov.get('LinkByType')
if lbt:
lbt_dp = str(lbt.get('dataPath')) if isinstance(lbt, dict) else str(lbt)
lbt_li = lbt.get('linkItem', 0) if isinstance(lbt, dict) else 0
X(f'{indent}\t<xr:LinkByType>')
X(f'{indent}\t\t<xr:DataPath>{esc_xml(lbt_dp)}</xr:DataPath>')
X(f'{indent}\t\t<xr:LinkItem>{lbt_li}</xr:LinkItem>')
X(f'{indent}\t</xr:LinkByType>')
else:
X(f'{indent}\t<xr:LinkByType/>')
X(f'{indent}\t<xr:FillChecking>{fc}</xr:FillChecking>')
X(f'{indent}\t<xr:MultiLine>false</xr:MultiLine>')
X(f'{indent}\t<xr:FillFromFillingValue>{ffv}</xr:FillFromFillingValue>')
@@ -1201,6 +1216,8 @@ def emit_standard_attributes(indent, object_type):
ov['EditFormat'] = d['editFormat']
if d.get('choiceForm'):
ov['ChoiceForm'] = str(d['choiceForm'])
if d.get('linkByType') is not None:
ov['LinkByType'] = d['linkByType']
emit_standard_attribute(f'{indent}\t', a, ov)
X(f'{indent}</StandardAttributes>')
@@ -1681,10 +1698,10 @@ def emit_attribute(indent, parsed, context, elem_tag='Attribute'):
emit_min_max_value(f'{indent}\t\t', 'MaxValue', parsed.get('maxValue'))
# FillFromFillingValue / FillValue — not for tabular/processor/chart/register-other
# (Chart*, AccumulationRegister/AccountingRegister/CalculationRegister don't support these)
if context not in ('tabular', 'processor', 'chart', 'register-other', 'register-accum'):
if context not in ('tabular', 'processor', 'chart', 'register-other', 'register-accum', 'register-calc', 'register-account'):
ffv = 'true' if (parsed.get('fillFromFillingValue') is True or (elem_tag == 'Dimension' and 'master' in parsed.get('flags', []))) else 'false'
X(f'{indent}\t\t<FillFromFillingValue>{ffv}</FillFromFillingValue>')
if context not in ('tabular', 'processor', 'chart', 'register-other', 'register-accum'):
if context not in ('tabular', 'processor', 'chart', 'register-other', 'register-accum', 'register-calc', 'register-account'):
emit_fill_value(f'{indent}\t\t', type_str, parsed.get('fillValue'), parsed.get('hasFillValue'))
fill_checking = 'DontCheck'
if 'req' in parsed.get('flags', []):
@@ -1713,13 +1730,41 @@ def emit_attribute(indent, parsed, context, elem_tag='Attribute'):
if elem_tag == 'Dimension' and context == 'register-accum':
deny_incomplete = 'true' if (parsed.get('denyIncompleteValues') is True or 'denyincomplete' in parsed.get('flags', [])) else 'false'
X(f'{indent}\t\t<DenyIncompleteValues>{deny_incomplete}</DenyIncompleteValues>')
# Измерение регистра расчёта: DenyIncompleteValues + BaseDimension.
if elem_tag == 'Dimension' and context == 'register-calc':
deny_incomplete = 'true' if (parsed.get('denyIncompleteValues') is True or 'denyincomplete' in parsed.get('flags', [])) else 'false'
base_dimension = 'true' if (parsed.get('baseDimension') is True or 'base' in parsed.get('flags', [])) else 'false'
X(f'{indent}\t\t<DenyIncompleteValues>{deny_incomplete}</DenyIncompleteValues>')
X(f'{indent}\t\t<BaseDimension>{base_dimension}</BaseDimension>')
# Регистр расчёта: ScheduleLink у измерений и реквизитов (НЕ ресурсов), перед Indexing. Дефолт пустой.
if context == 'register-calc' and elem_tag in ('Dimension', 'Attribute'):
if parsed.get('scheduleLink'):
X(f'{indent}\t\t<ScheduleLink>{esc_xml(str(parsed["scheduleLink"]))}</ScheduleLink>')
else:
X(f'{indent}\t\t<ScheduleLink/>')
# Измерение/ресурс регистра бухгалтерии: Balance + AccountingFlag, затем DenyIncompleteValues (изм.) / ExtDimensionAccountingFlag (рес.).
if context == 'register-account' and elem_tag in ('Dimension', 'Resource'):
balance = 'true' if (parsed.get('balance') is True or 'balance' in parsed.get('flags', [])) else 'false'
X(f'{indent}\t\t<Balance>{balance}</Balance>')
if parsed.get('accountingFlag'):
X(f'{indent}\t\t<AccountingFlag>{esc_xml(str(parsed["accountingFlag"]))}</AccountingFlag>')
else:
X(f'{indent}\t\t<AccountingFlag/>')
if elem_tag == 'Dimension':
deny_incomplete = 'true' if (parsed.get('denyIncompleteValues') is True or 'denyincomplete' in parsed.get('flags', [])) else 'false'
X(f'{indent}\t\t<DenyIncompleteValues>{deny_incomplete}</DenyIncompleteValues>')
else:
if parsed.get('extDimensionAccountingFlag'):
X(f'{indent}\t\t<ExtDimensionAccountingFlag>{esc_xml(str(parsed["extDimensionAccountingFlag"]))}</ExtDimensionAccountingFlag>')
else:
X(f'{indent}\t\t<ExtDimensionAccountingFlag/>')
if context == 'catalog':
X(f'{indent}\t\t<Use>{parsed.get("use") or "ForItem"}</Use>')
if context not in ('processor', 'processor-tabular'):
# Признаки учёта ПС (account-flag) не имеют <Indexing>/<FullTextSearch>, но имеют <DataHistory>.
if context != 'account-flag':
# Ресурс регистра накопления НЕ имеет <Indexing> (только <FullTextSearch>); измерение/реквизит — имеют.
if not (context == 'register-accum' and elem_tag == 'Resource'):
if not (context in ('register-accum', 'register-calc', 'register-account') and elem_tag == 'Resource'):
indexing = 'DontIndex'
if 'index' in parsed.get('flags', []):
indexing = 'Index'
@@ -1734,7 +1779,7 @@ def emit_attribute(indent, parsed, context, elem_tag='Attribute'):
use_in_totals = 'false' if (parsed.get('useInTotals') is False or 'nouseintotals' in parsed.get('flags', [])) else 'true'
X(f'{indent}\t\t<UseInTotals>{use_in_totals}</UseInTotals>')
# DataHistory — not for Chart* types and non-InformationRegister register family
if context not in ('chart', 'register-other', 'register-accum'):
if context not in ('chart', 'register-other', 'register-accum', 'register-calc', 'register-account'):
X(f'{indent}\t\t<DataHistory>{parsed.get("dataHistory") or "Use"}</DataHistory>')
X(f'{indent}\t</Properties>')
X(f'{indent}</{elem_tag}>')
@@ -2802,28 +2847,32 @@ def emit_accounting_register_properties(indent):
i = indent
X(f'{i}<Name>{esc_xml(obj_name)}</Name>')
emit_mltext(i, 'Synonym', synonym)
X(f'{i}<Comment/>')
X(f'{i}<UseStandardCommands>true</UseStandardCommands>')
X(f'{i}<DefaultListForm/>')
X(f'{i}<AuxiliaryListForm/>')
if defn.get('comment'):
X(f'{i}<Comment>{esc_xml_text(str(defn["comment"]))}</Comment>')
else:
X(f'{i}<Comment/>')
X(f'{i}<UseStandardCommands>{"true" if get_bool_prop("useStandardCommands", True) else "false"}</UseStandardCommands>')
X(f'{i}<IncludeHelpInContents>{"true" if get_bool_prop("includeHelpInContents", False) else "false"}</IncludeHelpInContents>')
chart_of_accounts = str(defn['chartOfAccounts']) if defn.get('chartOfAccounts') else ''
if chart_of_accounts:
X(f'{i}<ChartOfAccounts>{chart_of_accounts}</ChartOfAccounts>')
X(f'{i}<ChartOfAccounts>{esc_xml(chart_of_accounts)}</ChartOfAccounts>')
else:
X(f'{i}<ChartOfAccounts/>')
correspondence = 'true' if defn.get('correspondence') is True else 'false'
X(f'{i}<Correspondence>{correspondence}</Correspondence>')
period_adj_len = str(defn['periodAdjustmentLength']) if defn.get('periodAdjustmentLength') is not None else '0'
X(f'{i}<PeriodAdjustmentLength>{period_adj_len}</PeriodAdjustmentLength>')
X(f'{i}<IncludeHelpInContents>false</IncludeHelpInContents>')
emit_form_ref(i, 'DefaultListForm', defn.get('defaultListForm'))
emit_form_ref(i, 'AuxiliaryListForm', defn.get('auxiliaryListForm'))
emit_standard_attributes(i, 'AccountingRegister')
data_lock_control_mode = get_enum_prop('DataLockControlMode', 'dataLockControlMode', 'Automatic')
X(f'{i}<DataLockControlMode>{data_lock_control_mode}</DataLockControlMode>')
X(f'{i}<EnableTotalsSplitting>{"false" if defn.get("enableTotalsSplitting") is False else "true"}</EnableTotalsSplitting>')
full_text_search = get_enum_prop('FullTextSearch', 'fullTextSearch', 'Use')
X(f'{i}<FullTextSearch>{full_text_search}</FullTextSearch>')
X(f'{i}<ListPresentation/>')
X(f'{i}<ExtendedListPresentation/>')
X(f'{i}<Explanation/>')
emit_mltext(i, 'ListPresentation', defn.get('listPresentation'))
emit_mltext(i, 'ExtendedListPresentation', defn.get('extendedListPresentation'))
emit_mltext(i, 'Explanation', defn.get('explanation'))
# Стандартные ТЧ ПВР: Ведущие/Вытесняющие/Базовые виды расчёта (обёртка платформенно-константна, пустой lang;
# вложены Predefined/CalculationType(ShowError)/LineNumber).
@@ -2925,15 +2974,13 @@ def emit_calculation_register_properties(indent):
i = indent
X(f'{i}<Name>{esc_xml(obj_name)}</Name>')
emit_mltext(i, 'Synonym', synonym)
X(f'{i}<Comment/>')
X(f'{i}<UseStandardCommands>true</UseStandardCommands>')
X(f'{i}<DefaultListForm/>')
X(f'{i}<AuxiliaryListForm/>')
chart_of_calc_types = str(defn['chartOfCalculationTypes']) if defn.get('chartOfCalculationTypes') else ''
if chart_of_calc_types:
X(f'{i}<ChartOfCalculationTypes>{chart_of_calc_types}</ChartOfCalculationTypes>')
if defn.get('comment'):
X(f'{i}<Comment>{esc_xml_text(str(defn["comment"]))}</Comment>')
else:
X(f'{i}<ChartOfCalculationTypes/>')
X(f'{i}<Comment/>')
X(f'{i}<UseStandardCommands>{"true" if get_bool_prop("useStandardCommands", True) else "false"}</UseStandardCommands>')
emit_form_ref(i, 'DefaultListForm', defn.get('defaultListForm'))
emit_form_ref(i, 'AuxiliaryListForm', defn.get('auxiliaryListForm'))
periodicity = get_enum_prop('InformationRegisterPeriodicity', 'periodicity', 'Month')
X(f'{i}<Periodicity>{periodicity}</Periodicity>')
action_period = 'true' if defn.get('actionPeriod') is True else 'false'
@@ -2942,28 +2989,33 @@ def emit_calculation_register_properties(indent):
X(f'{i}<BasePeriod>{base_period}</BasePeriod>')
schedule = str(defn['schedule']) if defn.get('schedule') else ''
if schedule:
X(f'{i}<Schedule>{schedule}</Schedule>')
X(f'{i}<Schedule>{esc_xml(schedule)}</Schedule>')
else:
X(f'{i}<Schedule/>')
schedule_value = str(defn['scheduleValue']) if defn.get('scheduleValue') else ''
if schedule_value:
X(f'{i}<ScheduleValue>{schedule_value}</ScheduleValue>')
X(f'{i}<ScheduleValue>{esc_xml(schedule_value)}</ScheduleValue>')
else:
X(f'{i}<ScheduleValue/>')
schedule_date = str(defn['scheduleDate']) if defn.get('scheduleDate') else ''
if schedule_date:
X(f'{i}<ScheduleDate>{schedule_date}</ScheduleDate>')
X(f'{i}<ScheduleDate>{esc_xml(schedule_date)}</ScheduleDate>')
else:
X(f'{i}<ScheduleDate/>')
X(f'{i}<IncludeHelpInContents>false</IncludeHelpInContents>')
chart_of_calc_types = str(defn['chartOfCalculationTypes']) if defn.get('chartOfCalculationTypes') else ''
if chart_of_calc_types:
X(f'{i}<ChartOfCalculationTypes>{esc_xml(chart_of_calc_types)}</ChartOfCalculationTypes>')
else:
X(f'{i}<ChartOfCalculationTypes/>')
X(f'{i}<IncludeHelpInContents>{"true" if get_bool_prop("includeHelpInContents", False) else "false"}</IncludeHelpInContents>')
emit_standard_attributes(i, 'CalculationRegister')
data_lock_control_mode = get_enum_prop('DataLockControlMode', 'dataLockControlMode', 'Automatic')
X(f'{i}<DataLockControlMode>{data_lock_control_mode}</DataLockControlMode>')
full_text_search = get_enum_prop('FullTextSearch', 'fullTextSearch', 'Use')
X(f'{i}<FullTextSearch>{full_text_search}</FullTextSearch>')
X(f'{i}<ListPresentation/>')
X(f'{i}<ExtendedListPresentation/>')
X(f'{i}<Explanation/>')
emit_mltext(i, 'ListPresentation', defn.get('listPresentation'))
emit_mltext(i, 'ExtendedListPresentation', defn.get('extendedListPresentation'))
emit_mltext(i, 'Explanation', defn.get('explanation'))
def emit_business_process_properties(indent):
i = indent
@@ -3503,12 +3555,12 @@ if obj_type in ('InformationRegister', 'AccumulationRegister', 'AccountingRegist
if dims or resources or reg_attrs or reg_commands:
has_children = True
X('\t\t<ChildObjects>')
# InformationRegister.Attribute supports FillFromFillingValue/FillValue/DataHistory;
# AccumulationRegister/AccountingRegister/CalculationRegister.Attribute do NOT.
reg_ctx = 'register-info' if obj_type == 'InformationRegister' else 'register-other'
# InformationRegister/AccumulationRegister: ресурсы/измерения — через богатый emit_attribute (общий слой
# object-свойств). Прочие регистры (Accounting/Calculation) — легаси emit_resource/emit_dimension (не портированы).
dim_res_ctx = {'InformationRegister': 'register-info', 'AccumulationRegister': 'register-accum'}.get(obj_type)
# InformationRegister.Attribute несёт FillFromFillingValue/FillValue/DataHistory; CalculationRegister.Attribute
# несёт <ScheduleLink> (register-calc); прочие — register-other.
reg_ctx = {'InformationRegister': 'register-info', 'CalculationRegister': 'register-calc'}.get(obj_type, 'register-other')
# Все семейства регистров: ресурсы/измерения — через богатый emit_attribute (общий слой object-свойств).
dim_res_ctx = {'InformationRegister': 'register-info', 'AccumulationRegister': 'register-accum',
'CalculationRegister': 'register-calc', 'AccountingRegister': 'register-account'}.get(obj_type)
for r in resources:
if dim_res_ctx:
emit_attribute('\t\t\t', r, dim_res_ctx, 'Resource')
@@ -1,4 +1,4 @@
# meta-decompile v0.38 — XML объекта метаданных 1С → JSON-черновик формата meta-compile
# meta-decompile v0.39 — XML объекта метаданных 1С → JSON-черновик формата meta-compile
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
#
# Поддержаны: Catalog, ExchangePlan, ChartOfCharacteristicTypes, ChartOfAccounts, ChartOfCalculationTypes, Document. Инверс meta-compile (omit-on-default: ключ эмитим только
@@ -91,8 +91,8 @@ foreach ($c in $rootEl.ChildNodes) { if ($c.NodeType -eq 'Element') { $objNode =
if (-not $objNode) { [Console]::Error.WriteLine("meta-decompile: пустой MetaDataObject"); exit 3 }
$objType = $objNode.LocalName
if ($objType -notin @('Catalog', 'ExchangePlan', 'ChartOfCharacteristicTypes', 'ChartOfAccounts', 'ChartOfCalculationTypes', 'Document', 'InformationRegister', 'AccumulationRegister')) {
[Console]::Error.WriteLine("meta-decompile: тип '$objType' пока не поддержан (Catalog, ExchangePlan, ChartOfCharacteristicTypes, ChartOfAccounts, ChartOfCalculationTypes, Document, InformationRegister, AccumulationRegister)"); exit 3
if ($objType -notin @('Catalog', 'ExchangePlan', 'ChartOfCharacteristicTypes', 'ChartOfAccounts', 'ChartOfCalculationTypes', 'Document', 'InformationRegister', 'AccumulationRegister', 'AccountingRegister', 'CalculationRegister')) {
[Console]::Error.WriteLine("meta-decompile: тип '$objType' пока не поддержан (Catalog, ExchangePlan, ChartOfCharacteristicTypes, ChartOfAccounts, ChartOfCalculationTypes, Document, InformationRegister, AccumulationRegister, AccountingRegister, CalculationRegister)"); exit 3
}
$props = $objNode.SelectSingleNode('md:Properties', $nsm)
@@ -298,6 +298,11 @@ function Attr-ToDsl {
$v = & $en 'MainFilter'; if ($v -eq 'true') { $extra['mainFilter'] = $true }
$v = & $en 'DenyIncompleteValues'; if ($v -eq 'true') { $extra['denyIncompleteValues'] = $true }
$v = & $en 'UseInTotals'; if ($v -eq 'false') { $extra['useInTotals'] = $false } # дефолт true → захват при false
$v = & $en 'BaseDimension'; if ($v -eq 'true') { $extra['baseDimension'] = $true }
$v = & $en 'ScheduleLink'; if ($v) { $extra['scheduleLink'] = $v } # ссылка на измерение графика (пустой → пропуск)
$v = & $en 'Balance'; if ($v -eq 'true') { $extra['balance'] = $true }
$v = & $en 'AccountingFlag'; if ($v) { $extra['accountingFlag'] = $v } # ссылка на признак учёта ПС (пустой → пропуск)
$v = & $en 'ExtDimensionAccountingFlag'; if ($v) { $extra['extDimensionAccountingFlag'] = $v }
# MinValue/MaxValue — граница диапазона (omit при nil). Тип сохраняем: xs:string→строка, xs:decimal→число.
foreach ($mm in @('MinValue','MaxValue')) {
$mn = $ap.SelectSingleNode("md:$mm", $nsm)
@@ -522,6 +527,23 @@ if ($objType -eq 'AccumulationRegister') {
Add-EnumProp 'registerType' 'RegisterType' 'Balance'
Add-BoolProp 'enableTotalsSplitting' 'EnableTotalsSplitting' $true
}
# AccountingRegister-специфичные свойства: ПС-связь, корреспонденция, коррекция периода, разделение итогов.
if ($objType -eq 'AccountingRegister') {
$coa = P 'ChartOfAccounts'; if ($coa) { $dsl['chartOfAccounts'] = $coa }
Add-BoolProp 'correspondence' 'Correspondence' $false
Add-IntProp 'periodAdjustmentLength' 'PeriodAdjustmentLength' 0
Add-BoolProp 'enableTotalsSplitting' 'EnableTotalsSplitting' $true
}
# CalculationRegister-специфичные свойства: ПВР-связь, периоды расчёта, график (все ссылки/enum — verbatim).
if ($objType -eq 'CalculationRegister') {
$cct = P 'ChartOfCalculationTypes'; if ($cct) { $dsl['chartOfCalculationTypes'] = $cct }
Add-EnumProp 'periodicity' 'Periodicity' 'Month'
Add-BoolProp 'actionPeriod' 'ActionPeriod' $false
Add-BoolProp 'basePeriod' 'BasePeriod' $false
$sch = P 'Schedule'; if ($sch) { $dsl['schedule'] = $sch }
$schv = P 'ScheduleValue'; if ($schv) { $dsl['scheduleValue'] = $schv }
$schd = P 'ScheduleDate'; if ($schd) { $dsl['scheduleDate'] = $schd }
}
# Короткая форма поля: <Type>.<Name>.StandardAttribute.X / .Attribute.X → StandardAttribute.X / Attribute.X
# (Expand-DataPath компилятора разворачивает частичную форму обратно — dogfood резолвера).
@@ -705,12 +727,22 @@ if ($saNode) {
$saCf = $sa.SelectSingleNode('xr:ChoiceForm', $nsm); if ($saCf -and $saCf.InnerText) { $ov['choiceForm'] = $saCf.InnerText }
$saCpl = Parse-ChoiceParameterLinks $sa 'xr:ChoiceParameterLinks'; if ($null -ne $saCpl) { $ov['choiceParameterLinks'] = $saCpl }
$saCp = Parse-ChoiceParameters $sa 'xr:ChoiceParameters'; if ($null -ne $saCp) { $ov['choiceParameters'] = $saCp }
# LinkByType стандартного реквизита (ExtDimensionN→Account у регистра бухгалтерии). DataPath полный verbatim.
$saLbt = $sa.SelectSingleNode('xr:LinkByType', $nsm)
if ($saLbt) {
$saLbtDp = $saLbt.SelectSingleNode('xr:DataPath', $nsm)
if ($saLbtDp -and $saLbtDp.InnerText) {
$saLbtLi = $saLbt.SelectSingleNode('xr:LinkItem', $nsm)
$li = if ($saLbtLi -and $saLbtLi.InnerText) { [int]$saLbtLi.InnerText } else { 0 }
$ov['linkByType'] = [ordered]@{ dataPath = $saLbtDp.InnerText; linkItem = $li }
}
}
# Доп./опциональный реквизит (не в фикс-списке) — эмитим по присутствию даже без отклонений.
if ($ov.Count -gt 0 -or ($stdFixed -notcontains $an)) { $saMap[$an] = $ov }
}
# Условный тип (Catalog): пустой $saMap = триггер блока. Не-условный (ExchangePlan): блок и так эмитится → пустой не пишем.
if ($saMap.Count -gt 0 -or ($stdConditionalTypes -contains $objType)) { $dsl['standardAttributes'] = $saMap }
} elseif ($objType -in @('InformationRegister', 'AccumulationRegister')) {
} elseif ($objType -in @('InformationRegister', 'AccumulationRegister', 'AccountingRegister', 'CalculationRegister')) {
# Регистр опускает all-default блок стандартных реквизитов (~5-9%, правило не выводимо) — компилятор эмитит его
# по дефолту, поэтому отсутствие фиксируем opt-out `standardAttributes:""` (дом-конвенция суппресса).
$dsl['standardAttributes'] = ''
+31
View File
@@ -854,6 +854,37 @@ choiceParameters/indexing/fullTextSearch/dataHistory/…, см. §34). При
Признаки измерения — флаги shorthand (`denyIncomplete`, `nouseintotals`) ЛИБО object-ключи (`denyIncompleteValues`,
`useInTotals`: bool, дефолт true). Ресурс РН НЕ имеет `<Indexing>` (только `<FullTextSearch>`).
### 7.6a AccountingRegister (Регистр бухгалтерии)
| Поле JSON | Умолчание | XML элемент |
|-----------|----------|-------------|
| `chartOfAccounts` | пусто | ChartOfAccounts (MDObjectRef `ChartOfAccounts.X`) |
| `correspondence` | `false` | Correspondence (bool) |
| `periodAdjustmentLength` | `0` | PeriodAdjustmentLength (int) |
| `enableTotalsSplitting` | `true` | EnableTotalsSplitting |
| `dataLockControlMode` | `Automatic` | DataLockControlMode |
| общие (comment/useStandardCommands/includeHelpInContents/defaultListForm/auxiliaryListForm/презентации ML) | — | — |
| `dimensions` / `resources` / `attributes` / `commands` | `[]` | → ChildObjects |
Измерения/ресурсы РБ несут `balance` (bool), `accountingFlag` (ссылка `ChartOfAccounts.X.AccountingFlag.Y`);
ресурсы дополнительно `extDimensionAccountingFlag`, измерения — `denyIncompleteValues`. Стандартные реквизиты
ExtDimension1..N связаны с Account через `linkByType` (в блоке `standardAttributes`, §7.1.1; DataPath полный).
### 7.6b CalculationRegister (Регистр расчёта)
| Поле JSON | Умолчание | XML элемент |
|-----------|----------|-------------|
| `chartOfCalculationTypes` | пусто | ChartOfCalculationTypes (ссылка) |
| `periodicity` | `Month` | Periodicity |
| `actionPeriod` / `basePeriod` | `false` | ActionPeriod / BasePeriod (bool) |
| `schedule` / `scheduleValue` / `scheduleDate` | пусто | Schedule* (ссылки на регистр-график и его поля) |
| `dataLockControlMode` | `Automatic` | DataLockControlMode |
| общие (comment/useStandardCommands/includeHelpInContents/defaultListForm/auxiliaryListForm/презентации ML) | — | — |
| `dimensions` / `resources` / `attributes` / `commands` | `[]` | → ChildObjects |
Измерения РР несут `denyIncompleteValues`, `baseDimension` (bool), `scheduleLink` (ссылка на измерение графика);
реквизиты — `scheduleLink`; ресурсы — только `<FullTextSearch>` (без Indexing).
### 7.7 DefinedType
| Поле JSON | Умолчание | XML элемент |
@@ -41,12 +41,12 @@
</Synonym>
<Comment/>
<UseStandardCommands>true</UseStandardCommands>
<DefaultListForm/>
<AuxiliaryListForm/>
<IncludeHelpInContents>false</IncludeHelpInContents>
<ChartOfAccounts>ChartOfAccounts.Хозрасчетный</ChartOfAccounts>
<Correspondence>true</Correspondence>
<PeriodAdjustmentLength>0</PeriodAdjustmentLength>
<IncludeHelpInContents>false</IncludeHelpInContents>
<DefaultListForm/>
<AuxiliaryListForm/>
<StandardAttributes>
<xr:StandardAttribute name="Active">
<xr:LinkByType/>
@@ -180,6 +180,7 @@
</xr:StandardAttribute>
</StandardAttributes>
<DataLockControlMode>Automatic</DataLockControlMode>
<EnableTotalsSplitting>true</EnableTotalsSplitting>
<FullTextSearch>Use</FullTextSearch>
<ListPresentation/>
<ExtendedListPresentation/>
@@ -223,6 +224,10 @@
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
<Balance>false</Balance>
<AccountingFlag/>
<ExtDimensionAccountingFlag/>
<FullTextSearch>Use</FullTextSearch>
</Properties>
</Resource>
<Dimension uuid="UUID-017">
@@ -257,6 +262,9 @@
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
<Balance>false</Balance>
<AccountingFlag/>
<DenyIncompleteValues>false</DenyIncompleteValues>
<Indexing>DontIndex</Indexing>
<FullTextSearch>Use</FullTextSearch>
</Properties>
@@ -43,13 +43,13 @@
<UseStandardCommands>true</UseStandardCommands>
<DefaultListForm/>
<AuxiliaryListForm/>
<ChartOfCalculationTypes>ChartOfCalculationTypes.ВидыНачислений</ChartOfCalculationTypes>
<Periodicity>Month</Periodicity>
<ActionPeriod>false</ActionPeriod>
<BasePeriod>false</BasePeriod>
<Schedule/>
<ScheduleValue/>
<ScheduleDate/>
<ChartOfCalculationTypes>ChartOfCalculationTypes.ВидыНачислений</ChartOfCalculationTypes>
<IncludeHelpInContents>false</IncludeHelpInContents>
<StandardAttributes>
<xr:StandardAttribute name="Active">
@@ -253,6 +253,7 @@
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
<FullTextSearch>Use</FullTextSearch>
</Properties>
</Resource>
<Resource uuid="UUID-017">
@@ -292,6 +293,7 @@
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
<FullTextSearch>Use</FullTextSearch>
</Properties>
</Resource>
<Dimension uuid="UUID-018">
@@ -326,6 +328,9 @@
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
<DenyIncompleteValues>false</DenyIncompleteValues>
<BaseDimension>false</BaseDimension>
<ScheduleLink/>
<Indexing>DontIndex</Indexing>
<FullTextSearch>Use</FullTextSearch>
</Properties>
@@ -366,6 +371,7 @@
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
<ScheduleLink/>
<Indexing>DontIndex</Indexing>
<FullTextSearch>Use</FullTextSearch>
</Properties>