From db2932421584e7cf0700fb812a5cda9a77a34acb Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Thu, 9 Jul 2026 17:24:11 +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=BE=D0=B2=20Report=20+=20DataProcessor=20(v1.52/v0.43)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 14-й/15-й типы, 2546 объектов acc+erp. Рерайт Emit-ReportProperties/ Emit-DataProcessorProperties на общие хелперы (был легаси-хардкод Comment/ UseStandardCommands/формы/презентации). Декомпилятор: снят гейт +оба; Report-специфика (defaultForm/mainDataCompositionSchema/*SettingsForm/ defaultVariantForm/variantsStorage/settingsStorage/extendedPresentation), DataProcessor-специфика (defaultForm/auxiliaryForm/extendedPresentation). Общие фиксы (не только Report/DataProcessor): - Emit-VerbatimRef: ссылки форм/схем/хранилищ без Normalize-FormRef — имя формы может быть буквально «Форма» (Normalize перевёл бы имя-сегмент Форма→Form). - Пустой (реквизит без типа): маркер typeEmpty (декомпилятор type:"", компилятор + FillValue nil вместо xs:string). Отличаем present-"" от absent. - Платформенные типы v8:-префикса (ValueTable/ValueTree/ValueList/StandardPeriod/…), current-config cfg:-типы (ConstantsSet/ReportBuilder/*Object.X), выделенные ns (Chart/SettingsComposer/SpreadsheetDocument) — компилятор возвращал голое имя. - Expand-DataPath: голый (отрицательный) индекс-маркер (-8 в ChoiceParameterLinks) verbatim. Class-2: UseStandardCommands дефолт true (совместно с пользователем — авторски- безопасно: доступность через стандартный командный интерфейс; при false и без переопределения размещения команд объект доступен лишь по навигационной ссылке). Декомпилятор явно фиксирует false. У DataProcessor мода корпуса и так true. ПОЛНЫЙ КОРПУС 2546: match 2546/2546, TOTAL 0, byte-exact order-preserved (сверено с реальными 1С-файлами). Регресс 52/52 ps1+py, ps1==py identical. spec §7.11/§7.12, кейсы report-full/data-processor-full. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../meta-compile/scripts/meta-compile.ps1 | 131 ++++++--- .../meta-compile/scripts/meta-compile.py | 147 ++++++---- .../meta-decompile/scripts/meta-decompile.ps1 | 33 ++- docs/meta-dsl-spec.md | 63 +++-- .../meta-compile/data-processor-full.json | 21 ++ .../cases/meta-compile/report-full.json | 22 ++ .../data-processor-full/Configuration.xml | 252 ++++++++++++++++++ .../DataProcessors/ЗагрузкаТаблиц.xml | 227 ++++++++++++++++ .../ЗагрузкаТаблиц/Ext/ManagerModule.bsl | 0 .../ЗагрузкаТаблиц/Ext/ObjectModule.bsl | 0 .../Ext/ClientApplicationInterface.xml | 18 ++ .../data-processor-full/Languages/Русский.xml | 16 ++ .../DataProcessors/ЗагрузкаДанных.xml | 2 +- .../snapshots/report-full/Configuration.xml | 252 ++++++++++++++++++ .../Ext/ClientApplicationInterface.xml | 18 ++ .../report-full/Languages/Русский.xml | 16 ++ .../report-full/Reports/АнализПродаж.xml | 148 ++++++++++ .../АнализПродаж/Ext/ManagerModule.bsl | 0 .../Reports/АнализПродаж/Ext/ObjectModule.bsl | 0 19 files changed, 1240 insertions(+), 126 deletions(-) create mode 100644 tests/skills/cases/meta-compile/data-processor-full.json create mode 100644 tests/skills/cases/meta-compile/report-full.json create mode 100644 tests/skills/cases/meta-compile/snapshots/data-processor-full/Configuration.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/data-processor-full/DataProcessors/ЗагрузкаТаблиц.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/data-processor-full/DataProcessors/ЗагрузкаТаблиц/Ext/ManagerModule.bsl create mode 100644 tests/skills/cases/meta-compile/snapshots/data-processor-full/DataProcessors/ЗагрузкаТаблиц/Ext/ObjectModule.bsl create mode 100644 tests/skills/cases/meta-compile/snapshots/data-processor-full/Ext/ClientApplicationInterface.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/data-processor-full/Languages/Русский.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/report-full/Configuration.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/report-full/Ext/ClientApplicationInterface.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/report-full/Languages/Русский.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/report-full/Reports/АнализПродаж.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/report-full/Reports/АнализПродаж/Ext/ManagerModule.bsl create mode 100644 tests/skills/cases/meta-compile/snapshots/report-full/Reports/АнализПродаж/Ext/ObjectModule.bsl diff --git a/.claude/skills/meta-compile/scripts/meta-compile.ps1 b/.claude/skills/meta-compile/scripts/meta-compile.ps1 index 1bd30137..bf3ac5fd 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.51 — Compile 1C metadata object from JSON +# meta-compile v1.52 — Compile 1C metadata object from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -323,6 +323,14 @@ function Emit-FormRef { if ($val) { X "$i<$tag>$(Esc-Xml (Normalize-FormRef "$val"))" } else { X "$i<$tag/>" } } +# Ссылка verbatim (без Normalize-FormRef): для форм/схем/хранилищ Report/DataProcessor, где имя формы может быть +# буквально «Форма» (Normalize-FormRef перевёл бы имя-сегмент Форма→Form, испортив ссылку) либо ref не-форменного +# вида (SettingsStorage.X / Report.X.Template.Y). Декомпилятор пишет полный путь → passthrough. +function Emit-VerbatimRef { + param([string]$i, [string]$tag, $val) + if ($val) { X "$i<$tag>$(Esc-Xml "$val")" } else { X "$i<$tag/>" } +} + if (-not $def.type) { Write-Error "JSON must have 'type' field" exit 1 @@ -443,6 +451,26 @@ $script:typeSynonyms["хранилищезначений"] = "ValueStorage" $script:typeSynonyms["хранилищезначения"] = "ValueStorage" $script:typeSynonyms["uuid"] = "UUID" $script:typeSynonyms["уникальныйидентификатор"] = "UUID" +# Платформенные типы, требующие префикса v8: (коллекции/периоды, частые в реквизитах обработок/отчётов). +$script:v8PlatformTypes = @("ValueTable","ValueTree","ValueList","ValueListType","StandardPeriod", + "StandardBeginningDate","PointInTime","TypeDescription","FixedArray","FixedMap","FixedStructure") +# Типы со ВЫДЕЛЕННЫМ пространством имён (локальный xmlns на ). prefix — канон корпуса +# (dcsset/mxl — семантические из корневых деклараций 1С; chart — генерируемый dNpM, любой подойдёт). +$script:typeNamespaceMap = @{ + "Chart" = @{ ns = "http://v8.1c.ru/8.2/data/chart"; prefix = "d5p1" } + "SettingsComposer" = @{ ns = "http://v8.1c.ru/8.1/data-composition-system/settings"; prefix = "dcsset" } + "SpreadsheetDocument" = @{ ns = "http://v8.1c.ru/8.2/data/spreadsheet"; prefix = "mxl" } +} +# Типы current-config пространства (cfg:, объявлено в корне): объектные (CatalogObject.X/DataProcessorObject.X/…) +# и голые (ConstantsSet/ReportBuilder). Ссылочные (*Ref.X/DefinedType.X) идут ОТДЕЛЬНО через локальный d5p1 (§memory). +$script:cfgBareTypes = @("ConstantsSet", "ReportBuilder", "FilterCriterion") +$script:cfgObjectKinds = @("Catalog","Document","Enum","ChartOfAccounts","ChartOfCharacteristicTypes", + "ChartOfCalculationTypes","ExchangePlan","BusinessProcess","Task","InformationRegister","AccumulationRegister", + "AccountingRegister","CalculationRegister","DataProcessor","Report","DocumentJournal","Constant") +$script:typeSynonyms["таблицазначений"] = "ValueTable" +$script:typeSynonyms["деревозначений"] = "ValueTree" +$script:typeSynonyms["списокзначений"] = "ValueListType" +$script:typeSynonyms["стандартныйпериод"] = "StandardPeriod" # Reference synonyms (Russian, lowercase) $script:typeSynonyms["справочникссылка"] = "CatalogRef" $script:typeSynonyms["документссылка"] = "DocumentRef" @@ -580,6 +608,27 @@ function Emit-TypeContent { X "$indentv8:UUID" return } + # Платформенные типы-коллекции/периоды (ТаблицаЗначений/ДеревоЗначений/СписокЗначений/StandardPeriod/…) — + # канон с префиксом v8: (декомпилятор снимает префикс через Strip-NsPrefix, компилятор возвращает). + if ($script:v8PlatformTypes -contains $typeStr) { + X "$indentv8:$typeStr" + return + } + # Типы с выделенным пространством имён (Chart/SettingsComposer/SpreadsheetDocument) — локальный xmlns. + if ($script:typeNamespaceMap.ContainsKey($typeStr)) { + $m = $script:typeNamespaceMap[$typeStr] + X "$indent$($m.prefix):$typeStr" + return + } + # Типы current-config (cfg:): голые (ConstantsSet/…) и объектные (CatalogObject.X/DataProcessorObject.X/…). + if ($script:cfgBareTypes -contains $typeStr) { + X "$indentcfg:$typeStr" + return + } + if ($typeStr -match '^(\w+)(Object|List|Manager|Selection|RecordSet|RecordKey|RecordManager)\.(.+)$' -and $script:cfgObjectKinds -contains $Matches[1]) { + X "$indentcfg:$typeStr" + return + } # Reference types — use local xmlns declaration for 1C compatibility if ($typeStr -match '^(CatalogRef|DocumentRef|EnumRef|ChartOfAccountsRef|ChartOfCharacteristicTypesRef|ChartOfCalculationTypesRef|ExchangePlanRef|BusinessProcessRef|BusinessProcessRoutePointRef|TaskRef)\.(.+)$') { @@ -725,8 +774,10 @@ function Format-FillNum { # $spec — значение ключа `fillValue` ($null при явном nil-override), $hasSpec — присутствует ли ключ. function Emit-FillValue { - param([string]$indent, [string]$typeStr, $spec, $hasSpec) - $cat = Get-FillTypeCategory $typeStr + param([string]$indent, [string]$typeStr, $spec, $hasSpec, [bool]$typeEmpty = $false) + # Пустой (реквизит без типа) → форма пустого значения nil (как составной/ссылочный), НЕ xs:string: + # у бестипового реквизита нет типизированного «пустого» значения. + $cat = if ($typeEmpty) { 'Other' } else { Get-FillTypeCategory $typeStr } if ($hasSpec -ne $true) { # Значение не задано — форма по умолчанию для типа. @@ -775,6 +826,7 @@ function Parse-AttributeShorthand { $parsed = @{ name = "" type = "" + typeEmpty = $false synonym = "" comment = "" flags = @() @@ -811,6 +863,9 @@ function Parse-AttributeShorthand { return @{ name = $name type = Build-TypeStr $val + # Явный `type: ""` (ключ присутствует, значение пустое) ≠ отсутствие типа: означает пустой + # (реквизит без типа / произвольный). Отличаем present-"" от absent через $null-проверку (PSCustomObject). + typeEmpty = ($null -ne $val.type -and "$($val.type)".Trim() -eq '' -and -not $val.valueType) synonym = if ($null -ne $val.synonym) { $val.synonym } else { Split-CamelCase $name } tooltip = $val.tooltip comment = if ($val.comment) { "$($val.comment)" } else { "" } @@ -1259,6 +1314,7 @@ function Expand-DataPath { if (-not $dp) { return $dp } $s = "$dp" if ($s -match '[:/]') { return $s } # спец-путь (напр. 0:GUID/0:GUID в зависимостях ПВХ) — не разворачиваем + if ($s -match '^-?\d+$') { return $s } # голый (отрицательный) индекс-маркер (напр. -8 в ChoiceParameterLinks) — verbatim, не имя реквизита if ($s -match '^(StandardAttribute|Attribute)\.') { return "$objType.$objName.$s" } if (-not $s.Contains('.')) { $en = Resolve-StdAttrEn $s @@ -1598,7 +1654,10 @@ function Emit-Attribute { # Type $typeStr = $parsed.type - if ($typeStr) { + if ($parsed.typeEmpty) { + # Явный пустой тип (реквизит без типа / произвольный) → . + X "$indent`t`t" + } elseif ($typeStr) { Emit-ValueType "$indent`t`t" $typeStr } elseif ($context -eq "account-flag") { # Признак учёта — по умолчанию Boolean. @@ -1637,7 +1696,7 @@ function Emit-Attribute { # FillValue — same restriction if ($context -notin @("tabular", "processor", "chart", "register-other", "register-accum", "register-calc", "register-account")) { - Emit-FillValue "$indent`t`t" $typeStr $parsed.fillValue $parsed.hasFillValue + Emit-FillValue "$indent`t`t" $typeStr $parsed.fillValue $parsed.hasFillValue ([bool]$parsed.typeEmpty) } # FillChecking @@ -2552,32 +2611,24 @@ function Emit-ReportProperties { X "$i$(Esc-Xml $objName)" Emit-MLText $i "Synonym" $synonym - X "$i" - X "$itrue" + if ($def.comment) { X "$i$(Esc-XmlText $def.comment)" } else { X "$i" } + # UseStandardCommands: дефолт true (авторски-безопасно — доступность объекта через стандартный командный + # интерфейс; при false и без переопределения размещения команд объект доступен лишь по навигационной ссылке). + $useStdCmds = if (Get-BoolProp "useStandardCommands" $true) { "true" } else { "false" } + X "$i$useStdCmds" - $defaultForm = if ($def.defaultForm) { "$($def.defaultForm)" } else { "" } - if ($defaultForm) { X "$i$defaultForm" } else { X "$i" } - - $auxForm = if ($def.auxiliaryForm) { "$($def.auxiliaryForm)" } else { "" } - if ($auxForm) { X "$i$auxForm" } else { X "$i" } - - $mainDCS = if ($def.mainDataCompositionSchema) { "$($def.mainDataCompositionSchema)" } else { "" } - if ($mainDCS) { X "$i$mainDCS" } else { X "$i" } - - $defSettings = if ($def.defaultSettingsForm) { "$($def.defaultSettingsForm)" } else { "" } - if ($defSettings) { X "$i$defSettings" } else { X "$i" } - - $auxSettings = if ($def.auxiliarySettingsForm) { "$($def.auxiliarySettingsForm)" } else { "" } - if ($auxSettings) { X "$i$auxSettings" } else { X "$i" } - - $defVariant = if ($def.defaultVariantForm) { "$($def.defaultVariantForm)" } else { "" } - if ($defVariant) { X "$i$defVariant" } else { X "$i" } - - X "$i" - X "$i" - X "$ifalse" - X "$i" - X "$i" + Emit-VerbatimRef $i "DefaultForm" $def.defaultForm + Emit-VerbatimRef $i "AuxiliaryForm" $def.auxiliaryForm + Emit-VerbatimRef $i "MainDataCompositionSchema" $def.mainDataCompositionSchema + Emit-VerbatimRef $i "DefaultSettingsForm" $def.defaultSettingsForm + Emit-VerbatimRef $i "AuxiliarySettingsForm" $def.auxiliarySettingsForm + Emit-VerbatimRef $i "DefaultVariantForm" $def.defaultVariantForm + Emit-VerbatimRef $i "VariantsStorage" $def.variantsStorage + Emit-VerbatimRef $i "SettingsStorage" $def.settingsStorage + $inclHelp = if (Get-BoolProp "includeHelpInContents" $false) { "true" } else { "false" } + X "$i$inclHelp" + Emit-MLText $i "ExtendedPresentation" $def.extendedPresentation + Emit-MLText $i "Explanation" $def.explanation } function Emit-DataProcessorProperties { @@ -2586,18 +2637,16 @@ function Emit-DataProcessorProperties { X "$i$(Esc-Xml $objName)" Emit-MLText $i "Synonym" $synonym - X "$i" - X "$ifalse" + if ($def.comment) { X "$i$(Esc-XmlText $def.comment)" } else { X "$i" } + $useStdCmds = if (Get-BoolProp "useStandardCommands" $true) { "true" } else { "false" } + X "$i$useStdCmds" - $defaultForm = if ($def.defaultForm) { "$($def.defaultForm)" } else { "" } - if ($defaultForm) { X "$i$defaultForm" } else { X "$i" } - - $auxForm = if ($def.auxiliaryForm) { "$($def.auxiliaryForm)" } else { "" } - if ($auxForm) { X "$i$auxForm" } else { X "$i" } - - X "$ifalse" - X "$i" - X "$i" + Emit-VerbatimRef $i "DefaultForm" $def.defaultForm + Emit-VerbatimRef $i "AuxiliaryForm" $def.auxiliaryForm + $inclHelp = if (Get-BoolProp "includeHelpInContents" $false) { "true" } else { "false" } + X "$i$inclHelp" + Emit-MLText $i "ExtendedPresentation" $def.extendedPresentation + Emit-MLText $i "Explanation" $def.explanation } # --- 13c. Wave 3: ExchangePlan, ChartOfCharacteristicTypes, DocumentJournal --- diff --git a/.claude/skills/meta-compile/scripts/meta-compile.py b/.claude/skills/meta-compile/scripts/meta-compile.py index b7b83dd7..2b9d0949 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.51 — Compile 1C metadata object from JSON +# meta-compile v1.52 — Compile 1C metadata object from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -437,6 +437,14 @@ def emit_form_ref(i, tag, val): else: X(f'{i}<{tag}/>') +def emit_verbatim_ref(i, tag, val): + """Ссылка verbatim (без normalize_form_ref): формы/схемы/хранилища Report/DataProcessor, где имя формы + может быть буквально «Форма» (normalize перевёл бы имя-сегмент Форма→Form) либо ref не-форменного вида.""" + if val: + X(f'{i}<{tag}>{esc_xml(str(val))}') + else: + X(f'{i}<{tag}/>') + if not defn.get('type'): print("JSON must have 'type' field", file=sys.stderr) sys.exit(1) @@ -510,8 +518,29 @@ type_synonyms = { 'catalogref': 'CatalogRef', 'documentref': 'DocumentRef', 'enumref': 'EnumRef', + # Платформенные коллекции (прощающий ввод рус. форм). + 'таблицазначений': 'ValueTable', + 'деревозначений': 'ValueTree', + 'списокзначений': 'ValueListType', + 'стандартныйпериод': 'StandardPeriod', } +# Платформенные типы, требующие префикса v8: (коллекции/периоды, частые в реквизитах обработок/отчётов). +v8_platform_types = {"ValueTable", "ValueTree", "ValueList", "ValueListType", "StandardPeriod", + "StandardBeginningDate", "PointInTime", "TypeDescription", "FixedArray", "FixedMap", "FixedStructure"} +# Типы со ВЫДЕЛЕННЫМ пространством имён (локальный xmlns на ). prefix — канон корпуса. +type_namespace_map = { + "Chart": {"ns": "http://v8.1c.ru/8.2/data/chart", "prefix": "d5p1"}, + "SettingsComposer": {"ns": "http://v8.1c.ru/8.1/data-composition-system/settings", "prefix": "dcsset"}, + "SpreadsheetDocument": {"ns": "http://v8.1c.ru/8.2/data/spreadsheet", "prefix": "mxl"}, +} +# Типы current-config пространства (cfg:, объявлено в корне): голые и объектные. Ссылочные — отдельно (d5p1). +cfg_bare_types = {"ConstantsSet", "ReportBuilder", "FilterCriterion"} +cfg_object_kinds = {"Catalog", "Document", "Enum", "ChartOfAccounts", "ChartOfCharacteristicTypes", + "ChartOfCalculationTypes", "ExchangePlan", "BusinessProcess", "Task", "InformationRegister", + "AccumulationRegister", "AccountingRegister", "CalculationRegister", "DataProcessor", "Report", + "DocumentJournal", "Constant"} + def resolve_type_str(type_str): if not type_str: return type_str @@ -611,6 +640,23 @@ def emit_type_content(indent, type_str): if type_str == 'UUID': X(f'{indent}v8:UUID') return + # Платформенные типы-коллекции/периоды (ТаблицаЗначений/ДеревоЗначений/…) — канон с префиксом v8:. + if type_str in v8_platform_types: + X(f'{indent}v8:{type_str}') + return + # Типы с выделенным пространством имён (Chart/SettingsComposer/SpreadsheetDocument) — локальный xmlns. + if type_str in type_namespace_map: + m2 = type_namespace_map[type_str] + X(f'{indent}{m2["prefix"]}:{type_str}') + return + # Типы current-config (cfg:): голые (ConstantsSet/…) и объектные (CatalogObject.X/DataProcessorObject.X/…). + if type_str in cfg_bare_types: + X(f'{indent}cfg:{type_str}') + return + m3 = re.match(r'^(\w+)(Object|List|Manager|Selection|RecordSet|RecordKey|RecordManager)\.(.+)$', type_str) + if m3 and m3.group(1) in cfg_object_kinds: + X(f'{indent}cfg:{type_str}') + return # Reference types — use local xmlns declaration for 1C compatibility m = re.match(r'^(CatalogRef|DocumentRef|EnumRef|ChartOfAccountsRef|ChartOfCharacteristicTypesRef|ChartOfCalculationTypesRef|ExchangePlanRef|BusinessProcessRef|BusinessProcessRoutePointRef|TaskRef)\.(.+)$', type_str) @@ -755,9 +801,10 @@ def format_fill_num(n): return 'true' if n else 'false' return str(n) -def emit_fill_value(indent, type_str, spec, has_spec): - """spec — значение ключа fillValue (None при явном nil-override), has_spec — присутствует ли ключ.""" - cat = get_fill_type_category(type_str) +def emit_fill_value(indent, type_str, spec, has_spec, type_empty=False): + """spec — значение ключа fillValue (None при явном nil-override), has_spec — присутствует ли ключ. + type_empty — реквизит с пустым : форма пустого значения nil, НЕ xs:string.""" + cat = 'Other' if type_empty else get_fill_type_category(type_str) if not has_spec: if cat == 'String': X(f'{indent}') @@ -804,6 +851,7 @@ def parse_attribute_shorthand(val): parsed = { 'name': '', 'type': '', + 'typeEmpty': False, 'synonym': '', 'comment': '', 'flags': [], @@ -839,6 +887,8 @@ def parse_attribute_shorthand(val): return { 'name': name, 'type': build_type_str(val), + # Явный `type: ""` (ключ есть, значение пустое) ≠ отсутствие: пустой (реквизит без типа). + 'typeEmpty': ('type' in val and str(val.get('type') or '').strip() == '' and not val.get('valueType')), 'synonym': val['synonym'] if val.get('synonym') is not None else split_camel_case(name), 'tooltip': val.get('tooltip'), 'comment': str(val['comment']) if val.get('comment') else '', @@ -1338,6 +1388,8 @@ def expand_data_path(dp): s = str(dp) if re.search(r'[:/]', s): return s # спец-путь (напр. 0:GUID/0:GUID в зависимостях ПВХ) — не разворачиваем + if re.match(r'^-?\d+$', s): + return s # голый (отрицательный) индекс-маркер (напр. -8 в ChoiceParameterLinks) — verbatim if re.match(r'^(StandardAttribute|Attribute)\.', s): return f'{obj_type}.{obj_name}.{s}' if '.' not in s: @@ -1679,7 +1731,10 @@ def emit_attribute(indent, parsed, context, elem_tag='Attribute'): else: X(f'{indent}\t\t') type_str = parsed['type'] - if type_str: + if parsed.get('typeEmpty'): + # Явный пустой тип (реквизит без типа / произвольный) → . + X(f'{indent}\t\t') + elif type_str: emit_value_type(f'{indent}\t\t', type_str) elif context == 'account-flag': X(f'{indent}\t\t') @@ -1711,7 +1766,7 @@ def emit_attribute(indent, parsed, context, elem_tag='Attribute'): 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{ffv}') 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')) + emit_fill_value(f'{indent}\t\t', type_str, parsed.get('fillValue'), parsed.get('hasFillValue'), bool(parsed.get('typeEmpty'))) fill_checking = 'DontCheck' if 'req' in parsed.get('flags', []): fill_checking = 'ShowError' @@ -2506,63 +2561,43 @@ def emit_report_properties(indent): i = indent X(f'{i}{esc_xml(obj_name)}') emit_mltext(i, 'Synonym', synonym) - X(f'{i}') - X(f'{i}true') - default_form = str(defn['defaultForm']) if defn.get('defaultForm') else '' - if default_form: - X(f'{i}{default_form}') + if defn.get('comment'): + X(f'{i}{esc_xml_text(defn["comment"])}') else: - X(f'{i}') - aux_form = str(defn['auxiliaryForm']) if defn.get('auxiliaryForm') else '' - if aux_form: - X(f'{i}{aux_form}') - else: - X(f'{i}') - main_dcs = str(defn['mainDataCompositionSchema']) if defn.get('mainDataCompositionSchema') else '' - if main_dcs: - X(f'{i}{main_dcs}') - else: - X(f'{i}') - def_settings = str(defn['defaultSettingsForm']) if defn.get('defaultSettingsForm') else '' - if def_settings: - X(f'{i}{def_settings}') - else: - X(f'{i}') - aux_settings = str(defn['auxiliarySettingsForm']) if defn.get('auxiliarySettingsForm') else '' - if aux_settings: - X(f'{i}{aux_settings}') - else: - X(f'{i}') - def_variant = str(defn['defaultVariantForm']) if defn.get('defaultVariantForm') else '' - if def_variant: - X(f'{i}{def_variant}') - else: - X(f'{i}') - X(f'{i}') - X(f'{i}') - X(f'{i}false') - X(f'{i}') - X(f'{i}') + X(f'{i}') + # UseStandardCommands: дефолт true (авторски-безопасно — доступность через стандартный командный интерфейс; + # при false и без переопределения размещения команд объект доступен лишь по навигационной ссылке). + use_std_cmds = 'true' if get_bool_prop('useStandardCommands', True) else 'false' + X(f'{i}{use_std_cmds}') + emit_verbatim_ref(i, 'DefaultForm', defn.get('defaultForm')) + emit_verbatim_ref(i, 'AuxiliaryForm', defn.get('auxiliaryForm')) + emit_verbatim_ref(i, 'MainDataCompositionSchema', defn.get('mainDataCompositionSchema')) + emit_verbatim_ref(i, 'DefaultSettingsForm', defn.get('defaultSettingsForm')) + emit_verbatim_ref(i, 'AuxiliarySettingsForm', defn.get('auxiliarySettingsForm')) + emit_verbatim_ref(i, 'DefaultVariantForm', defn.get('defaultVariantForm')) + emit_verbatim_ref(i, 'VariantsStorage', defn.get('variantsStorage')) + emit_verbatim_ref(i, 'SettingsStorage', defn.get('settingsStorage')) + incl_help = 'true' if get_bool_prop('includeHelpInContents', False) else 'false' + X(f'{i}{incl_help}') + emit_mltext(i, 'ExtendedPresentation', defn.get('extendedPresentation')) + emit_mltext(i, 'Explanation', defn.get('explanation')) def emit_data_processor_properties(indent): i = indent X(f'{i}{esc_xml(obj_name)}') emit_mltext(i, 'Synonym', synonym) - X(f'{i}') - X(f'{i}false') - default_form = str(defn['defaultForm']) if defn.get('defaultForm') else '' - if default_form: - X(f'{i}{default_form}') + if defn.get('comment'): + X(f'{i}{esc_xml_text(defn["comment"])}') else: - X(f'{i}') - aux_form = str(defn['auxiliaryForm']) if defn.get('auxiliaryForm') else '' - if aux_form: - X(f'{i}{aux_form}') - else: - X(f'{i}') - X(f'{i}false') - X(f'{i}') - X(f'{i}') + X(f'{i}') + use_std_cmds = 'true' if get_bool_prop('useStandardCommands', True) else 'false' + X(f'{i}{use_std_cmds}') + emit_verbatim_ref(i, 'DefaultForm', defn.get('defaultForm')) + emit_verbatim_ref(i, 'AuxiliaryForm', defn.get('auxiliaryForm')) + incl_help = 'true' if get_bool_prop('includeHelpInContents', False) else 'false' + X(f'{i}{incl_help}') + emit_mltext(i, 'ExtendedPresentation', defn.get('extendedPresentation')) + emit_mltext(i, 'Explanation', defn.get('explanation')) # --- 13c. ExchangePlan, ChartOfCharacteristicTypes, DocumentJournal --- diff --git a/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 b/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 index 9ef7f670..59edcf40 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.42 — XML объекта метаданных 1С → JSON-черновик формата meta-compile +# meta-decompile v0.43 — XML объекта метаданных 1С → JSON-черновик формата meta-compile # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # # Поддержаны: Catalog, ExchangePlan, ChartOfCharacteristicTypes, ChartOfAccounts, ChartOfCalculationTypes, Document, @@ -92,8 +92,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', 'AccountingRegister', 'CalculationRegister', 'BusinessProcess', 'Task', 'Enum')) { - [Console]::Error.WriteLine("meta-decompile: тип '$objType' пока не поддержан (Catalog, ExchangePlan, ChartOfCharacteristicTypes, ChartOfAccounts, ChartOfCalculationTypes, Document, InformationRegister, AccumulationRegister, AccountingRegister, CalculationRegister, BusinessProcess, Task, Enum)"); exit 3 +if ($objType -notin @('Catalog', 'ExchangePlan', 'ChartOfCharacteristicTypes', 'ChartOfAccounts', 'ChartOfCalculationTypes', 'Document', 'InformationRegister', 'AccumulationRegister', 'AccountingRegister', 'CalculationRegister', 'BusinessProcess', 'Task', 'Enum', 'Report', 'DataProcessor')) { + [Console]::Error.WriteLine("meta-decompile: тип '$objType' пока не поддержан (Catalog, ExchangePlan, ChartOfCharacteristicTypes, ChartOfAccounts, ChartOfCalculationTypes, Document, InformationRegister, AccumulationRegister, AccountingRegister, CalculationRegister, BusinessProcess, Task, Enum, Report, DataProcessor)"); exit 3 } $props = $objNode.SelectSingleNode('md:Properties', $nsm) @@ -370,9 +370,12 @@ function Attr-ToDsl { $cplArr = Parse-ChoiceParameterLinks $ap 'md:ChoiceParameterLinks'; if ($null -ne $cplArr) { $extra['choiceParameterLinks'] = $cplArr } $cpArr = Parse-ChoiceParameters $ap 'md:ChoiceParameters'; if ($null -ne $cpArr) { $extra['choiceParameters'] = $cpArr } - if ($synCustom -or $synEmpty -or ($null -ne $ttVal) -or $extra.Count -gt 0) { + # Пустой (реквизит без типа / произвольный) → $ts=''. Отличаем от «дефолтного» отсутствия: + # заставляем объектную форму с явным type:'' (компилятор без маркера подставил бы xs:string). + $typeEmpty = ($ts -eq '') + if ($synCustom -or $synEmpty -or ($null -ne $ttVal) -or $extra.Count -gt 0 -or $typeEmpty) { $o = [ordered]@{ name = $nm } - if ($ts) { $o['type'] = $ts } + if ($ts) { $o['type'] = $ts } elseif ($typeEmpty) { $o['type'] = '' } if ($synCustom) { $o['synonym'] = $synVal } elseif ($synEmpty) { $o['synonym'] = '' } if ($null -ne $ttVal) { $o['tooltip'] = $ttVal } @@ -434,7 +437,7 @@ Add-BoolProp 'quickChoice' 'QuickChoice' $(if ($objType -eq 'Enum') Add-EnumProp 'choiceMode' 'ChoiceMode' 'BothWays' Add-EnumProp 'dataLockControlMode' 'DataLockControlMode' $dataLockDef Add-EnumProp 'fullTextSearch' 'FullTextSearch' 'Use' -Add-BoolProp 'useStandardCommands' 'UseStandardCommands' $(if ($objType -eq 'Enum') { $false } else { $true }) +Add-BoolProp 'useStandardCommands' 'UseStandardCommands' $(if ($objType -eq 'Enum') { $false } else { $true }) # Enum дефолт false (корпус); прочие (вкл. Report/DataProcessor) — true: авторски-безопасно (доступность через интерфейс), false фиксируем явно Add-EnumProp 'createOnInput' 'CreateOnInput' $createInpDef Add-EnumProp 'editType' 'EditType' 'InDialog' Add-BoolProp 'includeHelpInContents' 'IncludeHelpInContents' $false @@ -573,6 +576,24 @@ if ($objType -eq 'Task') { $cp = P 'CurrentPerformer'; if ($cp) { $dsl['currentPerformer'] = $cp } Add-EnumProp 'defaultPresentation' 'DefaultPresentation' 'AsDescription' } +# Report-специфичные свойства: формы (плоские ref, не *ObjectForm), схема компоновки, хранилища вариантов/настроек. +if ($objType -eq 'Report') { + $dfm = P 'DefaultForm'; if ($dfm) { $dsl['defaultForm'] = $dfm } + $afm = P 'AuxiliaryForm'; if ($afm) { $dsl['auxiliaryForm'] = $afm } + $mdcs = P 'MainDataCompositionSchema'; if ($mdcs) { $dsl['mainDataCompositionSchema'] = $mdcs } + $dsf = P 'DefaultSettingsForm'; if ($dsf) { $dsl['defaultSettingsForm'] = $dsf } + $asf = P 'AuxiliarySettingsForm'; if ($asf) { $dsl['auxiliarySettingsForm'] = $asf } + $dvf = P 'DefaultVariantForm'; if ($dvf) { $dsl['defaultVariantForm'] = $dvf } + $vs = P 'VariantsStorage'; if ($vs) { $dsl['variantsStorage'] = $vs } + $ss = P 'SettingsStorage'; if ($ss) { $dsl['settingsStorage'] = $ss } + $ep = Get-MLValue ($props.SelectSingleNode('md:ExtendedPresentation', $nsm)); if ($null -ne $ep) { $dsl['extendedPresentation'] = $ep } +} +# DataProcessor-специфичные свойства: формы (плоские ref). +if ($objType -eq 'DataProcessor') { + $dfm = P 'DefaultForm'; if ($dfm) { $dsl['defaultForm'] = $dfm } + $afm = P 'AuxiliaryForm'; if ($afm) { $dsl['auxiliaryForm'] = $afm } + $ep = Get-MLValue ($props.SelectSingleNode('md:ExtendedPresentation', $nsm)); if ($null -ne $ep) { $dsl['extendedPresentation'] = $ep } +} # Короткая форма поля: ..StandardAttribute.X / .Attribute.X → StandardAttribute.X / Attribute.X # (Expand-DataPath компилятора разворачивает частичную форму обратно — dogfood резолвера). diff --git a/docs/meta-dsl-spec.md b/docs/meta-dsl-spec.md index 7981279c..e5b50a0a 100644 --- a/docs/meta-dsl-spec.md +++ b/docs/meta-dsl-spec.md @@ -1004,39 +1004,58 @@ true); `characteristics` (§7.1.4); `basedOn`/`inputByString`/`dataLockFields` ( { "type": "EventSubscription", "name": "ПередЗаписьюКонтрагента", "source": ["CatalogObject.Контрагенты"], "event": "BeforeWrite", "handler": "ОбщегоНазначенияСервер.ПередЗаписьюКонтрагента" } ``` -### 7.11 Report +### 7.11 Report (Отчёт) | Поле JSON | Умолчание | XML элемент | |-----------|----------|-------------| -| `defaultForm` | `""` | DefaultForm | -| `auxiliaryForm` | `""` | AuxiliaryForm | -| `mainDataCompositionSchema` | `""` | MainDataCompositionSchema | -| `defaultSettingsForm` | `""` | DefaultSettingsForm | -| `auxiliarySettingsForm` | `""` | AuxiliarySettingsForm | -| `defaultVariantForm` | `""` | DefaultVariantForm | +| `comment` | пусто | Comment | +| `useStandardCommands` | `true` | UseStandardCommands | +| `defaultForm` / `auxiliaryForm` | `""` | DefaultForm / AuxiliaryForm (ссылка verbatim) | +| `mainDataCompositionSchema` | `""` | MainDataCompositionSchema (ссылка на макет СКД, напр. `Report.X.Template.ОсновнаяСхемаКомпоновкиДанных`) | +| `defaultSettingsForm` / `auxiliarySettingsForm` / `defaultVariantForm` | `""` | *SettingsForm / DefaultVariantForm (ссылки) | +| `variantsStorage` / `settingsStorage` | `""` | VariantsStorage / SettingsStorage (напр. `SettingsStorage.ХранилищеВариантовОтчетов`) | +| `extendedPresentation` / `explanation` | пусто | ExtendedPresentation / Explanation (ML) | +| `includeHelpInContents` | `false` | IncludeHelpInContents | +| `attributes` | `[]` | → Attribute в ChildObjects | +| `tabularSections` | `{}` | → TabularSection в ChildObjects | + +> **`useStandardCommands`** управляет доступностью объекта через стандартный командный интерфейс. Дефолт `true` +> (авторски-безопасно). При `false` и без переопределения размещения команд/подсистем отчёт доступен пользователю +> только по навигационной ссылке (в типовых часто `false` — доступ идёт через панель отчётов БСП/командный интерфейс подсистемы). + +Ссылки на формы/схемы/хранилища пишутся **verbatim** (без прощающего резолва — имя формы может быть буквально «Форма»). +Модули: `Ext/ObjectModule.bsl` (пустой). + +```json +{ "type": "Report", "name": "АнализПродаж", "comment": "(Демо)", "useStandardCommands": false, + "mainDataCompositionSchema": "Report.АнализПродаж.Template.ОсновнаяСхемаКомпоновкиДанных", + "variantsStorage": "SettingsStorage.ХранилищеВариантовОтчетов", + "attributes": ["Период: StandardPeriod", { "name": "Данные", "type": "" }] } +``` + +### 7.12 DataProcessor (Обработка) + +| Поле JSON | Умолчание | XML элемент | +|-----------|----------|-------------| +| `comment` | пусто | Comment | +| `useStandardCommands` | `true` | UseStandardCommands (см. ремарку у Report) | +| `defaultForm` / `auxiliaryForm` | `""` | DefaultForm / AuxiliaryForm (ссылка verbatim) | +| `extendedPresentation` / `explanation` | пусто | ExtendedPresentation / Explanation (ML) | +| `includeHelpInContents` | `false` | IncludeHelpInContents | | `attributes` | `[]` | → Attribute в ChildObjects | | `tabularSections` | `{}` | → TabularSection в ChildObjects | Модули: `Ext/ObjectModule.bsl` (пустой). ```json -{ "type": "Report", "name": "ОстаткиТоваров", "attributes": ["НачалоПериода: Date", "КонецПериода: Date"] } +{ "type": "DataProcessor", "name": "ЗагрузкаТаблиц", "useStandardCommands": false, + "attributes": [{ "name": "Таблица", "type": "ValueTree" }, { "name": "Произвольные", "type": "" }] } ``` -### 7.12 DataProcessor - -| Поле JSON | Умолчание | XML элемент | -|-----------|----------|-------------| -| `defaultForm` | `""` | DefaultForm | -| `auxiliaryForm` | `""` | AuxiliaryForm | -| `attributes` | `[]` | → Attribute в ChildObjects | -| `tabularSections` | `{}` | → TabularSection в ChildObjects | - -Модули: `Ext/ObjectModule.bsl` (пустой). - -```json -{ "type": "DataProcessor", "name": "ЗагрузкаДанных", "attributes": ["ПутьКФайлу: String(500)"] } -``` +**Типы реквизитов обработок/отчётов** (помимо общих §3): пустой `type: ""` → реквизит без типа (``, +значение заполнения nil); платформенные коллекции `ValueTable`/`ValueTree`/`ValueList`(=ValueListType)/`StandardPeriod` +→ `v8:`-префикс; типы current-config `ConstantsSet`/`ReportBuilder`/`CatalogObject.X`/`DataProcessorObject.X`/… → +`cfg:`-префикс; `Chart`/`SettingsComposer`/`SpreadsheetDocument` → выделенное пространство имён. ### 7.13 ExchangePlan diff --git a/tests/skills/cases/meta-compile/data-processor-full.json b/tests/skills/cases/meta-compile/data-processor-full.json new file mode 100644 index 00000000..c83bd4b4 --- /dev/null +++ b/tests/skills/cases/meta-compile/data-processor-full.json @@ -0,0 +1,21 @@ +{ + "name": "Обработка — полный набор возможностей", + "input": { + "type": "DataProcessor", + "name": "ЗагрузкаТаблиц", + "comment": "(Демо)", + "useStandardCommands": false, + "defaultForm": "DataProcessor.ЗагрузкаТаблиц.Form.Форма", + "attributes": [ + { "name": "Таблица", "type": "ValueTree" }, + { "name": "Произвольные", "type": "" } + ], + "tabularSections": { + "Строки": ["Наименование: String(100)", { "name": "Значение", "type": "" }] + } + }, + "validatePath": "DataProcessors/ЗагрузкаТаблиц", + "expect": { + "files": ["DataProcessors/ЗагрузкаТаблиц.xml"] + } +} diff --git a/tests/skills/cases/meta-compile/report-full.json b/tests/skills/cases/meta-compile/report-full.json new file mode 100644 index 00000000..18a74b13 --- /dev/null +++ b/tests/skills/cases/meta-compile/report-full.json @@ -0,0 +1,22 @@ +{ + "name": "Отчёт — полный набор возможностей", + "input": { + "type": "Report", + "name": "АнализПродаж", + "comment": "(Демо)", + "useStandardCommands": false, + "mainDataCompositionSchema": "Report.АнализПродаж.Template.ОсновнаяСхемаКомпоновкиДанных", + "variantsStorage": "SettingsStorage.ХранилищеВариантовОтчетов", + "defaultForm": "Report.АнализПродаж.Form.Форма", + "extendedPresentation": { "ru": "Анализ продаж", "en": "Sales analysis" }, + "attributes": [ + "Период: StandardPeriod", + { "name": "Данные", "type": "" }, + { "name": "Набор", "type": "ConstantsSet" } + ] + }, + "validatePath": "Reports/АнализПродаж", + "expect": { + "files": ["Reports/АнализПродаж.xml"] + } +} diff --git a/tests/skills/cases/meta-compile/snapshots/data-processor-full/Configuration.xml b/tests/skills/cases/meta-compile/snapshots/data-processor-full/Configuration.xml new file mode 100644 index 00000000..bf1c5c63 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/data-processor-full/Configuration.xml @@ -0,0 +1,252 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + + TestConfig + + + ru + TestConfig + + + + + Version8_3_24 + ManagedApplication + + PlatformApplication + + Russian + + + + + false + false + false + + + + + + + + + + + + + + + + + + + + + + Biometrics + true + + + Location + false + + + BackgroundLocation + false + + + BluetoothPrinters + false + + + WiFiPrinters + false + + + Contacts + false + + + Calendars + false + + + PushNotifications + false + + + LocalNotifications + false + + + InAppPurchases + false + + + PersonalComputerFileExchange + false + + + Ads + false + + + NumberDialing + false + + + CallProcessing + false + + + CallLog + false + + + AutoSendSMS + false + + + ReceiveSMS + false + + + SMSLog + false + + + Camera + false + + + Microphone + false + + + MusicLibrary + false + + + PictureAndVideoLibraries + false + + + AudioPlaybackAndVibration + false + + + BackgroundAudioPlaybackAndVibration + false + + + InstallPackages + false + + + OSBackup + true + + + ApplicationUsageStatistics + false + + + BarcodeScanning + false + + + BackgroundAudioRecording + false + + + AllFilesAccess + false + + + Videoconferences + false + + + NFC + false + + + DocumentScanning + false + + + SpeechToText + false + + + Geofences + false + + + IncomingShareRequests + false + + + AllIncomingShareRequestsTypesProcessing + false + + + + + + Normal + + + Language.Русский + + + + + + Managed + NotAutoFree + DontUse + DontUse + TaxiEnableVersion8_2 + DontUse + Version8_3_24 + + + + Русский + ЗагрузкаТаблиц + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-compile/snapshots/data-processor-full/DataProcessors/ЗагрузкаТаблиц.xml b/tests/skills/cases/meta-compile/snapshots/data-processor-full/DataProcessors/ЗагрузкаТаблиц.xml new file mode 100644 index 00000000..bc08c43b --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/data-processor-full/DataProcessors/ЗагрузкаТаблиц.xml @@ -0,0 +1,227 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + + ЗагрузкаТаблиц + + + ru + Загрузка таблиц + + + (Демо) + false + DataProcessor.ЗагрузкаТаблиц.Form.Форма + + false + + + + + + + Таблица + + + ru + Таблица + + + + + v8:ValueTree + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + Произвольные + + + ru + Произвольные + + + + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + + UUID-009 + UUID-010 + + + UUID-011 + UUID-012 + + + + Строки + + + ru + Строки + + + + + DontCheck + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + + + + Наименование + + + ru + Наименование + + + + + xs:string + + 100 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + Значение + + + ru + Значение + + + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + + + diff --git a/tests/skills/cases/meta-compile/snapshots/data-processor-full/DataProcessors/ЗагрузкаТаблиц/Ext/ManagerModule.bsl b/tests/skills/cases/meta-compile/snapshots/data-processor-full/DataProcessors/ЗагрузкаТаблиц/Ext/ManagerModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/meta-compile/snapshots/data-processor-full/DataProcessors/ЗагрузкаТаблиц/Ext/ObjectModule.bsl b/tests/skills/cases/meta-compile/snapshots/data-processor-full/DataProcessors/ЗагрузкаТаблиц/Ext/ObjectModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/meta-compile/snapshots/data-processor-full/Ext/ClientApplicationInterface.xml b/tests/skills/cases/meta-compile/snapshots/data-processor-full/Ext/ClientApplicationInterface.xml new file mode 100644 index 00000000..3c1161b2 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/data-processor-full/Ext/ClientApplicationInterface.xml @@ -0,0 +1,18 @@ + + + + + UUID-002 + + + + + UUID-004 + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-compile/snapshots/data-processor-full/Languages/Русский.xml b/tests/skills/cases/meta-compile/snapshots/data-processor-full/Languages/Русский.xml new file mode 100644 index 00000000..37c60d78 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/data-processor-full/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-compile/snapshots/data-processor/DataProcessors/ЗагрузкаДанных.xml b/tests/skills/cases/meta-compile/snapshots/data-processor/DataProcessors/ЗагрузкаДанных.xml index 73d08718..83d7e4e1 100644 --- a/tests/skills/cases/meta-compile/snapshots/data-processor/DataProcessors/ЗагрузкаДанных.xml +++ b/tests/skills/cases/meta-compile/snapshots/data-processor/DataProcessors/ЗагрузкаДанных.xml @@ -20,7 +20,7 @@ - false + true false diff --git a/tests/skills/cases/meta-compile/snapshots/report-full/Configuration.xml b/tests/skills/cases/meta-compile/snapshots/report-full/Configuration.xml new file mode 100644 index 00000000..427ccca9 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/report-full/Configuration.xml @@ -0,0 +1,252 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + + TestConfig + + + ru + TestConfig + + + + + Version8_3_24 + ManagedApplication + + PlatformApplication + + Russian + + + + + false + false + false + + + + + + + + + + + + + + + + + + + + + + Biometrics + true + + + Location + false + + + BackgroundLocation + false + + + BluetoothPrinters + false + + + WiFiPrinters + false + + + Contacts + false + + + Calendars + false + + + PushNotifications + false + + + LocalNotifications + false + + + InAppPurchases + false + + + PersonalComputerFileExchange + false + + + Ads + false + + + NumberDialing + false + + + CallProcessing + false + + + CallLog + false + + + AutoSendSMS + false + + + ReceiveSMS + false + + + SMSLog + false + + + Camera + false + + + Microphone + false + + + MusicLibrary + false + + + PictureAndVideoLibraries + false + + + AudioPlaybackAndVibration + false + + + BackgroundAudioPlaybackAndVibration + false + + + InstallPackages + false + + + OSBackup + true + + + ApplicationUsageStatistics + false + + + BarcodeScanning + false + + + BackgroundAudioRecording + false + + + AllFilesAccess + false + + + Videoconferences + false + + + NFC + false + + + DocumentScanning + false + + + SpeechToText + false + + + Geofences + false + + + IncomingShareRequests + false + + + AllIncomingShareRequestsTypesProcessing + false + + + + + + Normal + + + Language.Русский + + + + + + Managed + NotAutoFree + DontUse + DontUse + TaxiEnableVersion8_2 + DontUse + Version8_3_24 + + + + Русский + АнализПродаж + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-compile/snapshots/report-full/Ext/ClientApplicationInterface.xml b/tests/skills/cases/meta-compile/snapshots/report-full/Ext/ClientApplicationInterface.xml new file mode 100644 index 00000000..3c1161b2 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/report-full/Ext/ClientApplicationInterface.xml @@ -0,0 +1,18 @@ + + + + + UUID-002 + + + + + UUID-004 + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-compile/snapshots/report-full/Languages/Русский.xml b/tests/skills/cases/meta-compile/snapshots/report-full/Languages/Русский.xml new file mode 100644 index 00000000..37c60d78 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/report-full/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-compile/snapshots/report-full/Reports/АнализПродаж.xml b/tests/skills/cases/meta-compile/snapshots/report-full/Reports/АнализПродаж.xml new file mode 100644 index 00000000..7ab1134b --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/report-full/Reports/АнализПродаж.xml @@ -0,0 +1,148 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + + АнализПродаж + + + ru + Анализ продаж + + + (Демо) + false + Report.АнализПродаж.Form.Форма + + Report.АнализПродаж.Template.ОсновнаяСхемаКомпоновкиДанных + + + + SettingsStorage.ХранилищеВариантовОтчетов + + false + + + ru + Анализ продаж + + + en + Sales analysis + + + + + + + + Период + + + ru + Период + + + + + v8:StandardPeriod + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + Данные + + + ru + Данные + + + + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + Набор + + + ru + Набор + + + + + cfg:ConstantsSet + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + diff --git a/tests/skills/cases/meta-compile/snapshots/report-full/Reports/АнализПродаж/Ext/ManagerModule.bsl b/tests/skills/cases/meta-compile/snapshots/report-full/Reports/АнализПродаж/Ext/ManagerModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/meta-compile/snapshots/report-full/Reports/АнализПродаж/Ext/ObjectModule.bsl b/tests/skills/cases/meta-compile/snapshots/report-full/Reports/АнализПродаж/Ext/ObjectModule.bsl new file mode 100644 index 00000000..e69de29b