mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-13 22:35:16 +03:00
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:
@@ -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'] = ''
|
||||
|
||||
@@ -854,6 +854,37 @@ choiceParameters/indexing/fullTextSearch/dataHistory/…, см. §3–4). При
|
||||
Признаки измерения — флаги 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 элемент |
|
||||
|
||||
+11
-3
@@ -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>
|
||||
|
||||
+7
-1
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user