From 253a4fbce064e70e7c9bda2a8e5ed1e71207d0e4 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Wed, 1 Jul 2026 19:48:16 +0300 Subject: [PATCH] =?UTF-8?q?feat(meta-compile,meta-decompile):=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D1=91=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D1=8B=20Catalog=20(Ext/Predefined.xml)=20(v1.19/v0?= =?UTF-8?q?.5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Раундтрип-находка (класс-3, непокрытый блок — крупнейшая категория ~56k). meta-compile вообще не генерил Ext/Predefined.xml. DSL спроектирован по данным корпуса (9309 элементов) + совместно. DSL `predefined` (массив; строка ИЛИ объект): - строка "(Код) Имя [Наименование]": Имя обяз.; Наименование — нет [..] → авто(Split-CamelCase), [] → пусто (системные/placeholder, 29% корпуса), [текст] → задано; - объект (группа/иерархия): name/code/description/isFolder/childItems + рус.синонимы имя/код/наименование/группа/подчиненные (прощающий ввод). - Код: по codeType каталога (Number→xs:decimal, String→без типа), пусто→. meta-compile (дуал-порт): генерация Ext/Predefined.xml (root CatalogPredefinedItems + рекурсия Item). Заодно фикс: Esc-XmlText для ТЕКСТА элемента (& < > без экранирования кавычек — в тексте 1С держит raw). meta-decompile: захват predefined → компактный DSL (строка/объект). Фикс PS-ловушки распаковки одноэлементного @() из if → папки с ОДНИМ ребёнком теряли его. spec meta-dsl-spec.md v2.4 §7.1.2; тест-кейс catalog-predefined. Валидация: PS==PY паритет; predefined-категории 0 (PredefinedData/Item/ChildItems/Description/Code); полный прогон −56620 (218537→161917); регресс 36/36 (ps+py); 1С-cert зелёный (грузится в платформу). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../meta-compile/scripts/meta-compile.ps1 | 68 +++++ .../meta-compile/scripts/meta-compile.py | 67 +++++ .../meta-decompile/scripts/meta-decompile.ps1 | 47 ++-- docs/meta-dsl-spec.md | 41 ++- .../meta-compile/catalog-predefined.json | 15 ++ .../Catalogs/ВидыКонтактов.xml | 91 +++++++ .../ВидыКонтактов/Ext/ObjectModule.bsl | 0 .../Catalogs/ВидыКонтактов/Ext/Predefined.xml | 41 +++ .../catalog-predefined/Configuration.xml | 252 ++++++++++++++++++ .../Ext/ClientApplicationInterface.xml | 18 ++ .../catalog-predefined/Languages/Русский.xml | 16 ++ 11 files changed, 640 insertions(+), 16 deletions(-) create mode 100644 tests/skills/cases/meta-compile/catalog-predefined.json create mode 100644 tests/skills/cases/meta-compile/snapshots/catalog-predefined/Catalogs/ВидыКонтактов.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/catalog-predefined/Catalogs/ВидыКонтактов/Ext/ObjectModule.bsl create mode 100644 tests/skills/cases/meta-compile/snapshots/catalog-predefined/Catalogs/ВидыКонтактов/Ext/Predefined.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/catalog-predefined/Configuration.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/catalog-predefined/Ext/ClientApplicationInterface.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/catalog-predefined/Languages/Русский.xml diff --git a/.claude/skills/meta-compile/scripts/meta-compile.ps1 b/.claude/skills/meta-compile/scripts/meta-compile.ps1 index 7d0683bc..64b33d89 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.ps1 +++ b/.claude/skills/meta-compile/scripts/meta-compile.ps1 @@ -330,6 +330,11 @@ function Esc-Xml { param([string]$s) return $s.Replace('&','&').Replace('<','<').Replace('>','>').Replace('"','"') } +# Эскейп ТЕКСТА элемента: только & < > (кавычки в тексте 1С держит raw, экранирование только для атрибутов). +function Esc-XmlText { + param([string]$s) + return $s.Replace('&','&').Replace('<','<').Replace('>','>') +} # ML-значение: строка → один ru; объект {lang: content} → item на язык (в порядке ключей). function Emit-MLItems { @@ -3070,6 +3075,59 @@ $typesNoSubDir = @("DefinedType","ScheduledJob","EventSubscription") # Object subdirectory: {OutputDir}/{TypePlural}/{Name}/Ext/ $objSubDir = Join-Path $typeDir $objName +# --- Predefined data (Ext/Predefined.xml) --- +# Элемент DSL: строка "(Код) Имя [Наименование]" ЛИБО объект (+ русские синонимы ключей). +# Наименование: нет [..]/ключа → авто(Split-CamelCase Имени); [] / "" → пусто; [текст]/текст → как есть. +function Resolve-PredefItem { + param($val) + if ($val -is [string]) { + $m = [regex]::Match($val, '^\s*(?:\(([^)]*)\)\s*)?(\S+)(?:\s*\[(.*)\])?\s*$') + $name = $m.Groups[2].Value + $code = if ($m.Groups[1].Success) { $m.Groups[1].Value } else { '' } + $desc = if ($m.Groups[3].Success) { $m.Groups[3].Value } else { Split-CamelCase $name } + return @{ name = $name; code = $code; desc = $desc; isFolder = $false; children = @() } + } + # Объектная форма + русские синонимы (прощающий ввод). + $gv = { param($o, [string[]]$keys) foreach ($k in $keys) { if ($o.PSObject.Properties[$k]) { return $o.$k } } return $null } + $name = "$(& $gv $val @('name','имя'))" + $codeV = & $gv $val @('code','код') + $code = if ($null -ne $codeV) { "$codeV" } else { '' } + $hasDesc = $val.PSObject.Properties['description'] -or $val.PSObject.Properties['наименование'] + $descV = & $gv $val @('description','наименование') + $desc = if ($hasDesc) { "$descV" } else { Split-CamelCase $name } # ключа нет → авто; '' → пусто + $folderV = & $gv $val @('isFolder','группа') + $isFolder = ($folderV -eq $true) + $subs = & $gv $val @('childItems','подчиненные') + return @{ name = $name; code = $code; desc = $desc; isFolder = $isFolder; children = @(if ($subs) { $subs } else { @() }) } +} +function Emit-PredefItem { + param($sb, $val, [string]$indent, [string]$codeType) + $r = Resolve-PredefItem $val + [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") } + elseif ($codeType -eq 'Number') { [void]$sb.Append("$indent`t$(Esc-XmlText $r.code)`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$(if ($r.isFolder) { 'true' } else { 'false' })`n") + if ($r.children.Count -gt 0) { + [void]$sb.Append("$indent`t`n") + foreach ($c in $r.children) { Emit-PredefItem $sb $c "$indent`t`t" $codeType } + [void]$sb.Append("$indent`t`n") + } + [void]$sb.Append("$indent`n") +} +function Build-PredefinedXml { + param($items, [string]$xsiType, [string]$codeType) + $sb = New-Object System.Text.StringBuilder + [void]$sb.Append("`n") + [void]$sb.Append("`n") + foreach ($it in $items) { Emit-PredefItem $sb $it "`t" $codeType } + [void]$sb.Append("`n") + return $sb.ToString() +} + $extDir = Join-Path $objSubDir "Ext" if (-not (Test-Path $typeDir)) { @@ -3168,6 +3226,16 @@ if ($objType -eq "BusinessProcess") { } } +# Предопределённые элементы (Ext/Predefined.xml) — пока Catalog. Пусто/нет ключа → файл не создаём. +if ($objType -eq "Catalog" -and $def.predefined -and @($def.predefined).Count -gt 0) { + Ensure-ExtDir + $catCodeType = if ($def.codeType) { "$($def.codeType)" } else { 'String' } + $predefXml = Build-PredefinedXml @($def.predefined) "CatalogPredefinedItems" $catCodeType + $predefPath = Join-Path $extDir "Predefined.xml" + [System.IO.File]::WriteAllText($predefPath, $predefXml, $enc) + $modulesCreated += $predefPath +} + # --- 17. Register in Configuration.xml --- $configXmlPath = Join-Path $OutputDir "Configuration.xml" diff --git a/.claude/skills/meta-compile/scripts/meta-compile.py b/.claude/skills/meta-compile/scripts/meta-compile.py index c254aec9..644e7721 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.py +++ b/.claude/skills/meta-compile/scripts/meta-compile.py @@ -181,6 +181,10 @@ def assert_edit_allowed(target_path, require): def esc_xml(s): return s.replace('&', '&').replace('<', '<').replace('>', '>').replace('"', '"') +def esc_xml_text(s): + # Эскейп ТЕКСТА элемента: только & < > (кавычки в тексте 1С держит raw). + return s.replace('&', '&').replace('<', '<').replace('>', '>') + def new_uuid(): return str(uuid.uuid4()) @@ -2806,6 +2810,60 @@ if obj_type in types_with_module: write_utf8_bom(module_path, '') modules_created.append(module_path) +# --- Predefined data (Ext/Predefined.xml). Элемент: "(Код) Имя [Наименование]" ИЛИ объект (+рус. синонимы). +# Наименование: нет [..]/ключа → авто(Split-CamelCase); [] / "" → пусто; [текст]/текст → как есть. +def resolve_predef_item(val): + if isinstance(val, str): + m = re.match(r'^\s*(?:\(([^)]*)\)\s*)?(\S+)(?:\s*\[(.*)\])?\s*$', val) + name = m.group(2) + code = m.group(1) if m.group(1) is not None else '' + desc = m.group(3) if m.group(3) is not None else split_camel_case(name) + return {'name': name, 'code': code, 'desc': desc, 'isFolder': False, 'children': []} + def gv(keys): + for k in keys: + if k in val: + return val[k] + return None + name = str(gv(['name', 'имя']) or '') + code_v = gv(['code', 'код']) + code = str(code_v) if code_v is not None else '' + has_desc = ('description' in val) or ('наименование' in val) + desc_v = gv(['description', 'наименование']) + desc = ('' if desc_v is None else str(desc_v)) if has_desc else split_camel_case(name) + is_folder = gv(['isFolder', 'группа']) is True + subs = gv(['childItems', 'подчиненные']) or [] + return {'name': name, 'code': code, 'desc': desc, 'isFolder': is_folder, 'children': list(subs)} + +def emit_predef_item(out, val, indent, code_type): + r = resolve_predef_item(val) + out.append(f'{indent}') + out.append(f'{indent}\t{esc_xml_text(r["name"])}') + if not r['code']: + out.append(f'{indent}\t') + elif code_type == 'Number': + out.append(f'{indent}\t{esc_xml_text(r["code"])}') + else: + out.append(f'{indent}\t{esc_xml_text(r["code"])}') + if r['desc'] == '': + out.append(f'{indent}\t') + else: + out.append(f'{indent}\t{esc_xml_text(r["desc"])}') + out.append(f'{indent}\t{"true" if r["isFolder"] else "false"}') + if r['children']: + out.append(f'{indent}\t') + for c in r['children']: + emit_predef_item(out, c, indent + '\t\t', code_type) + out.append(f'{indent}\t') + out.append(f'{indent}') + +def build_predefined_xml(items, xsi_type, code_type): + out = [''] + out.append(f'') + for it in items: + emit_predef_item(out, it, '\t', code_type) + out.append('') + return '\n'.join(out) + '\n' + # Special files if obj_type == 'ExchangePlan': content_path = os.path.join(ext_dir, 'Content.xml') @@ -2823,6 +2881,15 @@ if obj_type == 'BusinessProcess': write_utf8_bom(flowchart_path, flowchart_xml) modules_created.append(flowchart_path) +# Предопределённые элементы (Ext/Predefined.xml) — пока Catalog. +if obj_type == 'Catalog' and defn.get('predefined'): + ensure_ext_dir() + cat_code_type = str(defn['codeType']) if defn.get('codeType') else 'String' + predef_xml = build_predefined_xml(defn['predefined'], 'CatalogPredefinedItems', cat_code_type) + predef_path = os.path.join(ext_dir, 'Predefined.xml') + write_utf8_bom(predef_path, predef_xml) + modules_created.append(predef_path) + # --------------------------------------------------------------------------- # 17. Register in Configuration.xml # --------------------------------------------------------------------------- diff --git a/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 b/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 index 779308cf..57d0932a 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.4 — XML объекта метаданных 1С → JSON-черновик формата meta-compile +# meta-decompile v0.5 — XML объекта метаданных 1С → JSON-черновик формата meta-compile # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # # Пилот: только Catalog. Инверс meta-compile (omit-on-default: ключ эмитим только @@ -310,34 +310,51 @@ if ($childObjs) { } } -# --- Предопределённые (соседний Ext/Predefined.xml). meta-compile пока их НЕ потребляет (пробел DSL). -# ⚠️ ЧЕРНОВАЯ/ВРЕМЕННАЯ форма `predefined` — предложение по факту корпуса, НЕ утверждённый DSL. -# Правило: непокрытый блок проектируем в DSL СНАЧАЛА (совместно), потом переписываем этот захват под него. --- +# --- Предопределённые (соседний Ext/Predefined.xml) → DSL predefined. +# Плоский элемент → строка "(Код) Имя [Наименование]" (Наименование: ==авто → опустить; '' → []; иначе [текст]). +# Группа/иерархия → object {name, [code], [description], isFolder, childItems}. codeType — из свойства каталога. --- $objDir = Split-Path -Parent (Resolve-Path -LiteralPath $ObjectPath).Path $predefPath = Join-Path (Join-Path (Join-Path $objDir $objName) 'Ext') 'Predefined.xml' if (Test-Path -LiteralPath $predefPath) { $pdoc = New-Object System.Xml.XmlDocument $pdoc.Load($predefPath) - function Parse-PredefItem { + function PredefItem-ToDsl { param($itemEl) - $o = [ordered]@{} - $o['name'] = ($itemEl.SelectSingleNode("*[local-name()='Name']")).InnerText + $name = ($itemEl.SelectSingleNode("*[local-name()='Name']")).InnerText $codeEl = $itemEl.SelectSingleNode("*[local-name()='Code']") - if ($codeEl -and $codeEl.InnerText) { $o['code'] = $codeEl.InnerText } + $code = if ($codeEl -and $codeEl.InnerText) { $codeEl.InnerText } else { '' } $descEl = $itemEl.SelectSingleNode("*[local-name()='Description']") - if ($descEl -and $descEl.InnerText) { $o['description'] = $descEl.InnerText } + $desc = if ($descEl) { $descEl.InnerText } else { '' } $folderEl = $itemEl.SelectSingleNode("*[local-name()='IsFolder']") - if ($folderEl -and $folderEl.InnerText -eq 'true') { $o['isFolder'] = $true } + $isFolder = ($folderEl -and $folderEl.InnerText -eq 'true') $childContainer = $itemEl.SelectSingleNode("*[local-name()='ChildItems']") - if ($childContainer) { - $kids = [System.Collections.ArrayList]@() - foreach ($k in @($childContainer.SelectNodes("*[local-name()='Item']"))) { [void]$kids.Add((Parse-PredefItem $k)) } - if ($kids.Count -gt 0) { $o['children'] = $kids } + # ВАЖНО: обернуть весь if в @(), иначе PS распаковывает одноэлементный @(...) из if-блока + # обратно в узел → $kids.Count = $null → папки с ОДНИМ ребёнком теряют его. + $kids = @(if ($childContainer) { $childContainer.SelectNodes("*[local-name()='Item']") } else { @() }) + $auto = Split-CamelWords $name + + if (-not $isFolder -and $kids.Count -eq 0) { + # Плоский → компактная строка. + $s = if ($code) { "($code) $name" } else { $name } + if ($desc -eq '') { $s = "$s []" } + elseif ($desc -ne $auto) { $s = "$s [$desc]" } + return $s + } + # Группа/иерархия → объект. + $o = [ordered]@{ name = $name } + if ($code) { $o['code'] = $code } + if ($desc -eq '') { $o['description'] = '' } + elseif ($desc -ne $auto) { $o['description'] = $desc } + if ($isFolder) { $o['isFolder'] = $true } + if ($kids.Count -gt 0) { + $sub = [System.Collections.ArrayList]@() + foreach ($k in $kids) { [void]$sub.Add((PredefItem-ToDsl $k)) } + $o['childItems'] = $sub } return $o } $rootItems = [System.Collections.ArrayList]@() - foreach ($it in @($pdoc.DocumentElement.SelectNodes("*[local-name()='Item']"))) { [void]$rootItems.Add((Parse-PredefItem $it)) } + foreach ($it in @($pdoc.DocumentElement.SelectNodes("*[local-name()='Item']"))) { [void]$rootItems.Add((PredefItem-ToDsl $it)) } if ($rootItems.Count -gt 0) { $dsl['predefined'] = $rootItems } } diff --git a/docs/meta-dsl-spec.md b/docs/meta-dsl-spec.md index cfbdbf57..18759bc1 100644 --- a/docs/meta-dsl-spec.md +++ b/docs/meta-dsl-spec.md @@ -1,6 +1,6 @@ # Meta DSL — спецификация JSON-формата для объектов метаданных 1С -Версия: 2.3 +Версия: 2.4 ## Обзор @@ -275,6 +275,45 @@ JSON DSL для описания объектов метаданных конф > Пока поддержано для **Catalog**. У прочих типов объектов — свои стандартные реквизиты и профили (будут добавлены при их проработке). +#### 7.1.2 `predefined` — предопределённые элементы + +Массив предопределённых элементов справочника → файл `Ext/Predefined.xml`. Ключа нет / пустой массив → файл не создаётся. Элемент — **строка** (короткая форма, плоский случай) ЛИБО **объект** (группа/иерархия). + +**Строковая форма:** `"(Код) Имя [Наименование]"` +- **Имя** — обязательный идентификатор (без пробелов). +- **`(Код)`** — опциональный префикс. +- **`[Наименование]`** — опциональный суффикс: + - нет `[...]` → Наименование **авто** из Имени (Split-CamelCase, §2); + - `[]` (пусто) → Наименование пустое (для системных/placeholder-элементов); + - `[текст]` → заданное. + +```json +"predefined": [ + "Основной", // Наименование авто = "Основной" + "(1) ДокументОПриемке [Документ о приемке]", // код + имя + Наименование + "ПустоеЗначение []" // Наименование пустое +] +``` + +**Объектная форма** (группа/иерархия): + +| Ключ | Синоним | Описание | +|------|---------|----------| +| `name` | `имя` | Имя (обязательно) | +| `code` | `код` | Код | +| `description` | `наименование` | Наименование (ключа нет → авто; `""` → пусто) | +| `isFolder` | `группа` | Признак группы | +| `childItems` | `подчиненные` | Вложенные элементы (строки/объекты, рекурсивно) | + +```json +{ "name": "Группа1", "isFolder": true, "description": "Прочие", + "childItems": [ "Факс", "(7) Скайп [Скайп]" ] } +``` + +Тип кода в XML определяется свойством каталога `codeType`: `Number` → ``, `String` → `` (без типа); пустой код → ``. + +> Пока поддержано для **Catalog** (`CatalogPredefinedItems`). ChartOf*/ПВХ — при их проработке. + ### 7.2 Document | Поле JSON | Умолчание | XML элемент | diff --git a/tests/skills/cases/meta-compile/catalog-predefined.json b/tests/skills/cases/meta-compile/catalog-predefined.json new file mode 100644 index 00000000..92febf1a --- /dev/null +++ b/tests/skills/cases/meta-compile/catalog-predefined.json @@ -0,0 +1,15 @@ +{ + "name": "Справочник с предопределёнными элементами", + "input": { + "type": "Catalog", "name": "ВидыКонтактов", "codeType": "Number", "codeLength": 3, + "predefined": [ + "Телефон", + "(1) ЭлектроннаяПочта [Электронная почта]", + "ПустоеЗначение []", + { "name": "Группа1", "isFolder": true, "description": "Прочие контакты", + "childItems": [ "Факс", "(7) Скайп [Скайп]" ] } + ] + }, + "validatePath": "Catalogs/ВидыКонтактов", + "expect": { "files": ["Catalogs/ВидыКонтактов.xml", "Catalogs/ВидыКонтактов/Ext/Predefined.xml"] } +} diff --git a/tests/skills/cases/meta-compile/snapshots/catalog-predefined/Catalogs/ВидыКонтактов.xml b/tests/skills/cases/meta-compile/snapshots/catalog-predefined/Catalogs/ВидыКонтактов.xml new file mode 100644 index 00000000..2896dad7 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/catalog-predefined/Catalogs/ВидыКонтактов.xml @@ -0,0 +1,91 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + + ВидыКонтактов + + + ru + Виды контактов + + + + false + HierarchyFoldersAndItems + false + 2 + true + true + + ToItems + 3 + 25 + Number + 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 + + + + diff --git a/tests/skills/cases/meta-compile/snapshots/catalog-predefined/Catalogs/ВидыКонтактов/Ext/ObjectModule.bsl b/tests/skills/cases/meta-compile/snapshots/catalog-predefined/Catalogs/ВидыКонтактов/Ext/ObjectModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/meta-compile/snapshots/catalog-predefined/Catalogs/ВидыКонтактов/Ext/Predefined.xml b/tests/skills/cases/meta-compile/snapshots/catalog-predefined/Catalogs/ВидыКонтактов/Ext/Predefined.xml new file mode 100644 index 00000000..f3e710ba --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/catalog-predefined/Catalogs/ВидыКонтактов/Ext/Predefined.xml @@ -0,0 +1,41 @@ + + + + Телефон + + Телефон + false + + + ЭлектроннаяПочта + 1 + Электронная почта + false + + + ПустоеЗначение + + + false + + + Группа1 + + Прочие контакты + true + + + Факс + + Факс + false + + + Скайп + 7 + Скайп + false + + + + diff --git a/tests/skills/cases/meta-compile/snapshots/catalog-predefined/Configuration.xml b/tests/skills/cases/meta-compile/snapshots/catalog-predefined/Configuration.xml new file mode 100644 index 00000000..48efc756 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/catalog-predefined/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-predefined/Ext/ClientApplicationInterface.xml b/tests/skills/cases/meta-compile/snapshots/catalog-predefined/Ext/ClientApplicationInterface.xml new file mode 100644 index 00000000..3c1161b2 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/catalog-predefined/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-predefined/Languages/Русский.xml b/tests/skills/cases/meta-compile/snapshots/catalog-predefined/Languages/Русский.xml new file mode 100644 index 00000000..37c60d78 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/catalog-predefined/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file