From 126ce0bbd86917d664b5ceeb804f634275ea3e21 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 5 Jul 2026 22:42:36 +0300 Subject: [PATCH] =?UTF-8?q?feat(meta-compile,meta-decompile):=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B0=20=D1=82=D0=B8?= =?UTF-8?q?=D0=BF=D0=B0=20ChartOfCalculationTypes=20(=D0=9F=D0=BB=D0=B0?= =?UTF-8?q?=D0=BD=20=D0=B2=D0=B8=D0=B4=D0=BE=D0=B2=20=D1=80=D0=B0=D1=81?= =?UTF-8?q?=D1=87=D1=91=D1=82=D0=B0)=20(v1.41/v0.30)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Пятый тип раундтрипа (после Catalog/EP/ПВХ/ПС). Корпус — 5 дампов 8.3.24. Декомпилятор: снят гейт +ПВР; дефолты codeLength 5, descriptionLength 100, codeAllowedLength Variable, dataLockControlMode Automatic; спец-свойства dependenceOnCalculationTypes/baseCalculationTypes(список)/ actionPeriodUse + DataHistory-триплет; профиль StandardAttributes ПВР; захват предопределённых видов расчёта. Компилятор: Emit-ChartOfCalculationTypesProperties переписан на общие хелперы в каноническом порядке (был устаревший хардкод). Три платформенно-константные стандартные ТЧ (Leading/Displacing/Base CalculationTypes — обёртка Synonym пустой-lang «…виды расчета», вложенный CalculationType→FillChecking= ShowError). StandardAttributes-профиль условный (Наименование→ShowError; ActionPeriodIsBasic в фикс-списке между DeletionMark и Description). Characteristics (есть у ПВР — между StandardAttributes и std-ТЧ). Контекст реквизита = account (общий с ПС: как catalog, но без ). BaseCalculationTypes — прощающий ввод ПланВидовРасчета.X → ChartOfCalculationTypes.X. Предопределённые виды расчёта — плоские (Name/Code/Description/ActionPeriodIsBase): строка "(Код) Имя [Наим]" ЛИБО объект с actionPeriodIsBase. Emit-PredefCalcType/Build-PredefinedCalcTypeXml + декомпилятор PredefCalcType-ToDsl. Роундтрип 5/5 match, TOTAL 621→0. Регресс 47/47 ps1+py, ps1↔py identical. 1С-cert ✓ (base self-ref + предопределённые). spec §7.2d, кейс chart-of-calculation-types. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../meta-compile/scripts/meta-compile.ps1 | 181 +++++-- .../meta-compile/scripts/meta-compile.py | 164 ++++-- .../meta-decompile/scripts/meta-decompile.ps1 | 56 +- docs/meta-dsl-spec.md | 63 ++- .../chart-of-calculation-types.json | 16 +- .../ВидыНачислений.xml | 489 +++++++++++------- .../ВидыНачислений/Ext/Predefined.xml | 15 + 7 files changed, 646 insertions(+), 338 deletions(-) create mode 100644 tests/skills/cases/meta-compile/snapshots/chart-of-calculation-types/ChartsOfCalculationTypes/ВидыНачислений/Ext/Predefined.xml diff --git a/.claude/skills/meta-compile/scripts/meta-compile.ps1 b/.claude/skills/meta-compile/scripts/meta-compile.ps1 index 19145e8c..1fff40a8 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.ps1 +++ b/.claude/skills/meta-compile/scripts/meta-compile.ps1 @@ -1,4 +1,4 @@ -# meta-compile v1.40 — Compile 1C metadata object from JSON +# meta-compile v1.41 — Compile 1C metadata object from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -1022,7 +1022,7 @@ $script:standardAttributesByType = @{ "CalculationRegister" = @("Active","Recorder","LineNumber","RegistrationPeriod","CalculationType","ReversingEntry") "ChartOfAccounts" = @("PredefinedDataName","Order","OffBalance","Type","Description","Code","Parent","Predefined","DeletionMark","Ref") "ChartOfCharacteristicTypes" = @("PredefinedDataName","Predefined","Ref","DeletionMark","Description","Code","Parent","ValueType") - "ChartOfCalculationTypes" = @("PredefinedDataName","Predefined","Ref","DeletionMark","Description","Code","ActionPeriodIsBasic") + "ChartOfCalculationTypes" = @("PredefinedDataName","Predefined","Ref","DeletionMark","ActionPeriodIsBasic","Description","Code") "BusinessProcess" = @("Ref","DeletionMark","Date","Number","Started","Completed","HeadTask") "Task" = @("Ref","DeletionMark","Date","Number","Executed","Description","RoutePoint","BusinessProcess") "ExchangePlan" = @("Ref","DeletionMark","Code","Description","ThisNode","SentNo","ReceivedNo") @@ -1056,6 +1056,10 @@ $script:stdAttrProfile = @{ "Code" = @{ FillChecking = "ShowError" } "Parent" = @{ FillFromFillingValue = "true" } } + # ChartOfCalculationTypes: Наименование → FillChecking=ShowError (Код здесь DontCheck). + "ChartOfCalculationTypes" = @{ + "Description" = @{ FillChecking = "ShowError" } + } } # $ov — hashtable переопределений (профиль + DSL) для полей: FillChecking, FillFromFillingValue, @@ -1116,7 +1120,7 @@ function Emit-StandardAttribute { # Прочие типы (не в множестве) → блок эмитится всегда (текущее поведение, пока их правило не выведено). # - stdAttrProfile[тип]: профиль материализованного блока (пусто = schema-дефолт), поверх — DSL-override. # Миграция типа = добавить его в stdAttrConditionalTypes + stdAttrProfile и переснять снэпшоты; КОД НЕ ТРОГАЕМ. -$script:stdAttrConditionalTypes = @('Catalog', 'ExchangePlan', 'ChartOfCharacteristicTypes', 'ChartOfAccounts') +$script:stdAttrConditionalTypes = @('Catalog', 'ExchangePlan', 'ChartOfCharacteristicTypes', 'ChartOfAccounts', 'ChartOfCalculationTypes') function Emit-StandardAttributes { param([string]$indent, [string]$objectType) $attrs = $script:standardAttributesByType[$objectType] @@ -2888,82 +2892,115 @@ function Emit-AccountingRegisterProperties { X "$i" } +# Стандартные ТЧ Плана видов расчёта: Ведущие/Вытесняющие/Базовые виды расчёта. Обёртка платформенно-константна +# (Synonym с пустым lang, Comment/ToolTip/FillChecking); вложены Predefined/CalculationType(ShowError)/LineNumber. +$script:calcTypesStdTabular = @( + @{ name = "LeadingCalculationTypes"; synonym = "Ведущие виды расчета" } + @{ name = "DisplacingCalculationTypes"; synonym = "Вытесняющие виды расчета" } + @{ name = "BaseCalculationTypes"; synonym = "Базовые виды расчета" } +) +function Emit-CalcTypesStdTabular { + param([string]$i) + X "$i" + foreach ($sts in $script:calcTypesStdTabular) { + X "$i`t" + X "$i`t`t" + X "$i`t`t`t" + X "$i`t`t`t`t" + X "$i`t`t`t`t$(Esc-XmlText $sts.synonym)" + X "$i`t`t`t" + X "$i`t`t" + X "$i`t`t" + X "$i`t`t" + X "$i`t`tDontCheck" + X "$i`t`t" + foreach ($stAttr in @("Predefined","CalculationType","LineNumber")) { + $stOv = if ($stAttr -eq "CalculationType") { @{ FillChecking = "ShowError" } } else { $null } + Emit-StandardAttribute "$i`t`t`t" $stAttr $stOv + } + X "$i`t`t" + X "$i`t" + } + X "$i" +} + function Emit-ChartOfCalculationTypesProperties { param([string]$indent) $i = $indent X "$i$(Esc-Xml $objName)" Emit-MLText $i "Synonym" $synonym - X "$i" - X "$itrue" - - $codeLength = if ($null -ne $def.codeLength) { "$($def.codeLength)" } else { "9" } - $descriptionLength = if ($null -ne $def.descriptionLength) { "$($def.descriptionLength)" } else { "25" } - $codeType = Get-EnumProp "CodeType" "codeType" "String" - $codeAllowedLength = Get-EnumProp "CodeAllowedLength" "codeAllowedLength" "Variable" + if ($def.comment) { X "$i$(Esc-XmlText "$($def.comment)")" } else { X "$i" } + $useStdCmd = if (Get-BoolProp "useStandardCommands" $true) { "true" } else { "false" } + X "$i$useStdCmd" + $codeLength = if ($null -ne $def.codeLength) { "$($def.codeLength)" } else { "5" } + $descriptionLength = if ($null -ne $def.descriptionLength) { "$($def.descriptionLength)" } else { "100" } X "$i$codeLength" - X "$i$codeType" - X "$i$codeAllowedLength" X "$i$descriptionLength" - X "$iAsDescription" + X "$i$(Get-EnumProp 'CodeType' 'codeType' 'String')" + X "$i$(Get-EnumProp 'CodeAllowedLength' 'codeAllowedLength' 'Variable')" + X "$i$(Get-EnumProp 'DefaultPresentation' 'defaultPresentation' 'AsDescription')" + X "$i$(Get-EnumProp 'EditType' 'editType' 'InDialog')" + $quickChoice = if ($def.quickChoice -eq $true) { "true" } else { "false" } + X "$i$quickChoice" + X "$i$(Get-EnumProp 'ChoiceMode' 'choiceMode' 'BothWays')" - $dependence = Get-EnumProp "DependenceOnCalculationTypes" "dependenceOnCalculationTypes" "DontUse" - X "$i$dependence" + # InputByString: override ЛИБО дефолт [Descr при D>0]+[Code при C>0]. + if (Test-DefKey 'inputByString') { + $ibFields = @($def.inputByString | ForEach-Object { Expand-DataPath "$_" }) + } else { + $ibFields = @() + if ([int]$descriptionLength -gt 0) { $ibFields += "ChartOfCalculationTypes.$objName.StandardAttribute.Description" } + if ([int]$codeLength -gt 0) { $ibFields += "ChartOfCalculationTypes.$objName.StandardAttribute.Code" } + } + Emit-FieldBlock $i "InputByString" $ibFields + X "$i$(Get-EnumProp 'SearchStringModeOnInputByString' 'searchStringModeOnInputByString' 'Begin')" + X "$iDontUse" + X "$iDirectly" + X "$i$(Get-EnumProp 'CreateOnInput' 'createOnInput' 'DontUse')" + X "$i$(Get-EnumProp 'ChoiceHistoryOnInput' 'choiceHistoryOnInput' 'Auto')" + Emit-FormRef $i "DefaultObjectForm" $def.defaultObjectForm + Emit-FormRef $i "DefaultListForm" $def.defaultListForm + Emit-FormRef $i "DefaultChoiceForm" $def.defaultChoiceForm + Emit-FormRef $i "AuxiliaryObjectForm" $def.auxiliaryObjectForm + Emit-FormRef $i "AuxiliaryListForm" $def.auxiliaryListForm + Emit-FormRef $i "AuxiliaryChoiceForm" $def.auxiliaryChoiceForm + Emit-BasedOn $i $def.basedOn - # BaseCalculationTypes - $baseTypes = @() - if ($def.baseCalculationTypes) { $baseTypes = @($def.baseCalculationTypes) } + X "$i$(Get-EnumProp 'DependenceOnCalculationTypes' 'dependenceOnCalculationTypes' 'DontUse')" + # BaseCalculationTypes — список ссылок на ПВР (прощающий ввод ПланВидовРасчета.X → ChartOfCalculationTypes.X). + $baseTypes = @(); if ($def.baseCalculationTypes) { $baseTypes = @($def.baseCalculationTypes | ForEach-Object { Resolve-TypePrefixSyn "$_" }) } if ($baseTypes.Count -gt 0) { X "$i" - foreach ($bt in $baseTypes) { - X "$i`t$bt" - } + foreach ($bt in $baseTypes) { X "$i`t$(Esc-Xml $bt)" } X "$i" - } else { - X "$i" - } - + } else { X "$i" } $actionPeriodUse = if ($def.actionPeriodUse -eq $true) { "true" } else { "false" } X "$i$actionPeriodUse" Emit-StandardAttributes $i "ChartOfCalculationTypes" - X "$i" - X "$iAuto" - X "$iInDialog" - $quickChoice = if ($def.quickChoice -eq $true) { "true" } else { "false" } - X "$i$quickChoice" - X "$iBothWays" - X "$i" - X "$i`tChartOfCalculationTypes.$objName.StandardAttribute.Description" - X "$i`tChartOfCalculationTypes.$objName.StandardAttribute.Code" - X "$i" - X "$iBegin" - X "$iDontUse" - X "$iDirectly" - X "$i" - X "$i" - X "$i" - X "$i" - X "$i" - X "$i" - X "$ifalse" - X "$i" - X "$i" + Emit-Characteristics $i $def.characteristics + Emit-CalcTypesStdTabular $i - $dataLockControlMode = Get-EnumProp "DataLockControlMode" "dataLockControlMode" "Automatic" - X "$i$dataLockControlMode" - - $fullTextSearch = Get-EnumProp "FullTextSearch" "fullTextSearch" "Use" - X "$i$fullTextSearch" + X "$i$(Get-EnumProp 'PredefinedDataUpdate' 'predefinedDataUpdate' 'Auto')" + $inclHelp = if (Get-BoolProp "includeHelpInContents" $false) { "true" } else { "false" } + X "$i$inclHelp" + $dlFields = if (Test-DefKey 'dataLockFields') { @($def.dataLockFields | ForEach-Object { Expand-DataPath "$_" }) } else { @() } + Emit-FieldBlock $i "DataLockFields" $dlFields + X "$i$(Get-EnumProp 'DataLockControlMode' 'dataLockControlMode' 'Automatic')" + X "$i$(Get-EnumProp 'FullTextSearch' 'fullTextSearch' 'Use')" Emit-MLText $i "ObjectPresentation" $def.objectPresentation Emit-MLText $i "ExtendedObjectPresentation" $def.extendedObjectPresentation Emit-MLText $i "ListPresentation" $def.listPresentation Emit-MLText $i "ExtendedListPresentation" $def.extendedListPresentation Emit-MLText $i "Explanation" $def.explanation - X "$iDontUse" - X "$iAuto" + X "$i$(Get-EnumProp 'DataHistory' 'dataHistory' 'DontUse')" + $updDH = if (Get-BoolProp "updateDataHistoryImmediatelyAfterWrite" $false) { "true" } else { "false" } + X "$i$updDH" + $execDH = if (Get-BoolProp "executeAfterWriteDataHistoryVersionProcessing" $false) { "true" } else { "false" } + X "$i$execDH" } function Emit-CalculationRegisterProperties { @@ -3539,8 +3576,7 @@ if ($objType -in $typesWithAttrTS) { "Document" { "document" } { $_ -in @("DataProcessor","Report") } { "processor" } "ChartOfCharacteristicTypes" { "catalog" } # реквизиты ПВХ структурно как у справочника (Use/FillFromFillingValue/DataHistory) - "ChartOfAccounts" { "account" } # как catalog, но БЕЗ (реквизиты ПС не иерархичны как справочник) - "ChartOfCalculationTypes" { "chart" } + { $_ -in @("ChartOfAccounts","ChartOfCalculationTypes") } { "account" } # как catalog, но БЕЗ (реквизиты ПС/ПВР не иерархичны как справочник) default { "object" } } foreach ($a in $attrs) { @@ -3895,6 +3931,33 @@ function Build-PredefinedAccountXml { return $sb.ToString() } +# --- Предопределённые ВИДЫ РАСЧЁТА (плоские: Name/Code/Description/ActionPeriodIsBase). Строка "(Код) Имя [Наим]" +# ЛИБО объект {name, code, description, actionPeriodIsBase}. --- +function Emit-PredefCalcType { + param($sb, $val, [string]$indent) + $r = Resolve-PredefItem $val + $apib = 'false' + if ($val -isnot [string]) { + $apibV = & $script:predefAccGet $val @('actionPeriodIsBase','периодДействияБазовый') + if ($apibV -eq $true) { $apib = 'true' } + } + [void]$sb.Append("$indent`n") + [void]$sb.Append("$indent`t$(Esc-XmlText $r.name)`n") + if (-not $r.code) { [void]$sb.Append("$indent`t`n") } else { [void]$sb.Append("$indent`t$(Esc-XmlText $r.code)`n") } + if ($r.desc -eq '') { [void]$sb.Append("$indent`t`n") } else { [void]$sb.Append("$indent`t$(Esc-XmlText $r.desc)`n") } + [void]$sb.Append("$indent`t$apib`n") + [void]$sb.Append("$indent`n") +} +function Build-PredefinedCalcTypeXml { + param($items) + $sb = New-Object System.Text.StringBuilder + [void]$sb.Append("`n") + [void]$sb.Append("`n") + foreach ($it in $items) { Emit-PredefCalcType $sb $it "`t" } + [void]$sb.Append("`n") + return $sb.ToString() +} + $extDir = Join-Path $objSubDir "Ext" if (-not (Test-Path $typeDir)) { @@ -4005,6 +4068,12 @@ if ($objType -eq 'ChartOfAccounts' -and $def.predefined -and @($def.predefined). $predefPath = Join-Path $extDir "Predefined.xml" [System.IO.File]::WriteAllText($predefPath, $predefXml, $enc) $modulesCreated += $predefPath +} elseif ($objType -eq 'ChartOfCalculationTypes' -and $def.predefined -and @($def.predefined).Count -gt 0) { + Ensure-ExtDir + $predefXml = Build-PredefinedCalcTypeXml @($def.predefined) + $predefPath = Join-Path $extDir "Predefined.xml" + [System.IO.File]::WriteAllText($predefPath, $predefXml, $enc) + $modulesCreated += $predefPath } elseif ($predefRootByType.ContainsKey($objType) -and $def.predefined -and @($def.predefined).Count -gt 0) { Ensure-ExtDir $catCodeType = if ($def.codeType) { "$($def.codeType)" } else { 'String' } diff --git a/.claude/skills/meta-compile/scripts/meta-compile.py b/.claude/skills/meta-compile/scripts/meta-compile.py index d2f0f5d3..d7338c45 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.py +++ b/.claude/skills/meta-compile/scripts/meta-compile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# meta-compile v1.40 — Compile 1C metadata object from JSON +# meta-compile v1.41 — Compile 1C metadata object from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -1041,7 +1041,7 @@ standard_attributes_by_type = { 'CalculationRegister': ['Active', 'Recorder', 'LineNumber', 'RegistrationPeriod', 'CalculationType', 'ReversingEntry'], 'ChartOfAccounts': ['PredefinedDataName', 'Order', 'OffBalance', 'Type', 'Description', 'Code', 'Parent', 'Predefined', 'DeletionMark', 'Ref'], 'ChartOfCharacteristicTypes': ['PredefinedDataName', 'Predefined', 'Ref', 'DeletionMark', 'Description', 'Code', 'Parent', 'ValueType'], - 'ChartOfCalculationTypes': ['PredefinedDataName', 'Predefined', 'Ref', 'DeletionMark', 'Description', 'Code', 'ActionPeriodIsBasic'], + 'ChartOfCalculationTypes': ['PredefinedDataName', 'Predefined', 'Ref', 'DeletionMark', 'ActionPeriodIsBasic', 'Description', 'Code'], 'BusinessProcess': ['Ref', 'DeletionMark', 'Date', 'Number', 'Started', 'Completed', 'HeadTask'], 'Task': ['Ref', 'DeletionMark', 'Date', 'Number', 'Executed', 'Description', 'RoutePoint', 'BusinessProcess'], 'ExchangePlan': ['Ref', 'DeletionMark', 'Code', 'Description', 'ThisNode', 'SentNo', 'ReceivedNo'], @@ -1071,6 +1071,10 @@ std_attr_profile = { 'Code': {'FillChecking': 'ShowError'}, 'Parent': {'FillFromFillingValue': 'true'}, }, + # ChartOfCalculationTypes: Наименование → FillChecking=ShowError (Код здесь DontCheck). + 'ChartOfCalculationTypes': { + 'Description': {'FillChecking': 'ShowError'}, + }, } # ov — dict переопределений (профиль + DSL): FillChecking, FillFromFillingValue, Synonym, @@ -1136,7 +1140,7 @@ def emit_standard_attribute(indent, attr_name, ov=None): # Единый эмиттер блока StandardAttributes — поведение правят ДАННЫЕ, не форк кода (см. коммент в .ps1). # std_attr_conditional_types: типы, где блок только при кастомизации (DSL-ключ standardAttributes). # Прочие типы → блок всегда (текущее поведение). Миграция типа = +строчка в оба справочника + снэпшоты. -std_attr_conditional_types = {'Catalog', 'ExchangePlan', 'ChartOfCharacteristicTypes', 'ChartOfAccounts'} +std_attr_conditional_types = {'Catalog', 'ExchangePlan', 'ChartOfCharacteristicTypes', 'ChartOfAccounts', 'ChartOfCalculationTypes'} def emit_standard_attributes(indent, object_type): attrs = standard_attributes_by_type.get(object_type) if not attrs: @@ -2765,67 +2769,101 @@ def emit_accounting_register_properties(indent): X(f'{i}') X(f'{i}') +# Стандартные ТЧ ПВР: Ведущие/Вытесняющие/Базовые виды расчёта (обёртка платформенно-константна, пустой lang; +# вложены Predefined/CalculationType(ShowError)/LineNumber). +CALC_TYPES_STD_TABULAR = [ + ('LeadingCalculationTypes', 'Ведущие виды расчета'), + ('DisplacingCalculationTypes', 'Вытесняющие виды расчета'), + ('BaseCalculationTypes', 'Базовые виды расчета'), +] +def emit_calc_types_std_tabular(i): + X(f'{i}') + for name, syn in CALC_TYPES_STD_TABULAR: + X(f'{i}\t') + X(f'{i}\t\t') + X(f'{i}\t\t\t') + X(f'{i}\t\t\t\t') + X(f'{i}\t\t\t\t{esc_xml_text(syn)}') + X(f'{i}\t\t\t') + X(f'{i}\t\t') + X(f'{i}\t\t') + X(f'{i}\t\t') + X(f'{i}\t\tDontCheck') + X(f'{i}\t\t') + for st_attr in ('Predefined', 'CalculationType', 'LineNumber'): + st_ov = {'FillChecking': 'ShowError'} if st_attr == 'CalculationType' else None + emit_standard_attribute(f'{i}\t\t\t', st_attr, st_ov) + X(f'{i}\t\t') + X(f'{i}\t') + X(f'{i}') + def emit_chart_of_calculation_types_properties(indent): i = indent X(f'{i}{esc_xml(obj_name)}') emit_mltext(i, 'Synonym', synonym) - X(f'{i}') - X(f'{i}true') - code_length = str(defn['codeLength']) if defn.get('codeLength') is not None else '9' - description_length = str(defn['descriptionLength']) if defn.get('descriptionLength') is not None else '25' - code_type = get_enum_prop('CodeType', 'codeType', 'String') - code_allowed_length = get_enum_prop('CodeAllowedLength', 'codeAllowedLength', 'Variable') + if defn.get('comment'): + X(f'{i}{esc_xml_text(str(defn["comment"]))}') + else: + X(f'{i}') + X(f'{i}{"true" if get_bool_prop("useStandardCommands", True) else "false"}') + code_length = str(defn['codeLength']) if defn.get('codeLength') is not None else '5' + description_length = str(defn['descriptionLength']) if defn.get('descriptionLength') is not None else '100' X(f'{i}{code_length}') - X(f'{i}{code_type}') - X(f'{i}{code_allowed_length}') X(f'{i}{description_length}') - X(f'{i}AsDescription') - dependence = get_enum_prop('DependenceOnCalculationTypes', 'dependenceOnCalculationTypes', 'DontUse') - X(f'{i}{dependence}') - base_types = list(defn.get('baseCalculationTypes', [])) + X(f'{i}{get_enum_prop("CodeType", "codeType", "String")}') + X(f'{i}{get_enum_prop("CodeAllowedLength", "codeAllowedLength", "Variable")}') + X(f'{i}{get_enum_prop("DefaultPresentation", "defaultPresentation", "AsDescription")}') + X(f'{i}{get_enum_prop("EditType", "editType", "InDialog")}') + X(f'{i}{"true" if defn.get("quickChoice") is True else "false"}') + X(f'{i}{get_enum_prop("ChoiceMode", "choiceMode", "BothWays")}') + if 'inputByString' in defn: + ib_fields = [expand_data_path(str(x)) for x in (defn.get('inputByString') or [])] + else: + ib_fields = [] + if int(description_length) > 0: + ib_fields.append(f'ChartOfCalculationTypes.{obj_name}.StandardAttribute.Description') + if int(code_length) > 0: + ib_fields.append(f'ChartOfCalculationTypes.{obj_name}.StandardAttribute.Code') + emit_field_block(i, 'InputByString', ib_fields) + X(f'{i}{get_enum_prop("SearchStringModeOnInputByString", "searchStringModeOnInputByString", "Begin")}') + X(f'{i}DontUse') + X(f'{i}Directly') + X(f'{i}{get_enum_prop("CreateOnInput", "createOnInput", "DontUse")}') + X(f'{i}{get_enum_prop("ChoiceHistoryOnInput", "choiceHistoryOnInput", "Auto")}') + emit_form_ref(i, 'DefaultObjectForm', defn.get('defaultObjectForm')) + emit_form_ref(i, 'DefaultListForm', defn.get('defaultListForm')) + emit_form_ref(i, 'DefaultChoiceForm', defn.get('defaultChoiceForm')) + emit_form_ref(i, 'AuxiliaryObjectForm', defn.get('auxiliaryObjectForm')) + emit_form_ref(i, 'AuxiliaryListForm', defn.get('auxiliaryListForm')) + emit_form_ref(i, 'AuxiliaryChoiceForm', defn.get('auxiliaryChoiceForm')) + emit_based_on(i, defn.get('basedOn')) + X(f'{i}{get_enum_prop("DependenceOnCalculationTypes", "dependenceOnCalculationTypes", "DontUse")}') + base_types = [resolve_type_prefix_syn(str(x)) for x in defn.get('baseCalculationTypes', [])] if base_types: X(f'{i}') for bt in base_types: - X(f'{i}\t{bt}') + X(f'{i}\t{esc_xml(bt)}') X(f'{i}') else: X(f'{i}') - action_period_use = 'true' if defn.get('actionPeriodUse') is True else 'false' - X(f'{i}{action_period_use}') + X(f'{i}{"true" if defn.get("actionPeriodUse") is True else "false"}') emit_standard_attributes(i, 'ChartOfCalculationTypes') - X(f'{i}') - X(f'{i}Auto') - X(f'{i}InDialog') - quick_choice = 'true' if defn.get('quickChoice') is True else 'false' - X(f'{i}{quick_choice}') - X(f'{i}BothWays') - X(f'{i}') - X(f'{i}\tChartOfCalculationTypes.{obj_name}.StandardAttribute.Description') - X(f'{i}\tChartOfCalculationTypes.{obj_name}.StandardAttribute.Code') - X(f'{i}') - X(f'{i}Begin') - X(f'{i}DontUse') - X(f'{i}Directly') - X(f'{i}') - X(f'{i}') - X(f'{i}') - X(f'{i}') - X(f'{i}') - X(f'{i}') - X(f'{i}false') - X(f'{i}') - X(f'{i}') - data_lock_control_mode = get_enum_prop('DataLockControlMode', 'dataLockControlMode', 'Automatic') - X(f'{i}{data_lock_control_mode}') - full_text_search = get_enum_prop('FullTextSearch', 'fullTextSearch', 'Use') - X(f'{i}{full_text_search}') + emit_characteristics(i, defn.get('characteristics')) + emit_calc_types_std_tabular(i) + X(f'{i}{get_enum_prop("PredefinedDataUpdate", "predefinedDataUpdate", "Auto")}') + X(f'{i}{"true" if get_bool_prop("includeHelpInContents", False) else "false"}') + dl_fields = [expand_data_path(str(x)) for x in defn.get('dataLockFields', [])] if 'dataLockFields' in defn else [] + emit_field_block(i, 'DataLockFields', dl_fields) + X(f'{i}{get_enum_prop("DataLockControlMode", "dataLockControlMode", "Automatic")}') + X(f'{i}{get_enum_prop("FullTextSearch", "fullTextSearch", "Use")}') emit_mltext(i, 'ObjectPresentation', defn.get('objectPresentation')) emit_mltext(i, 'ExtendedObjectPresentation', defn.get('extendedObjectPresentation')) emit_mltext(i, 'ListPresentation', defn.get('listPresentation')) emit_mltext(i, 'ExtendedListPresentation', defn.get('extendedListPresentation')) emit_mltext(i, 'Explanation', defn.get('explanation')) - X(f'{i}DontUse') - X(f'{i}Auto') + X(f'{i}{get_enum_prop("DataHistory", "dataHistory", "DontUse")}') + X(f'{i}{"true" if get_bool_prop("updateDataHistoryImmediatelyAfterWrite", False) else "false"}') + X(f'{i}{"true" if get_bool_prop("executeAfterWriteDataHistoryVersionProcessing", False) else "false"}') def emit_calculation_register_properties(indent): i = indent @@ -3345,10 +3383,8 @@ if obj_type in types_with_attr_ts: context = 'processor' elif obj_type == 'ChartOfCharacteristicTypes': context = 'catalog' # реквизиты ПВХ структурно как у справочника (Use/FillFromFillingValue/DataHistory) - elif obj_type == 'ChartOfAccounts': - context = 'account' # как catalog, но БЕЗ (реквизиты ПС не иерархичны как справочник) - elif obj_type == 'ChartOfCalculationTypes': - context = 'chart' + elif obj_type in ('ChartOfAccounts', 'ChartOfCalculationTypes'): + context = 'account' # как catalog, но БЕЗ (реквизиты ПС/ПВР не иерархичны как справочник) else: context = 'object' for a in attrs: @@ -3751,6 +3787,28 @@ def build_predefined_account_xml(items, obj_nm, acct_flag_names, ext_dim_flag_na out.append('') return '\n'.join(out) + '\n' +# Предопределённые ВИДЫ РАСЧЁТА (плоские: Name/Code/Description/ActionPeriodIsBase). +def emit_predef_calc_type(out, val, indent): + r = resolve_predef_item(val) + apib = 'false' + if not isinstance(val, str): + if _predef_acc_get(val, ('actionPeriodIsBase', 'периодДействияБазовый')) is True: + apib = 'true' + out.append(f'{indent}') + out.append(f'{indent}\t{esc_xml_text(r["name"])}') + out.append(f'{indent}\t' if not r['code'] else f'{indent}\t{esc_xml_text(r["code"])}') + out.append(f'{indent}\t' if r['desc'] == '' else f'{indent}\t{esc_xml_text(r["desc"])}') + out.append(f'{indent}\t{apib}') + out.append(f'{indent}') + +def build_predefined_calc_type_xml(items): + out = [''] + out.append(f'') + for it in items: + emit_predef_calc_type(out, it, '\t') + out.append('') + return '\n'.join(out) + '\n' + # Special files if obj_type == 'ExchangePlan': content_path = os.path.join(ext_dir, 'Content.xml') @@ -3780,6 +3838,12 @@ if obj_type == 'ChartOfAccounts' and defn.get('predefined'): predef_path = os.path.join(ext_dir, 'Predefined.xml') write_utf8_bom(predef_path, predef_xml) modules_created.append(predef_path) +elif obj_type == 'ChartOfCalculationTypes' and defn.get('predefined'): + ensure_ext_dir() + predef_xml = build_predefined_calc_type_xml(defn['predefined']) + predef_path = os.path.join(ext_dir, 'Predefined.xml') + write_utf8_bom(predef_path, predef_xml) + modules_created.append(predef_path) elif obj_type in predef_root_by_type and defn.get('predefined'): ensure_ext_dir() cat_code_type = str(defn['codeType']) if defn.get('codeType') else 'String' diff --git a/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 b/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 index ed0b2187..eac519dd 100644 --- a/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 +++ b/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 @@ -1,4 +1,4 @@ -# meta-decompile v0.29 — XML объекта метаданных 1С → JSON-черновик формата meta-compile +# meta-decompile v0.30 — XML объекта метаданных 1С → JSON-черновик формата meta-compile # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # # Поддержаны: Catalog, ExchangePlan, ChartOfCharacteristicTypes, ChartOfAccounts. Инверс 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')) { - [Console]::Error.WriteLine("meta-decompile: тип '$objType' пока не поддержан (Catalog, ExchangePlan, ChartOfCharacteristicTypes, ChartOfAccounts)"); exit 3 +if ($objType -notin @('Catalog', 'ExchangePlan', 'ChartOfCharacteristicTypes', 'ChartOfAccounts', 'ChartOfCalculationTypes')) { + [Console]::Error.WriteLine("meta-decompile: тип '$objType' пока не поддержан (Catalog, ExchangePlan, ChartOfCharacteristicTypes, ChartOfAccounts, ChartOfCalculationTypes)"); exit 3 } $props = $objNode.SelectSingleNode('md:Properties', $nsm) @@ -392,13 +392,14 @@ if ($ownersNode) { } Add-EnumProp 'subordinationUse' 'SubordinationUse' 'ToItems' # Тип-зависимые дефолты (компилятор задаёт их по типу — декомпилятор обязан зеркалить, иначе omit ≠ значению). -$descrLenDef = switch ($objType) { 'ExchangePlan' { 150 } 'ChartOfCharacteristicTypes' { 100 } default { 25 } } +$descrLenDef = switch ($objType) { 'ExchangePlan' { 150 } 'ChartOfCharacteristicTypes' { 100 } 'ChartOfCalculationTypes' { 100 } default { 25 } } +$codeLenDef = if ($objType -eq 'ChartOfCalculationTypes') { 5 } else { 9 } $createInpDef = if ($objType -eq 'Catalog') { 'Use' } else { 'DontUse' } -$dataLockDef = if ($objType -in @('Catalog', 'ChartOfAccounts')) { 'Automatic' } else { 'Managed' } +$dataLockDef = if ($objType -in @('Catalog', 'ChartOfAccounts', 'ChartOfCalculationTypes')) { 'Automatic' } else { 'Managed' } $codeSeriesDef = switch ($objType) { 'ChartOfCharacteristicTypes' { 'WholeCharacteristicKind' } 'ChartOfAccounts' { 'WholeChartOfAccounts' } default { 'WholeCatalog' } } $checkUniqueDef = ($objType -in @('ChartOfCharacteristicTypes', 'ChartOfAccounts')) # ПВХ/ПС дефолт true, Catalog false $defPresDef = if ($objType -eq 'ChartOfAccounts') { 'AsCode' } else { 'AsDescription' } # ПС по умолчанию AsCode -Add-IntProp 'codeLength' 'CodeLength' 9 +Add-IntProp 'codeLength' 'CodeLength' $codeLenDef Add-IntProp 'descriptionLength' 'DescriptionLength' $descrLenDef Add-EnumProp 'codeType' 'CodeType' 'String' Add-EnumProp 'codeAllowedLength' 'CodeAllowedLength' 'Variable' @@ -450,6 +451,20 @@ if ($objType -eq 'ChartOfAccounts') { Add-BoolProp 'updateDataHistoryImmediatelyAfterWrite' 'UpdateDataHistoryImmediatelyAfterWrite' $false Add-BoolProp 'executeAfterWriteDataHistoryVersionProcessing' 'ExecuteAfterWriteDataHistoryVersionProcessing' $false } +# ChartOfCalculationTypes-специфичные свойства. +if ($objType -eq 'ChartOfCalculationTypes') { + Add-EnumProp 'dependenceOnCalculationTypes' 'DependenceOnCalculationTypes' 'DontUse' + Add-BoolProp 'actionPeriodUse' 'ActionPeriodUse' $false + # BaseCalculationTypes — список ссылок на ПВР (omit-on-empty, verbatim). + $bctNode = $props.SelectSingleNode('md:BaseCalculationTypes', $nsm) + if ($bctNode) { + $bctItems = @($bctNode.SelectNodes('xr:Item', $nsm) | ForEach-Object { $_.InnerText }) + if ($bctItems.Count -gt 0) { $dsl['baseCalculationTypes'] = [System.Collections.ArrayList]@($bctItems) } + } + Add-EnumProp 'dataHistory' 'DataHistory' 'DontUse' + Add-BoolProp 'updateDataHistoryImmediatelyAfterWrite' 'UpdateDataHistoryImmediatelyAfterWrite' $false + Add-BoolProp 'executeAfterWriteDataHistoryVersionProcessing' 'ExecuteAfterWriteDataHistoryVersionProcessing' $false +} # Короткая форма поля: ..StandardAttribute.X / .Attribute.X → StandardAttribute.X / Attribute.X # (Expand-DataPath компилятора разворачивает частичную форму обратно — dogfood резолвера). @@ -575,6 +590,9 @@ $stdProfileByType = @{ 'Code' = @{ fillChecking = 'ShowError' } 'Parent' = @{ fillFromFillingValue = $true } } + 'ChartOfCalculationTypes' = @{ + 'Description' = @{ fillChecking = 'ShowError' } + } } $catStdProfile = if ($stdProfileByType.ContainsKey($objType)) { $stdProfileByType[$objType] } else { @{} } # Фикс-список стандартных реквизитов типа (зеркало standardAttributesByType компилятора) — чтобы отличать @@ -584,11 +602,12 @@ $stdFixedByType = @{ 'ExchangePlan' = @('Ref','DeletionMark','Code','Description','ThisNode','SentNo','ReceivedNo') 'ChartOfCharacteristicTypes' = @('PredefinedDataName','Predefined','Ref','DeletionMark','Description','Code','Parent','ValueType') 'ChartOfAccounts' = @('PredefinedDataName','Order','OffBalance','Type','Description','Code','Parent','Predefined','DeletionMark','Ref') + 'ChartOfCalculationTypes' = @('PredefinedDataName','Predefined','Ref','DeletionMark','ActionPeriodIsBasic','Description','Code') } $stdFixed = if ($stdFixedByType.ContainsKey($objType)) { $stdFixedByType[$objType] } else { @() } # Условные типы: блок эмитим-как-триггер даже пустым (материализуется при отклонении ≥1 реквизита от schema-default; # у ExchangePlan это почти всегда — Description/Code=ShowError; редкий all-default EP блок опускает). -$stdConditionalTypes = @('Catalog', 'ExchangePlan', 'ChartOfCharacteristicTypes', 'ChartOfAccounts') +$stdConditionalTypes = @('Catalog', 'ExchangePlan', 'ChartOfCharacteristicTypes', 'ChartOfAccounts', 'ChartOfCalculationTypes') $saNode = $props.SelectSingleNode('md:StandardAttributes', $nsm) if ($saNode) { $saMap = [ordered]@{} @@ -847,9 +866,32 @@ if (Test-Path -LiteralPath $predefPath) { return $o } + # Предопределённые ВИДЫ РАСЧЁТА (плоские): Name/Code/Description/ActionPeriodIsBase. Строка при + # ActionPeriodIsBase=false, объект — при true. + function PredefCalcType-ToDsl { + param($itemEl) + $name = ($itemEl.SelectSingleNode("*[local-name()='Name']")).InnerText + $codeEl = $itemEl.SelectSingleNode("*[local-name()='Code']"); $code = if ($codeEl -and $codeEl.InnerText) { $codeEl.InnerText } else { '' } + $descEl = $itemEl.SelectSingleNode("*[local-name()='Description']"); $desc = if ($descEl) { $descEl.InnerText } else { '' } + $apibEl = $itemEl.SelectSingleNode("*[local-name()='ActionPeriodIsBase']"); $apib = ($apibEl -and $apibEl.InnerText -eq 'true') + $auto = Split-CamelWords $name + if (-not $apib) { + $s = if ($code) { "($code) $name" } else { $name } + if ($desc -eq '') { $s = "$s []" } elseif ($desc -cne $auto) { $s = "$s [$desc]" } + return $s + } + $o = [ordered]@{ name = $name } + if ($code) { $o['code'] = $code } + if ($desc -cne $auto) { $o['description'] = $desc } + $o['actionPeriodIsBase'] = $true + return $o + } + $rootItems = [System.Collections.ArrayList]@() if ($objType -eq 'ChartOfAccounts') { foreach ($it in @($pdoc.DocumentElement.SelectNodes("*[local-name()='Item']"))) { [void]$rootItems.Add((PredefAccount-ToDsl $it)) } + } elseif ($objType -eq 'ChartOfCalculationTypes') { + foreach ($it in @($pdoc.DocumentElement.SelectNodes("*[local-name()='Item']"))) { [void]$rootItems.Add((PredefCalcType-ToDsl $it)) } } else { foreach ($it in @($pdoc.DocumentElement.SelectNodes("*[local-name()='Item']"))) { [void]$rootItems.Add((PredefItem-ToDsl $it)) } } diff --git a/docs/meta-dsl-spec.md b/docs/meta-dsl-spec.md index 80cd3aa2..1291444b 100644 --- a/docs/meta-dsl-spec.md +++ b/docs/meta-dsl-spec.md @@ -716,6 +716,41 @@ Split-CamelCase имени. ] ``` +### 7.2d ChartOfCalculationTypes (План видов расчёта) + +Ссылочный тип видов расчёта (без иерархии/владельцев). Общий с Catalog слой: `synonym`, `comment`, +`useStandardCommands`, `includeHelpInContents`, коды (`codeLength`/`codeType`/`codeAllowedLength`/`descriptionLength`), +`defaultPresentation`, `standardAttributes` (§7.1.1), `characteristics` (§7.1.4), `inputByString` (§7.1.5), формы (без +`*Folder*`), `basedOn`, `dataLockFields`, презентации. + +| Поле JSON | Умолчание | XML элемент | +|-----------|----------|-------------| +| `codeLength` | `5` | CodeLength | +| `descriptionLength` | `100` | DescriptionLength | +| `codeAllowedLength` | `Variable` | CodeAllowedLength | +| `dependenceOnCalculationTypes` | `DontUse` | DependenceOnCalculationTypes (`DontUse`/`OnPeriod`/`OnActionPeriod`) | +| `baseCalculationTypes` | `[]` | BaseCalculationTypes (список ссылок на ПВР; `ПланВидовРасчета.X` → `ChartOfCalculationTypes.X`) | +| `actionPeriodUse` | `false` | ActionPeriodUse (использовать период действия) | +| `dataLockControlMode` | `Automatic` | DataLockControlMode | +| `dataHistory` + триплет | `DontUse`/`false`/`false` | DataHistory-триплет | +| `predefined` | `[]` | Ext/Predefined.xml — предопределённые виды расчёта | + +Стандартные реквизиты ПВР: PredefinedDataName, Predefined, Ref, DeletionMark, ActionPeriodIsBasic, Description, Code +(профиль: Наименование → FillChecking=ShowError). Блок **условный** (`standardAttributes`). Всегда эмитятся три +платформенно-константных стандартных ТЧ: **LeadingCalculationTypes** (ведущие), **DisplacingCalculationTypes** +(вытесняющие), **BaseCalculationTypes** (базовые) — вложенный CalculationType → FillChecking=ShowError. + +**Предопределённые виды расчёта** — плоские (без иерархии): короткая строка `"(Код) Имя [Наименование]"` ЛИБО объект +`{name, code, description, actionPeriodIsBase}`. `actionPeriodIsBase` (bool, дефолт false) → ``; +при true — объектная форма. + +```json +"predefined": [ + "(00001) Оклад [Оклад по дням]", + { "name": "Премия", "code": "00002", "actionPeriodIsBase": true } +] +``` + ### 7.3 Enum | Поле JSON | Умолчание | XML элемент | @@ -977,33 +1012,7 @@ DSL для `columns` (§12). ### 7.18 ChartOfCalculationTypes -| Поле JSON | Умолчание | XML элемент | -|-----------|----------|-------------| -| `codeLength` | `9` | CodeLength | -| `codeType` | `String` | CodeType | -| `codeAllowedLength` | `Variable` | CodeAllowedLength | -| `descriptionLength` | `25` | DescriptionLength | -| `autonumbering` | `true` | Autonumbering | -| `checkUnique` | `false` | CheckUnique | -| `dependenceOnCalculationTypes` | `NotUsed` | DependenceOnCalculationTypes | -| `baseCalculationTypes` | `[]` | BaseCalculationTypes | -| `actionPeriodUse` | `false` | ActionPeriodUse | -| `dataLockControlMode` | `Automatic` | DataLockControlMode | -| `fullTextSearch` | `Use` | FullTextSearch | -| `attributes` | `[]` | → Attribute в ChildObjects | -| `tabularSections` | `{}` | → TabularSection в ChildObjects | - -Значения `dependenceOnCalculationTypes`: `NotUsed`, `ExclusionAndDependence`, `ExclusionOnly`. - -Модули: `Ext/ObjectModule.bsl` (пустой). - -```json -{ - "type": "ChartOfCalculationTypes", "name": "Начисления", - "dependenceOnCalculationTypes": "ExclusionAndDependence", - "actionPeriodUse": true -} -``` +Полное описание типа (все поля, стандартные реквизиты, стандартные ТЧ, предопределённые виды расчёта) — см. **§7.2d**. ### 7.19 CalculationRegister diff --git a/tests/skills/cases/meta-compile/chart-of-calculation-types.json b/tests/skills/cases/meta-compile/chart-of-calculation-types.json index 9de4665f..6fdd8803 100644 --- a/tests/skills/cases/meta-compile/chart-of-calculation-types.json +++ b/tests/skills/cases/meta-compile/chart-of-calculation-types.json @@ -1,16 +1,22 @@ { - "name": "План видов расчёта с зависимостью", + "name": "План видов расчёта: зависимость, базовые виды, предопределённые", "input": { "type": "ChartOfCalculationTypes", "name": "ВидыНачислений", + "synonym": { "ru": "Виды начислений", "en": "Accrual types" }, "codeLength": 5, - "descriptionLength": 50, + "descriptionLength": 100, + "dependenceOnCalculationTypes": "OnActionPeriod", "actionPeriodUse": true, - "dependenceOnCalculationTypes": "DontUse", - "attributes": ["Формула: String(200)"] + "baseCalculationTypes": ["ChartOfCalculationTypes.ВидыНачислений"], + "attributes": ["Формула: String(200)"], + "predefined": [ + "(00001) Оклад [Оклад по дням]", + { "name": "Премия", "code": "00002", "actionPeriodIsBase": true } + ] }, "validatePath": "ChartsOfCalculationTypes/ВидыНачислений", "expect": { - "files": ["ChartsOfCalculationTypes/ВидыНачислений.xml", "ChartsOfCalculationTypes/ВидыНачислений/Ext/ObjectModule.bsl"] + "files": ["ChartsOfCalculationTypes/ВидыНачислений.xml", "ChartsOfCalculationTypes/ВидыНачислений/Ext/Predefined.xml"] } } diff --git a/tests/skills/cases/meta-compile/snapshots/chart-of-calculation-types/ChartsOfCalculationTypes/ВидыНачислений.xml b/tests/skills/cases/meta-compile/snapshots/chart-of-calculation-types/ChartsOfCalculationTypes/ВидыНачислений.xml index 580202c5..663f9ded 100644 --- a/tests/skills/cases/meta-compile/snapshots/chart-of-calculation-types/ChartsOfCalculationTypes/ВидыНачислений.xml +++ b/tests/skills/cases/meta-compile/snapshots/chart-of-calculation-types/ChartsOfCalculationTypes/ВидыНачислений.xml @@ -54,203 +54,18 @@ ru Виды начислений + + en + Accrual types + true 5 + 100 String Variable - 50 AsDescription - DontUse - - true - - - - DontCheck - false - false - Auto - - - false - - - Auto - Auto - - false - Use - false - - - - Use - - - - - - - - DontCheck - false - false - Auto - - - false - - - Auto - Auto - - false - Use - false - - - - Use - - - - - - - - DontCheck - false - false - Auto - - - false - - - Auto - Auto - - false - Use - false - - - - Use - - - - - - - - DontCheck - false - false - Auto - - - false - - - Auto - Auto - - false - Use - false - - - - Use - - - - - - - - DontCheck - false - false - Auto - - - false - - - Auto - Auto - - false - Use - false - - - - Use - - - - - - - - DontCheck - false - false - Auto - - - false - - - Auto - Auto - - false - Use - false - - - - Use - - - - - - - - DontCheck - false - false - Auto - - - false - - - Auto - Auto - - false - Use - false - - - - Use - - - - - - - - Auto InDialog false BothWays @@ -261,14 +76,298 @@ Begin DontUse Directly + DontUse + Auto - false + OnActionPeriod + + ChartOfCalculationTypes.ВидыНачислений + + true + + + + + + + Ведущие виды расчета + + + + + DontCheck + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + ShowError + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + + + + + Вытесняющие виды расчета + + + + + DontCheck + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + ShowError + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + + + + + Базовые виды расчета + + + + + DontCheck + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + ShowError + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + + Auto + false Automatic Use @@ -277,8 +376,9 @@ - DontUse - Auto + DontUse + false + false @@ -308,6 +408,8 @@ false + false + DontCheck Items @@ -319,6 +421,7 @@ Auto DontIndex Use + Use diff --git a/tests/skills/cases/meta-compile/snapshots/chart-of-calculation-types/ChartsOfCalculationTypes/ВидыНачислений/Ext/Predefined.xml b/tests/skills/cases/meta-compile/snapshots/chart-of-calculation-types/ChartsOfCalculationTypes/ВидыНачислений/Ext/Predefined.xml new file mode 100644 index 00000000..f3f33077 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/chart-of-calculation-types/ChartsOfCalculationTypes/ВидыНачислений/Ext/Predefined.xml @@ -0,0 +1,15 @@ + + + + Оклад + 00001 + Оклад по дням + false + + + Премия + 00002 + Премия + true + +