From 5f53c3f02e78d3ff60ba218e52b4e47a4a1ff395 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Fri, 3 Jul 2026 13:46:14 +0300 Subject: [PATCH] =?UTF-8?q?feat(meta-compile,meta-decompile):=20=D0=B1?= =?UTF-8?q?=D0=B0=D1=82=D1=87=20object-=D1=81=D0=B2=D0=BE=D0=B9=D1=81?= =?UTF-8?q?=D1=82=D0=B2=20=D1=80=D0=B5=D0=BA=D0=B2=D0=B8=D0=B7=D0=B8=D1=82?= =?UTF-8?q?=D0=B0=20(=D0=BA=D0=BE=D0=BD=D1=81=D0=B8=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=BD=D0=BE=20=D1=81=20form)=20(v1.21/v0.6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Раундтрип-кластер extra-свойств реквизита. Компилятор хардкодил дефолты, реальные значения варьируются (корпус 32642 реквизита): FullTextSearch DontUse 10531, Comment 7993, Mask 1489, Format/EditFormat 684/686, Use ForFolderAndItem 1299, CreateOnInput/QuickChoice/FillFromFillingValue/ DataHistory. По философии DSL — в объектную форму (shorthand несёт только частое: req/index/multiline). Object-ключи (omit-on-default), имена согласованы с form-compile где применимо: comment, fullTextSearch, mask, format/editFormat (ML), use, createOnInput, quickChoice, dataHistory, fillFromFillingValue, passwordMode, choiceHistoryOnInput. Прощающий ввод: fillCheck→fillChecking (bool true→ShowError), quickChoice bool (true→Use/false→DontUse). Emit-Attribute параметризован; декомпилятор переключается на object-форму при любом непокрытом свойстве. spec v2.6 §4.2 (полная таблица ключей); тест-кейс catalog-attr-props. Валидация: PS==PY паритет; категории батча 0 (FullTextSearch/Comment/Mask/Format/Use/...); полный прогон −68458 (161917→93459); регресс 37/37 (ps+py); 1С-cert зелёный. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../meta-compile/scripts/meta-compile.ps1 | 48 +++- .../meta-compile/scripts/meta-compile.py | 53 +++- .../meta-decompile/scripts/meta-decompile.ps1 | 25 +- docs/meta-dsl-spec.md | 22 +- .../meta-compile/catalog-attr-props.json | 14 + .../Catalogs/Контрагенты.xml | 191 +++++++++++++ .../Catalogs/Контрагенты/Ext/ObjectModule.bsl | 0 .../catalog-attr-props/Configuration.xml | 252 ++++++++++++++++++ .../Ext/ClientApplicationInterface.xml | 18 ++ .../catalog-attr-props/Languages/Русский.xml | 16 ++ 10 files changed, 610 insertions(+), 29 deletions(-) create mode 100644 tests/skills/cases/meta-compile/catalog-attr-props.json create mode 100644 tests/skills/cases/meta-compile/snapshots/catalog-attr-props/Catalogs/Контрагенты.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/catalog-attr-props/Catalogs/Контрагенты/Ext/ObjectModule.bsl create mode 100644 tests/skills/cases/meta-compile/snapshots/catalog-attr-props/Configuration.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/catalog-attr-props/Ext/ClientApplicationInterface.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/catalog-attr-props/Languages/Русский.xml diff --git a/.claude/skills/meta-compile/scripts/meta-compile.ps1 b/.claude/skills/meta-compile/scripts/meta-compile.ps1 index f16536fd..6db2c78d 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.ps1 +++ b/.claude/skills/meta-compile/scripts/meta-compile.ps1 @@ -641,8 +641,13 @@ function Parse-AttributeShorthand { return $parsed } - # Object form. synonym/tooltip — сквозной проброс (строка ИЛИ объект {ru,en}), НЕ стрингифаим. + # Object form. synonym/tooltip/format/editFormat — сквозной проброс (строка ИЛИ {ru,en}), НЕ стрингифаим. + # fillCheck — синоним fillChecking (из формы; bool true→ShowError). quickChoice — прощаем bool (true→Use, false→DontUse). $name = "$($val.name)" + $fc = if ($val.fillChecking) { "$($val.fillChecking)" } + elseif ($null -ne $val.fillCheck) { if ($val.fillCheck -is [bool]) { if ($val.fillCheck) { 'ShowError' } else { '' } } else { "$($val.fillCheck)" } } + else { "" } + $qc = if ($null -ne $val.quickChoice) { if ($val.quickChoice -is [bool]) { if ($val.quickChoice) { 'Use' } else { 'DontUse' } } else { "$($val.quickChoice)" } } else { "" } return @{ name = $name type = Build-TypeStr $val @@ -650,10 +655,20 @@ function Parse-AttributeShorthand { tooltip = $val.tooltip comment = if ($val.comment) { "$($val.comment)" } else { "" } flags = @(if ($val.flags) { $val.flags } else { @() }) - fillChecking = if ($val.fillChecking) { "$($val.fillChecking)" } else { "" } + fillChecking = $fc indexing = if ($val.indexing) { "$($val.indexing)" } else { "" } multiLine = if ($val.multiLine -eq $true) { $true } else { $false } choiceHistoryOnInput = if ($val.choiceHistoryOnInput) { "$($val.choiceHistoryOnInput)" } else { "" } + fullTextSearch = if ($val.fullTextSearch) { "$($val.fullTextSearch)" } else { "" } + fillFromFillingValue = if ($val.fillFromFillingValue -eq $true) { $true } else { $false } + createOnInput = if ($val.createOnInput) { "$($val.createOnInput)" } else { "" } + quickChoice = $qc + dataHistory = if ($val.dataHistory) { "$($val.dataHistory)" } else { "" } + use = if ($val.use) { "$($val.use)" } else { "" } + passwordMode = if ($val.passwordMode -eq $true) { $true } else { $false } + format = $val.format + editFormat = $val.editFormat + mask = if ($val.mask) { "$($val.mask)" } else { "" } } } @@ -977,7 +992,7 @@ function Emit-Attribute { X "$indent`t" X "$indent`t`t$(Esc-Xml $parsed.name)" Emit-MLText "$indent`t`t" "Synonym" $parsed.synonym - X "$indent`t`t" + if ($parsed.comment) { X "$indent`t`t$(Esc-XmlText $parsed.comment)" } else { X "$indent`t`t" } # Type $typeStr = $parsed.type @@ -990,12 +1005,13 @@ function Emit-Attribute { X "$indent`t`t" } - X "$indent`t`tfalse" - X "$indent`t`t" - X "$indent`t`t" + $pwMode = if ($parsed.passwordMode -eq $true) { "true" } else { "false" } + X "$indent`t`t$pwMode" + Emit-MLText "$indent`t`t" "Format" $parsed.format + Emit-MLText "$indent`t`t" "EditFormat" $parsed.editFormat Emit-MLText "$indent`t`t" "ToolTip" $parsed.tooltip X "$indent`t`tfalse" - X "$indent`t`t" + if ($parsed.mask) { X "$indent`t`t$(Esc-XmlText $parsed.mask)" } else { X "$indent`t`t" } $multiLine = if ($parsed.multiLine -eq $true -or $parsed.flags -contains "multiline") { "true" } else { "false" } X "$indent`t`t$multiLine" X "$indent`t`tfalse" @@ -1005,7 +1021,8 @@ function Emit-Attribute { # FillFromFillingValue — not for tabular/processor/chart/register-other # (Chart*, AccumulationRegister/AccountingRegister/CalculationRegister don't support these) if ($context -notin @("tabular", "processor", "chart", "register-other")) { - X "$indent`t`tfalse" + $ffv = if ($parsed.fillFromFillingValue -eq $true) { "true" } else { "false" } + X "$indent`t`t$ffv" } # FillValue — same restriction @@ -1022,8 +1039,10 @@ function Emit-Attribute { X "$indent`t`tItems" X "$indent`t`t" X "$indent`t`t" - X "$indent`t`tAuto" - X "$indent`t`tAuto" + $qc = if ($parsed.quickChoice) { $parsed.quickChoice } else { "Auto" } + X "$indent`t`t$qc" + $coi = if ($parsed.createOnInput) { $parsed.createOnInput } else { "Auto" } + X "$indent`t`t$coi" X "$indent`t`t" X "$indent`t`t" $chi = if ($parsed.choiceHistoryOnInput) { $parsed.choiceHistoryOnInput } else { "Auto" } @@ -1031,7 +1050,8 @@ function Emit-Attribute { # Use — only for catalog top-level attributes if ($context -eq "catalog") { - X "$indent`t`tForItem" + $use = if ($parsed.use) { $parsed.use } else { "ForItem" } + X "$indent`t`t$use" } # Indexing/FullTextSearch/DataHistory — not for non-stored objects (processor, processor-tabular) @@ -1042,10 +1062,12 @@ function Emit-Attribute { if ($parsed.indexing) { $indexing = $parsed.indexing } X "$indent`t`t$indexing" - X "$indent`t`tUse" + $fts = if ($parsed.fullTextSearch) { $parsed.fullTextSearch } else { "Use" } + X "$indent`t`t$fts" # DataHistory — not for Chart* types and non-InformationRegister register family if ($context -notin @("chart", "register-other")) { - X "$indent`t`tUse" + $dh = if ($parsed.dataHistory) { $parsed.dataHistory } else { "Use" } + X "$indent`t`t$dh" } } diff --git a/.claude/skills/meta-compile/scripts/meta-compile.py b/.claude/skills/meta-compile/scripts/meta-compile.py index 486ca3ab..424d2bf1 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.py +++ b/.claude/skills/meta-compile/scripts/meta-compile.py @@ -644,6 +644,17 @@ def parse_attribute_shorthand(val): return parsed # Object form. synonym/tooltip — сквозной проброс (строка ИЛИ dict {ru,en}), НЕ стрингифаим. name = str(val.get('name', '')) + # fillCheck — синоним fillChecking (bool true→ShowError). quickChoice — прощаем bool (true→Use, false→DontUse). + if val.get('fillChecking'): + fc = str(val['fillChecking']) + elif val.get('fillCheck') is not None: + fc = ('ShowError' if val['fillCheck'] else '') if isinstance(val['fillCheck'], bool) else str(val['fillCheck']) + else: + fc = '' + if val.get('quickChoice') is not None: + qc = ('Use' if val['quickChoice'] else 'DontUse') if isinstance(val['quickChoice'], bool) else str(val['quickChoice']) + else: + qc = '' return { 'name': name, 'type': build_type_str(val), @@ -651,10 +662,20 @@ def parse_attribute_shorthand(val): 'tooltip': val.get('tooltip'), 'comment': str(val['comment']) if val.get('comment') else '', 'flags': list(val.get('flags', [])), - 'fillChecking': str(val['fillChecking']) if val.get('fillChecking') else '', + 'fillChecking': fc, 'indexing': str(val['indexing']) if val.get('indexing') else '', 'multiLine': True if val.get('multiLine') is True else False, 'choiceHistoryOnInput': str(val['choiceHistoryOnInput']) if val.get('choiceHistoryOnInput') else '', + 'fullTextSearch': str(val['fullTextSearch']) if val.get('fullTextSearch') else '', + 'fillFromFillingValue': True if val.get('fillFromFillingValue') is True else False, + 'createOnInput': str(val['createOnInput']) if val.get('createOnInput') else '', + 'quickChoice': qc, + 'dataHistory': str(val['dataHistory']) if val.get('dataHistory') else '', + 'use': str(val['use']) if val.get('use') else '', + 'passwordMode': True if val.get('passwordMode') is True else False, + 'format': val.get('format'), + 'editFormat': val.get('editFormat'), + 'mask': str(val['mask']) if val.get('mask') else '', } def parse_enum_value_shorthand(val): @@ -974,7 +995,10 @@ def emit_attribute(indent, parsed, context): X(f'{indent}\t') X(f'{indent}\t\t{esc_xml(parsed["name"])}') emit_mltext(f'{indent}\t\t', 'Synonym', parsed['synonym']) - X(f'{indent}\t\t') + if parsed.get('comment'): + X(f'{indent}\t\t{esc_xml_text(parsed["comment"])}') + else: + X(f'{indent}\t\t') type_str = parsed['type'] if type_str: emit_value_type(f'{indent}\t\t', type_str) @@ -982,12 +1006,16 @@ def emit_attribute(indent, parsed, context): X(f'{indent}\t\t') X(f'{indent}\t\t\txs:string') X(f'{indent}\t\t') - X(f'{indent}\t\tfalse') - X(f'{indent}\t\t') - X(f'{indent}\t\t') + pw_mode = 'true' if parsed.get('passwordMode') is True else 'false' + X(f'{indent}\t\t{pw_mode}') + emit_mltext(f'{indent}\t\t', 'Format', parsed.get('format')) + emit_mltext(f'{indent}\t\t', 'EditFormat', parsed.get('editFormat')) emit_mltext(f'{indent}\t\t', 'ToolTip', parsed.get('tooltip')) X(f'{indent}\t\tfalse') - X(f'{indent}\t\t') + if parsed.get('mask'): + X(f'{indent}\t\t{esc_xml_text(parsed["mask"])}') + else: + X(f'{indent}\t\t') multi_line = 'true' if (parsed.get('multiLine') is True or 'multiline' in parsed.get('flags', [])) else 'false' X(f'{indent}\t\t{multi_line}') X(f'{indent}\t\tfalse') @@ -996,7 +1024,8 @@ def emit_attribute(indent, parsed, context): # 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'): - X(f'{indent}\t\tfalse') + ffv = 'true' if parsed.get('fillFromFillingValue') is True else 'false' + X(f'{indent}\t\t{ffv}') if context not in ('tabular', 'processor', 'chart', 'register-other'): emit_fill_value(f'{indent}\t\t', type_str) fill_checking = 'DontCheck' @@ -1008,14 +1037,14 @@ def emit_attribute(indent, parsed, context): X(f'{indent}\t\tItems') X(f'{indent}\t\t') X(f'{indent}\t\t') - X(f'{indent}\t\tAuto') - X(f'{indent}\t\tAuto') + X(f'{indent}\t\t{parsed.get("quickChoice") or "Auto"}') + X(f'{indent}\t\t{parsed.get("createOnInput") or "Auto"}') X(f'{indent}\t\t') X(f'{indent}\t\t') chi = parsed.get('choiceHistoryOnInput') or 'Auto' X(f'{indent}\t\t{chi}') if context == 'catalog': - X(f'{indent}\t\tForItem') + X(f'{indent}\t\t{parsed.get("use") or "ForItem"}') if context not in ('processor', 'processor-tabular'): indexing = 'DontIndex' if 'index' in parsed.get('flags', []): @@ -1025,10 +1054,10 @@ def emit_attribute(indent, parsed, context): if parsed.get('indexing'): indexing = parsed['indexing'] X(f'{indent}\t\t{indexing}') - X(f'{indent}\t\tUse') + X(f'{indent}\t\t{parsed.get("fullTextSearch") or "Use"}') # DataHistory — not for Chart* types and non-InformationRegister register family if context not in ('chart', 'register-other'): - X(f'{indent}\t\tUse') + X(f'{indent}\t\t{parsed.get("dataHistory") or "Use"}') X(f'{indent}\t') X(f'{indent}') diff --git a/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 b/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 index 57d0932a..cbf6e1ac 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.5 — XML объекта метаданных 1С → JSON-черновик формата meta-compile +# meta-decompile v0.6 — XML объекта метаданных 1С → JSON-черновик формата meta-compile # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # # Пилот: только Catalog. Инверс meta-compile (omit-on-default: ключ эмитим только @@ -195,18 +195,37 @@ function Attr-ToDsl { if ($ix) { if ($ix.InnerText -eq 'Index') { $flags += 'index' } elseif ($ix.InnerText -eq 'IndexWithAdditionalOrder') { $flags += 'indexAdditional' } } $ml = $ap.SelectSingleNode('md:MultiLine', $nsm); if ($ml -and $ml.InnerText -eq 'true') { $flags += 'multiline' } - # Синоним/подсказка (строка ru-only ИЛИ {ru,en}). Кастомный синоним ИЛИ наличие подсказки → object-форма. + # Синоним/подсказка (строка ru-only ИЛИ {ru,en}). $synVal = Get-MLValue ($ap.SelectSingleNode('md:Synonym', $nsm)) $synCustom = $false if ($synVal -is [string]) { if ($synVal -ne (Split-CamelWords $nm)) { $synCustom = $true } } elseif ($null -ne $synVal) { $synCustom = $true } # {ru,en} = всегда кастом $ttVal = Get-MLValue ($ap.SelectSingleNode('md:ToolTip', $nsm)) - if ($synCustom -or ($null -ne $ttVal)) { + # Extra-свойства реквизита (omit-on-default). Наличие любого → object-форма. + # $en(tag) → InnerText узла или $null. + $en = { param($tag) $n = $ap.SelectSingleNode("md:$tag", $nsm); if ($n) { $n.InnerText } else { $null } } + $extra = [ordered]@{} + $v = & $en 'Comment'; if ($v) { $extra['comment'] = $v } + $v = & $en 'FullTextSearch'; if ($v -and $v -ne 'Use') { $extra['fullTextSearch'] = $v } + $v = & $en 'FillFromFillingValue'; if ($v -eq 'true') { $extra['fillFromFillingValue'] = $true } + $v = & $en 'CreateOnInput'; if ($v -and $v -ne 'Auto') { $extra['createOnInput'] = $v } + $v = & $en 'QuickChoice'; if ($v -and $v -ne 'Auto') { $extra['quickChoice'] = $v } + $v = & $en 'DataHistory'; if ($v -and $v -ne 'Use') { $extra['dataHistory'] = $v } + $v = & $en 'Use'; if ($v -and $v -ne 'ForItem') { $extra['use'] = $v } + $v = & $en 'PasswordMode'; if ($v -eq 'true') { $extra['passwordMode'] = $true } + $v = & $en 'Mask'; if ($v) { $extra['mask'] = $v } + $v = & $en 'ChoiceHistoryOnInput'; if ($v -and $v -ne 'Auto') { $extra['choiceHistoryOnInput'] = $v } + $v = & $en 'FillChecking'; if ($v -eq 'ShowWarning') { $extra['fillChecking'] = 'ShowWarning' } + $fmtV = Get-MLValue ($ap.SelectSingleNode('md:Format', $nsm)); if ($null -ne $fmtV) { $extra['format'] = $fmtV } + $efmtV = Get-MLValue ($ap.SelectSingleNode('md:EditFormat', $nsm)); if ($null -ne $efmtV) { $extra['editFormat'] = $efmtV } + + if ($synCustom -or ($null -ne $ttVal) -or $extra.Count -gt 0) { $o = [ordered]@{ name = $nm } if ($ts) { $o['type'] = $ts } if ($synCustom) { $o['synonym'] = $synVal } if ($null -ne $ttVal) { $o['tooltip'] = $ttVal } + foreach ($k in $extra.Keys) { $o[$k] = $extra[$k] } if ($flags.Count -gt 0) { $o['flags'] = [System.Collections.ArrayList]@($flags) } return $o } diff --git a/docs/meta-dsl-spec.md b/docs/meta-dsl-spec.md index 40f04b0f..87de4782 100644 --- a/docs/meta-dsl-spec.md +++ b/docs/meta-dsl-spec.md @@ -1,6 +1,6 @@ # Meta DSL — спецификация JSON-формата для объектов метаданных 1С -Версия: 2.5 +Версия: 2.6 ## Обзор @@ -137,6 +137,26 @@ JSON DSL для описания объектов метаданных конф **`synonym` и `tooltip` — ML-значения** (см. §4.4): строка → русский текст; объект `{ "ru": "…", "en": "…" }` → мультиязычный (`` на язык, в порядке ключей). `tooltip` → `` реквизита; нет ключа → `` (пусто). `synonym` не задан → авто из имени (§2). +Полный набор ключей объектной формы (omit-on-default; имена согласованы с form-compile, где применимо): + +| Ключ | XML | Умолчание | Значения | +|------|-----|-----------|----------| +| `synonym` / `tooltip` | Synonym / ToolTip | авто / пусто | ML (§4.4) | +| `comment` | Comment | пусто | строка | +| `fillChecking` | FillChecking | DontCheck | DontCheck/ShowError/ShowWarning. Синоним `fillCheck` (из формы; `true`→ShowError). Флаг `req`→ShowError | +| `fullTextSearch` | FullTextSearch | Use | Use/DontUse | +| `fillFromFillingValue` | FillFromFillingValue | false | bool | +| `createOnInput` | CreateOnInput | Auto | Auto/Use/DontUse | +| `quickChoice` | QuickChoice | Auto | Auto/Use/DontUse. Прощаем bool (форм-стиль): `true`→Use, `false`→DontUse | +| `dataHistory` | DataHistory | Use | Use/DontUse | +| `use` | Use | ForItem | ForItem/ForFolderAndItem/ForFolder (иерарх. каталог) | +| `passwordMode` | PasswordMode | false | bool | +| `mask` | Mask | пусто | строка маски | +| `format` / `editFormat` | Format / EditFormat | пусто | строка/`{ru,en}` (ML, форматная строка 1С) | +| `choiceHistoryOnInput` | ChoiceHistoryOnInput | Auto | Auto/DontUse | +| `indexing` | Indexing | DontIndex | флаги `index`/`indexAdditional` | +| `multiLine` | MultiLine | false | bool (флаг `multiline`) | + Тип можно задать единой строкой (`"type": "String(100)"`) или раздельными полями: ```json diff --git a/tests/skills/cases/meta-compile/catalog-attr-props.json b/tests/skills/cases/meta-compile/catalog-attr-props.json new file mode 100644 index 00000000..ca9064f0 --- /dev/null +++ b/tests/skills/cases/meta-compile/catalog-attr-props.json @@ -0,0 +1,14 @@ +{ + "name": "Справочник с расширенными свойствами реквизита", + "input": { + "type": "Catalog", "name": "Контрагенты", "hierarchical": true, + "attributes": [ + { "name": "ИНН", "type": "String(12)", "fullTextSearch": "DontUse", "comment": "Налоговый номер", + "mask": "999999999999", "use": "ForFolderAndItem", "fillCheck": true }, + { "name": "Курс", "type": "Number(15,4)", "format": "ЧДЦ=4", "editFormat": { "ru": "ЧДЦ=4" }, + "createOnInput": "Use", "quickChoice": false, "fillFromFillingValue": true, "dataHistory": "DontUse", "passwordMode": true } + ] + }, + "validatePath": "Catalogs/Контрагенты", + "expect": { "files": ["Catalogs/Контрагенты.xml"] } +} diff --git a/tests/skills/cases/meta-compile/snapshots/catalog-attr-props/Catalogs/Контрагенты.xml b/tests/skills/cases/meta-compile/snapshots/catalog-attr-props/Catalogs/Контрагенты.xml new file mode 100644 index 00000000..a21d3a0e --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/catalog-attr-props/Catalogs/Контрагенты.xml @@ -0,0 +1,191 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + + Контрагенты + + + ru + Контрагенты + + + + true + HierarchyFoldersAndItems + false + 2 + true + true + + ToItems + 9 + 25 + String + Variable + WholeCatalog + false + true + AsDescription + + Auto + InDialog + false + BothWays + + Catalog.Контрагенты.StandardAttribute.Description + Catalog.Контрагенты.StandardAttribute.Code + + Begin + DontUse + Directly + + + + + + + + + + + false + + + Automatic + Use + + + + + + DontUse + Auto + DontUse + false + false + + + + + ИНН + + + ru + Инн + + + Налоговый номер + + xs:string + + 12 + Variable + + + false + + + + false + 999999999999 + false + false + + + false + + ShowError + Items + + + Auto + Auto + + + Auto + ForFolderAndItem + DontIndex + DontUse + Use + + + + + Курс + + + ru + Курс + + + + + xs:decimal + + 15 + 4 + Any + + + true + + + ru + ЧДЦ=4 + + + + + ru + ЧДЦ=4 + + + + false + + false + false + + + true + 0 + DontCheck + Items + + + DontUse + Use + + + Auto + ForItem + DontIndex + Use + DontUse + + + + + diff --git a/tests/skills/cases/meta-compile/snapshots/catalog-attr-props/Catalogs/Контрагенты/Ext/ObjectModule.bsl b/tests/skills/cases/meta-compile/snapshots/catalog-attr-props/Catalogs/Контрагенты/Ext/ObjectModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/meta-compile/snapshots/catalog-attr-props/Configuration.xml b/tests/skills/cases/meta-compile/snapshots/catalog-attr-props/Configuration.xml new file mode 100644 index 00000000..c07959c0 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/catalog-attr-props/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/catalog-attr-props/Ext/ClientApplicationInterface.xml b/tests/skills/cases/meta-compile/snapshots/catalog-attr-props/Ext/ClientApplicationInterface.xml new file mode 100644 index 00000000..3c1161b2 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/catalog-attr-props/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/catalog-attr-props/Languages/Русский.xml b/tests/skills/cases/meta-compile/snapshots/catalog-attr-props/Languages/Русский.xml new file mode 100644 index 00000000..37c60d78 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/catalog-attr-props/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file