From 812ca7d2783dbdc2edbb5555e6c1e0b35daa4d6b Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Wed, 30 Sep 2026 17:56:48 +0300 Subject: [PATCH] =?UTF-8?q?fix(meta-*,cf-validate,cf-init):=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=BF=D1=83=D1=81=D1=82=D0=B8=D0=BC=D1=8B=D0=B5=20=D0=B7=D0=BD?= =?UTF-8?q?=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D1=87=D0=B8=D1=81=D0=BB=D0=B5=D0=BD=D0=B8=D0=B9=20=E2=80=94=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D0=BF=D0=BB=D0=B0=D1=82=D1=84=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Списки сверены с XSD платформы, каждое спорное значение проверено загрузкой и выгрузкой на 8.3.24 и 8.5.1. - Платформа отвергает, а навыки принимали: FillChecking=ShowWarning (и алиас «Предупреждение»), RegisterRecordsWritingOnPost=WriteAll, MainClientApplicationWindowMode=Fullscreen. meta-compile при этом вообще не проверял fillChecking/indexing реквизита, ТЧ и стандартных реквизитов — значение из DSL уходило в XML как есть; теперь через список. - Платформа принимает, а навыки отвергали: DependenceOnCalculationTypes= OnRegistrationPeriod, режимы окна Workplace/FullscreenWorkplace/Kiosk/ EmbeddedWorkplace, DefaultPresentation=AsNumber — только у задачи (список «Вид.Свойство»; у справочника платформа его отвергает). - meta-validate (PS) сравнивал значения без учёта регистра, py — с учётом; платформа читает по точному имени — теперь оба с учётом. - cf-init отвергает режим совместимости новее платформы своей -FormatVersion: платформа старше режима молча понижает его при загрузке. Лестница «платформа → формат» сверяется с §7.1 в check-format-versions. - check-enum-drift: ключи «Вид.Свойство», сверка cf-validate ↔ cfe-validate. - Документация: убраны ShowWarning/WriteAll/Fullscreen, OnPeriod → OnRegistrationPeriod, AsNumber у задачи. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_018dc2yLQfw6wppbopM1Y4Ps --- .claude/skills/cf-edit/reference.md | 2 +- .claude/skills/cf-init/scripts/cf-init.ps1 | 22 +- .claude/skills/cf-init/scripts/cf-init.py | 23 +- .../cf-validate/scripts/cf-validate.ps1 | 5 +- .../skills/cf-validate/scripts/cf-validate.py | 5 +- .../epf-validate/scripts/epf-validate.ps1 | 4 +- .../epf-validate/scripts/epf-validate.py | 2 +- .../meta-compile/reference/attributes.md | 4 +- .../skills/meta-compile/reference/charts.md | 2 +- .../skills/meta-compile/reference/document.md | 2 +- .../skills/meta-compile/reference/process.md | 1 + .../meta-compile/scripts/meta-compile.ps1 | 29 +- .../meta-compile/scripts/meta-compile.py | 29 +- .../skills/meta-edit/scripts/meta-edit.ps1 | 19 +- .claude/skills/meta-edit/scripts/meta-edit.py | 18 +- .../meta-validate/scripts/meta-validate.ps1 | 18 +- .../meta-validate/scripts/meta-validate.py | 14 +- docs/1c-config-objects-spec.md | 6 +- docs/1c-configuration-spec.md | 2 +- docs/meta-dsl-spec.md | 10 +- .../error-compat-newer-than-format.json | 14 + .../error-window-mode-fullscreen.json | 23 ++ .../Configuration.xml | 251 ++++++++++++ .../Ext/ClientApplicationInterface.xml | 18 + .../Languages/Русский.xml | 16 + .../window-mode-fullscreen-workplace.json | 21 + ...alc-dependence-on-registration-period.json | 18 + .../error-catalog-presentation-asnumber.json | 9 + .../error-fillchecking-alias-warning.json | 15 + .../error-fillchecking-showwarning.json | 15 + .../error-registerrecords-writeall.json | 9 + .../ChartsOfCalculationTypes/Начисления.xml | 381 ++++++++++++++++++ .../Начисления/Ext/ObjectModule.bsl | 0 .../Configuration.xml | 252 ++++++++++++ .../Ext/ClientApplicationInterface.xml | 18 + .../Languages/Русский.xml | 16 + .../Configuration.xml | 252 ++++++++++++ .../Ext/ClientApplicationInterface.xml | 18 + .../Languages/Русский.xml | 16 + .../Tasks/Задача.xml | 289 +++++++++++++ .../Tasks/Задача/Ext/ObjectModule.bsl | 0 .../task-presentation-asnumber.json | 15 + ...or-attribute-fillchecking-showwarning.json | 32 ++ ...alc-dependence-on-registration-period.json | 35 ++ .../ChartsOfCalculationTypes/Начисления.xml | 381 ++++++++++++++++++ .../Начисления/Ext/ObjectModule.bsl | 0 .../Configuration.xml | 252 ++++++++++++ .../Ext/ClientApplicationInterface.xml | 18 + .../Languages/Русский.xml | 16 + .../error-catalog-presentation-asnumber.json | 13 + .../cases/meta-validate/error-enum-case.json | 13 + .../meta-validate/error-enum-writeall.json | 13 + .../Catalogs/Товары.xml | 137 +++++++ .../Configuration.xml | 255 ++++++++++++ .../document-writeall/Configuration.xml | 255 ++++++++++++ .../document-writeall/Documents/Заказ.xml | 82 ++++ .../Configuration.xml | 255 ++++++++++++ .../Documents/Заказ.xml | 82 ++++ .../Configuration.xml | 255 ++++++++++++ .../Tasks/Задача.xml | 289 +++++++++++++ .../task-presentation-asnumber.json | 12 + tests/skills/check-enum-drift.mjs | 17 +- tests/skills/check-format-versions.mjs | 21 + 63 files changed, 4244 insertions(+), 72 deletions(-) create mode 100644 tests/skills/cases/cf-init/error-compat-newer-than-format.json create mode 100644 tests/skills/cases/cf-validate/error-window-mode-fullscreen.json create mode 100644 tests/skills/cases/cf-validate/snapshots/window-mode-fullscreen-workplace/Configuration.xml create mode 100644 tests/skills/cases/cf-validate/snapshots/window-mode-fullscreen-workplace/Ext/ClientApplicationInterface.xml create mode 100644 tests/skills/cases/cf-validate/snapshots/window-mode-fullscreen-workplace/Languages/Русский.xml create mode 100644 tests/skills/cases/cf-validate/window-mode-fullscreen-workplace.json create mode 100644 tests/skills/cases/meta-compile/calc-dependence-on-registration-period.json create mode 100644 tests/skills/cases/meta-compile/error-catalog-presentation-asnumber.json create mode 100644 tests/skills/cases/meta-compile/error-fillchecking-alias-warning.json create mode 100644 tests/skills/cases/meta-compile/error-fillchecking-showwarning.json create mode 100644 tests/skills/cases/meta-compile/error-registerrecords-writeall.json create mode 100644 tests/skills/cases/meta-compile/snapshots/calc-dependence-on-registration-period/ChartsOfCalculationTypes/Начисления.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/calc-dependence-on-registration-period/ChartsOfCalculationTypes/Начисления/Ext/ObjectModule.bsl create mode 100644 tests/skills/cases/meta-compile/snapshots/calc-dependence-on-registration-period/Configuration.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/calc-dependence-on-registration-period/Ext/ClientApplicationInterface.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/calc-dependence-on-registration-period/Languages/Русский.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/task-presentation-asnumber/Configuration.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/task-presentation-asnumber/Ext/ClientApplicationInterface.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/task-presentation-asnumber/Languages/Русский.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/task-presentation-asnumber/Tasks/Задача.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/task-presentation-asnumber/Tasks/Задача/Ext/ObjectModule.bsl create mode 100644 tests/skills/cases/meta-compile/task-presentation-asnumber.json create mode 100644 tests/skills/cases/meta-edit/error-attribute-fillchecking-showwarning.json create mode 100644 tests/skills/cases/meta-edit/modify-calc-dependence-on-registration-period.json create mode 100644 tests/skills/cases/meta-edit/snapshots/modify-calc-dependence-on-registration-period/ChartsOfCalculationTypes/Начисления.xml create mode 100644 tests/skills/cases/meta-edit/snapshots/modify-calc-dependence-on-registration-period/ChartsOfCalculationTypes/Начисления/Ext/ObjectModule.bsl create mode 100644 tests/skills/cases/meta-edit/snapshots/modify-calc-dependence-on-registration-period/Configuration.xml create mode 100644 tests/skills/cases/meta-edit/snapshots/modify-calc-dependence-on-registration-period/Ext/ClientApplicationInterface.xml create mode 100644 tests/skills/cases/meta-edit/snapshots/modify-calc-dependence-on-registration-period/Languages/Русский.xml create mode 100644 tests/skills/cases/meta-validate/error-catalog-presentation-asnumber.json create mode 100644 tests/skills/cases/meta-validate/error-enum-case.json create mode 100644 tests/skills/cases/meta-validate/error-enum-writeall.json create mode 100644 tests/skills/cases/meta-validate/fixtures/catalog-presentation-asnumber/Catalogs/Товары.xml create mode 100644 tests/skills/cases/meta-validate/fixtures/catalog-presentation-asnumber/Configuration.xml create mode 100644 tests/skills/cases/meta-validate/fixtures/document-writeall/Configuration.xml create mode 100644 tests/skills/cases/meta-validate/fixtures/document-writeall/Documents/Заказ.xml create mode 100644 tests/skills/cases/meta-validate/fixtures/document-writeselected-lowercase/Configuration.xml create mode 100644 tests/skills/cases/meta-validate/fixtures/document-writeselected-lowercase/Documents/Заказ.xml create mode 100644 tests/skills/cases/meta-validate/fixtures/task-presentation-asnumber/Configuration.xml create mode 100644 tests/skills/cases/meta-validate/fixtures/task-presentation-asnumber/Tasks/Задача.xml create mode 100644 tests/skills/cases/meta-validate/task-presentation-asnumber.json diff --git a/.claude/skills/cf-edit/reference.md b/.claude/skills/cf-edit/reference.md index 27f21b10a..f3b78b6b3 100644 --- a/.claude/skills/cf-edit/reference.md +++ b/.claude/skills/cf-edit/reference.md @@ -23,7 +23,7 @@ | `SynchronousPlatformExtensionAndAddInCallUseMode` | `DontUse`, `Use`, `UseWithWarnings` | | `InterfaceCompatibilityMode` | `Version8_2`, `Version8_2EnableTaxi`, `Taxi`, `TaxiEnableVersion8_2`, `TaxiEnableVersion8_5`, `Version8_5EnableTaxi`, `Version8_5` | | `DatabaseTablespacesUseMode` | `DontUse`, `Use` | -| `MainClientApplicationWindowMode` | `Normal`, `Fullscreen`, `Kiosk` | +| `MainClientApplicationWindowMode` | `Normal`, `Workplace`, `FullscreenWorkplace`, `Kiosk`, `EmbeddedWorkplace` | ### Ref `DefaultLanguage` — значение вида `Language.Русский` diff --git a/.claude/skills/cf-init/scripts/cf-init.ps1 b/.claude/skills/cf-init/scripts/cf-init.ps1 index 4a1b8e98e..84b0ef571 100644 --- a/.claude/skills/cf-init/scripts/cf-init.ps1 +++ b/.claude/skills/cf-init/scripts/cf-init.ps1 @@ -1,4 +1,4 @@ -# cf-init v1.15 — Create empty 1C configuration scaffold (+write_xml_file/write_utf8_bom: общий эталон записи) +# cf-init v1.16 — Create empty 1C configuration scaffold (+write_xml_file/write_utf8_bom: общий эталон записи) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills [CmdletBinding(PositionalBinding=$false)] param( @@ -58,6 +58,26 @@ if ($CompatibilityMode -and $CompatibilityMode.ToLowerInvariant() -eq 'dontuse') [Console]::Error.WriteLine("WARNING: CompatibilityMode 'DontUse' is not `"no restrictions`" — the platform stores it as Version8_3_8. For no compatibility restrictions use the target platform version (e.g. Version8_3_27 for 8.3.27).") } +# Режим совместимости не новее платформы, которая пишет эту версию формата. Такой конфигурации +# не выпускает ни одна платформа, а загрузка платформой старше режима МОЛЧА понижает его до своей +# версии (замерено: Version8_3_25 и Version8_3_27 на 8.3.24 → Version8_3_24). Лестница «платформа → +# формат» — копия docs/1c-configuration-spec.md §7.1, сверяет tests/skills/check-format-versions.mjs. +# Режим, которого нет в лестнице (8.3.28), не проверяется: замера нет. +$platformFormatLadder = [ordered]@{ + "8.3.20" = "2.13"; "8.3.21" = "2.14"; "8.3.22" = "2.15"; "8.3.23" = "2.16"; "8.3.24" = "2.17" + "8.3.25" = "2.18"; "8.3.26" = "2.19"; "8.3.27" = "2.20"; "8.5.1" = "2.21" +} +if ($CompatibilityMode -match '^Version(\d+)_(\d+)_(\d+)$') { + $compatPlatform = "$($Matches[1]).$($Matches[2]).$($Matches[3])" + if ($platformFormatLadder.Contains($compatPlatform)) { + $needFormat = $platformFormatLadder[$compatPlatform] + if ($formatRank -lt (Get-FormatRank $needFormat)) { + [Console]::Error.WriteLine("CompatibilityMode '$CompatibilityMode' needs platform $compatPlatform (format $needFormat or newer), but -FormatVersion is $FormatVersion — no platform writes such a configuration, and loading it into an older platform silently lowers the mode. Use -FormatVersion $needFormat or an older -CompatibilityMode.") + exit 1 + } + } +} + # --- Resolve output dir --- if (-not [System.IO.Path]::IsPathRooted($OutputDir)) { $OutputDir = Join-Path (Get-Location).Path $OutputDir diff --git a/.claude/skills/cf-init/scripts/cf-init.py b/.claude/skills/cf-init/scripts/cf-init.py index d5de6428e..c2e17cff2 100644 --- a/.claude/skills/cf-init/scripts/cf-init.py +++ b/.claude/skills/cf-init/scripts/cf-init.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# cf-init v1.15 — Create empty 1C configuration scaffold (+write_xml_file/write_utf8_bom: общий эталон записи) +# cf-init v1.16 — Create empty 1C configuration scaffold (+write_xml_file/write_utf8_bom: общий эталон записи) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills """Generates minimal XML source files for a 1C configuration.""" import sys, os, argparse, re, uuid @@ -97,6 +97,27 @@ def main(): if (args.CompatibilityMode or "").lower() == "dontuse": print("WARNING: CompatibilityMode 'DontUse' is not \"no restrictions\" — the platform stores it as Version8_3_8. For no compatibility restrictions use the target platform version (e.g. Version8_3_27 for 8.3.27).", file=sys.stderr) + # Режим совместимости не новее платформы, которая пишет эту версию формата. Такой конфигурации + # не выпускает ни одна платформа, а загрузка платформой старше режима МОЛЧА понижает его до своей + # версии (замерено: Version8_3_25 и Version8_3_27 на 8.3.24 → Version8_3_24). Лестница «платформа → + # формат» — копия docs/1c-configuration-spec.md §7.1, сверяет tests/skills/check-format-versions.mjs. + # Режим, которого нет в лестнице (8.3.28), не проверяется: замера нет. + platform_format_ladder = { + "8.3.20": "2.13", "8.3.21": "2.14", "8.3.22": "2.15", "8.3.23": "2.16", "8.3.24": "2.17", + "8.3.25": "2.18", "8.3.26": "2.19", "8.3.27": "2.20", "8.5.1": "2.21", + } + # Регистронезависимо — как -match в PS-мастере + m = re.match(r'^Version(\d+)_(\d+)_(\d+)$', args.CompatibilityMode or "", re.IGNORECASE) + if m: + compat_platform = f"{m.group(1)}.{m.group(2)}.{m.group(3)}" + need_format = platform_format_ladder.get(compat_platform) + if need_format and format_rank_value < format_rank(need_format): + print(f"CompatibilityMode '{args.CompatibilityMode}' needs platform {compat_platform} (format {need_format} or newer), " + f"but -FormatVersion is {args.FormatVersion} — no platform writes such a configuration, and loading it into " + f"an older platform silently lowers the mode. Use -FormatVersion {need_format} or an older -CompatibilityMode.", + file=sys.stderr) + sys.exit(1) + name = args.Name synonym = args.Synonym if args.Synonym else name output_dir = args.OutputDir diff --git a/.claude/skills/cf-validate/scripts/cf-validate.ps1 b/.claude/skills/cf-validate/scripts/cf-validate.ps1 index 58424cc76..90f8f4605 100644 --- a/.claude/skills/cf-validate/scripts/cf-validate.ps1 +++ b/.claude/skills/cf-validate/scripts/cf-validate.ps1 @@ -1,4 +1,4 @@ -# cf-validate v1.11 — Validate 1C configuration root structure +# cf-validate v1.12 — Validate 1C configuration root structure # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills [CmdletBinding(PositionalBinding=$false)] param( @@ -186,7 +186,8 @@ $validEnumValues = @{ "SynchronousPlatformExtensionAndAddInCallUseMode" = @("DontUse","Use","UseWithWarnings") "InterfaceCompatibilityMode" = @("Version8_2","Version8_2EnableTaxi","Taxi","TaxiEnableVersion8_2","TaxiEnableVersion8_5","Version8_5EnableTaxi","Version8_5") "DatabaseTablespacesUseMode" = @("DontUse","Use") - "MainClientApplicationWindowMode" = @("Normal","Fullscreen","Kiosk") + # Проверено платформой 8.3.24 и 8.5.1: Fullscreen нет (ошибка XDTO), есть …Workplace и Kiosk + "MainClientApplicationWindowMode" = @("Normal","Workplace","FullscreenWorkplace","Kiosk","EmbeddedWorkplace") "CompatibilityMode" = @("DontUse","Version8_1","Version8_2_13","Version8_2_16","Version8_3_1","Version8_3_2","Version8_3_3","Version8_3_4","Version8_3_5","Version8_3_6","Version8_3_7","Version8_3_8","Version8_3_9","Version8_3_10","Version8_3_11","Version8_3_12","Version8_3_13","Version8_3_14","Version8_3_15","Version8_3_16","Version8_3_17","Version8_3_18","Version8_3_19","Version8_3_20","Version8_3_21","Version8_3_22","Version8_3_23","Version8_3_24","Version8_3_25","Version8_3_26","Version8_3_27","Version8_3_28","Version8_5_1") } diff --git a/.claude/skills/cf-validate/scripts/cf-validate.py b/.claude/skills/cf-validate/scripts/cf-validate.py index c734b040f..fa5403967 100644 --- a/.claude/skills/cf-validate/scripts/cf-validate.py +++ b/.claude/skills/cf-validate/scripts/cf-validate.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# cf-validate v1.11 — Validate 1C configuration XML structure +# cf-validate v1.12 — Validate 1C configuration XML structure # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills """Validates Configuration.xml: root structure, InternalInfo, properties, ChildObjects, languages.""" import sys, os, argparse, re @@ -119,7 +119,8 @@ VALID_ENUM_VALUES = { 'TaxiEnableVersion8_5', 'Version8_5EnableTaxi', 'Version8_5', ], 'DatabaseTablespacesUseMode': ['DontUse', 'Use'], - 'MainClientApplicationWindowMode': ['Normal', 'Fullscreen', 'Kiosk'], + # Проверено платформой 8.3.24 и 8.5.1: Fullscreen нет (ошибка XDTO), есть …Workplace и Kiosk + 'MainClientApplicationWindowMode': ['Normal', 'Workplace', 'FullscreenWorkplace', 'Kiosk', 'EmbeddedWorkplace'], 'CompatibilityMode': [ 'DontUse', 'Version8_1', 'Version8_2_13', 'Version8_2_16', 'Version8_3_1', 'Version8_3_2', 'Version8_3_3', 'Version8_3_4', 'Version8_3_5', diff --git a/.claude/skills/epf-validate/scripts/epf-validate.ps1 b/.claude/skills/epf-validate/scripts/epf-validate.ps1 index f407ad830..cfae470c3 100644 --- a/.claude/skills/epf-validate/scripts/epf-validate.ps1 +++ b/.claude/skills/epf-validate/scripts/epf-validate.ps1 @@ -1,4 +1,4 @@ -# epf-validate v1.8 — Validate 1C external data processor / report structure +# epf-validate v1.9 — Validate 1C external data processor / report structure # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # Works for both EPF (ExternalDataProcessor) and ERF (ExternalReport) — auto-detects [CmdletBinding(PositionalBinding=$false)] @@ -162,7 +162,7 @@ $childTypeOrder = @{ } $validPropertyValues = @{ - "FillChecking" = @("DontCheck","ShowError","ShowWarning") + "FillChecking" = @("DontCheck","ShowError") "Indexing" = @("DontIndex","Index","IndexWithAdditionalOrder") } diff --git a/.claude/skills/epf-validate/scripts/epf-validate.py b/.claude/skills/epf-validate/scripts/epf-validate.py index d5d2de458..51b046e08 100644 --- a/.claude/skills/epf-validate/scripts/epf-validate.py +++ b/.claude/skills/epf-validate/scripts/epf-validate.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# epf-validate v1.8 — Validate 1C external data processor / report structure +# epf-validate v1.9 — Validate 1C external data processor / report structure # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # Works for both EPF (ExternalDataProcessor) and ERF (ExternalReport) — auto-detects diff --git a/.claude/skills/meta-compile/reference/attributes.md b/.claude/skills/meta-compile/reference/attributes.md index 05ae3710e..5e19fb3aa 100644 --- a/.claude/skills/meta-compile/reference/attributes.md +++ b/.claude/skills/meta-compile/reference/attributes.md @@ -17,7 +17,7 @@ shorthand — вместо строки задаётся объект: | `synonym` | из имени | ML (строка или `{ru,en}`) | | `tooltip` | пусто | ML | | `comment` | пусто | строка | -| `fillChecking` | `DontCheck` | `DontCheck` / `ShowError` / `ShowWarning` (то же, что флаг `req`) | +| `fillChecking` | `DontCheck` | `DontCheck` / `ShowError` (то же, что флаг `req`) | | `fullTextSearch` | `Use` | `Use` / `DontUse` | | `fillFromFillingValue` | `false` | bool | | `fillValue` | по типу (см. ниже) | значение заполнения | @@ -121,7 +121,7 @@ shorthand — вместо строки задаётся объект: | `synonym` | из имени | ML | | `tooltip` | пусто | ML | | `comment` | пусто | строка | -| `fillChecking` | `DontCheck` | `DontCheck` / `ShowError` / `ShowWarning` (обязательность заполнения ТЧ) | +| `fillChecking` | `DontCheck` | `DontCheck` / `ShowError` (обязательность заполнения ТЧ) | | `use` | `ForItem` | `ForItem` / `ForFolder` / `ForFolderAndItem` (только Catalog / ChartOfCharacteristicTypes) | | `attributes` | `[]` | колонки (shorthand или объектная форма реквизита) | | `lineNumber` | — | кастомизация стандартного реквизита НомерСтроки (см. ниже) | diff --git a/.claude/skills/meta-compile/reference/charts.md b/.claude/skills/meta-compile/reference/charts.md index 393bac8cc..243942ceb 100644 --- a/.claude/skills/meta-compile/reference/charts.md +++ b/.claude/skills/meta-compile/reference/charts.md @@ -87,7 +87,7 @@ | `codeLength` | `5` | длина кода | | `descriptionLength` | `100` | длина наименования | | `codeAllowedLength` | `Variable` | `Variable` / `Fixed` | -| `dependenceOnCalculationTypes` | `DontUse` | `DontUse` / `OnPeriod` / `OnActionPeriod` | +| `dependenceOnCalculationTypes` | `DontUse` | `DontUse` / `OnActionPeriod` / `OnRegistrationPeriod` | | `baseCalculationTypes` | `[]` | базовые виды расчёта (список ссылок `ChartOfCalculationTypes.X`) | | `actionPeriodUse` | `false` | bool (использовать период действия) | | `createOnInput` | `DontUse` | `Auto` / `Use` / `DontUse` | diff --git a/.claude/skills/meta-compile/reference/document.md b/.claude/skills/meta-compile/reference/document.md index 01e25a1df..4d73e3c57 100644 --- a/.claude/skills/meta-compile/reference/document.md +++ b/.claude/skills/meta-compile/reference/document.md @@ -22,7 +22,7 @@ | `posting` | `Allow` | `Allow` / `Deny` (проведение) | | `realTimePosting` | `Deny` | `Allow` / `Deny` (оперативное проведение) | | `registerRecordsDeletion` | `AutoDelete` | `AutoDelete` / `AutoDeleteOnUnpost` / `AutoDeleteOff` | -| `registerRecordsWritingOnPost` | `WriteSelected` | `WriteModified` / `WriteSelected` / `WriteAll` | +| `registerRecordsWritingOnPost` | `WriteSelected` | `WriteModified` / `WriteSelected` | | `sequenceFilling` | `AutoFill` | заполнение последовательностей | | `postInPrivilegedMode` | `true` | bool | | `unpostInPrivilegedMode` | `true` | bool | diff --git a/.claude/skills/meta-compile/reference/process.md b/.claude/skills/meta-compile/reference/process.md index 351e1e626..04a7b196d 100644 --- a/.claude/skills/meta-compile/reference/process.md +++ b/.claude/skills/meta-compile/reference/process.md @@ -32,6 +32,7 @@ | `checkUnique` | `true` | bool | | `autonumbering` | `true` | bool | | `descriptionLength` | `150` | длина наименования | +| `defaultPresentation` | `AsDescription` | `AsDescription` / `AsNumber` | | `addressing` | пусто | ссылка на регистр сведений адресации `InformationRegister.X` | | `mainAddressingAttribute` | пусто | основной реквизит адресации (имя реквизита адресации) | | `currentPerformer` | пусто | реквизит текущего исполнителя | diff --git a/.claude/skills/meta-compile/scripts/meta-compile.ps1 b/.claude/skills/meta-compile/scripts/meta-compile.ps1 index 9b3d9da6b..acea668d2 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.114 — Compile 1C metadata object from JSON +# meta-compile v1.115 — Compile 1C metadata object from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills [CmdletBinding(PositionalBinding=$false)] param( @@ -309,7 +309,7 @@ $script:enumValueAliases = @{ # DefaultPresentation "ВВидеНаименования" = "AsDescription"; "ВВидеКода" = "AsCode" # FillChecking - "НеПроверять" = "DontCheck"; "Ошибка" = "ShowError"; "Предупреждение" = "ShowWarning" + "НеПроверять" = "DontCheck"; "Ошибка" = "ShowError" # Indexing "НеИндексировать" = "DontIndex"; "Индексировать" = "Index" "ИндексироватьСДопУпорядочиванием" = "IndexWithAdditionalOrder" @@ -320,13 +320,17 @@ $script:validEnumValues = @{ "RegisterType" = @("Balance","Turnovers") "WriteMode" = @("Independent","RecorderSubordinate") "InformationRegisterPeriodicity" = @("Nonperiodical","Second","Day","Month","Quarter","Year","RecorderPosition") - "DependenceOnCalculationTypes" = @("DontUse","OnActionPeriod") + "DependenceOnCalculationTypes" = @("DontUse","OnActionPeriod","OnRegistrationPeriod") # AutomaticAndManaged — только у внешнего источника данных и его таблиц: там режим может # решаться на уровне таблицы, у прочих объектов такого значения нет. "DataLockControlMode" = @("Automatic","Managed","AutomaticAndManaged") "FullTextSearch" = @("Use","DontUse") "DataHistory" = @("Use","DontUse") "DefaultPresentation" = @("AsDescription","AsCode") + # Уточнение по виду объекта («Вид.Свойство») — проверяется раньше общего списка. AsNumber + # («в виде номера») есть только у задачи: у справочника и прочих платформа его отвергает + # («Неверное значение перечисления», 8.3.24 и 8.5.1). + "Task.DefaultPresentation" = @("AsDescription","AsNumber") "Posting" = @("Allow","Deny") "RealTimePosting" = @("Allow","Deny") "EditType" = @("InDialog","InList","BothWays") @@ -336,10 +340,10 @@ $script:validEnumValues = @{ "NumberType" = @("String","Number") "NumberAllowedLength" = @("Variable","Fixed") "RegisterRecordsDeletion" = @("AutoDelete","AutoDeleteOnUnpost","AutoDeleteOff") - "RegisterRecordsWritingOnPost" = @("WriteModified","WriteSelected","WriteAll") + "RegisterRecordsWritingOnPost" = @("WriteModified","WriteSelected") "ReturnValuesReuse" = @("DontUse","DuringRequest","DuringSession") "ReuseSessions" = @("DontUse","Use","AutoUse") - "FillChecking" = @("DontCheck","ShowError","ShowWarning") + "FillChecking" = @("DontCheck","ShowError") "Indexing" = @("DontIndex","Index","IndexWithAdditionalOrder") "SubordinationUse" = @("ToItems","ToFolders","ToFoldersAndItems") "CodeSeries" = @("WholeCatalog","WithinSubordination","WithinOwnerSubordination","WholeCharacteristicKind","WholeChartOfAccounts") @@ -398,8 +402,9 @@ function Normalize-EnumValue { if ($script:enumValueAliases.ContainsKey($value)) { return $script:enumValueAliases[$value] } - # 2. Case-insensitive match against valid values — silent - $valid = $script:validEnumValues[$propName] + # 2. Case-insensitive match against valid values — silent. Список вида объекта — раньше общего. + $valid = $script:validEnumValues["$script:objType.$propName"] + if (-not $valid) { $valid = $script:validEnumValues[$propName] } if ($valid) { foreach ($v in $valid) { if ($v -ieq $value) { return $v } @@ -1294,8 +1299,10 @@ function Parse-AttributeShorthand { tooltip = $val.tooltip comment = if ($val.comment) { "$($val.comment)" } else { "" } flags = @(if ($val.flags) { $val.flags } else { @() }) - fillChecking = $fc - indexing = if ($val.indexing) { "$($val.indexing)" } else { "" } + # Значения перечислений — через список допустимых, как свойства объекта: иначе значение из DSL + # (ShowWarning, «Ошибка») уходило в XML как есть, и конфигурация не загружалась. + fillChecking = if ($fc) { Normalize-EnumValue "FillChecking" $fc } else { "" } + indexing = if ($val.indexing) { Normalize-EnumValue "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 { "" } @@ -1773,7 +1780,7 @@ function Emit-StandardAttributes { if ($d) { if ($null -ne $d.synonym) { $ov['Synonym'] = $d.synonym } # строка ИЛИ {ru,en} if ($null -ne $d.tooltip) { $ov['ToolTip'] = $d.tooltip } # строка ИЛИ {ru,en} - if ($d.fillChecking) { $ov['FillChecking'] = "$($d.fillChecking)" } + if ($d.fillChecking) { $ov['FillChecking'] = Normalize-EnumValue "FillChecking" "$($d.fillChecking)" } if ($null -ne $d.fillFromFillingValue) { $ov['FillFromFillingValue'] = if ($d.fillFromFillingValue) { 'true' } else { 'false' } } if ($d.fullTextSearch) { $ov['FullTextSearch'] = "$($d.fullTextSearch)" } if ($d.dataHistory) { $ov['DataHistory'] = "$($d.dataHistory)" } @@ -2486,7 +2493,7 @@ function Emit-TabularSection { Emit-MLText "$indent`t`t" "Synonym" $tsSynonym if ($tsComment) { X "$indent`t`t$(Esc-XmlText $tsComment)" } else { X "$indent`t`t" } Emit-MLText "$indent`t`t" "ToolTip" $tsTooltip - $tsFc = if ($tsFillChecking) { "$tsFillChecking" } else { "DontCheck" } + $tsFc = if ($tsFillChecking) { Normalize-EnumValue "FillChecking" "$tsFillChecking" } else { "DontCheck" } X "$indent`t`t$tsFc" # TS-блок стандартных реквизитов (LineNumber) эмитим ВСЕГДА, кроме подавления `lineNumber: ""` (дом-конвенция # суппресса): ~6% ТЧ исторически опускают блок (правило не выводимо — Товары all-default его имеет, соседи нет). diff --git a/.claude/skills/meta-compile/scripts/meta-compile.py b/.claude/skills/meta-compile/scripts/meta-compile.py index 1357bd1d3..cd4a62e3b 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.114 — Compile 1C metadata object from JSON +# meta-compile v1.115 — Compile 1C metadata object from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -527,7 +527,7 @@ enum_value_aliases = { # DefaultPresentation 'ВВидеНаименования': 'AsDescription', 'ВВидеКода': 'AsCode', # FillChecking - 'НеПроверять': 'DontCheck', 'Ошибка': 'ShowError', 'Предупреждение': 'ShowWarning', + 'НеПроверять': 'DontCheck', 'Ошибка': 'ShowError', # Indexing 'НеИндексировать': 'DontIndex', 'Индексировать': 'Index', 'ИндексироватьСДопУпорядочиванием': 'IndexWithAdditionalOrder', @@ -542,13 +542,17 @@ valid_enum_values = { 'RegisterType': ['Balance', 'Turnovers'], 'WriteMode': ['Independent', 'RecorderSubordinate'], 'InformationRegisterPeriodicity': ['Nonperiodical', 'Second', 'Day', 'Month', 'Quarter', 'Year', 'RecorderPosition'], - 'DependenceOnCalculationTypes': ['DontUse', 'OnActionPeriod'], + 'DependenceOnCalculationTypes': ['DontUse', 'OnActionPeriod', 'OnRegistrationPeriod'], # AutomaticAndManaged — только у внешнего источника данных и его таблиц: там режим может # решаться на уровне таблицы, у прочих объектов такого значения нет. 'DataLockControlMode': ['Automatic', 'Managed', 'AutomaticAndManaged'], 'FullTextSearch': ['Use', 'DontUse'], 'DataHistory': ['Use', 'DontUse'], 'DefaultPresentation': ['AsDescription', 'AsCode'], + # Уточнение по виду объекта («Вид.Свойство») — проверяется раньше общего списка. AsNumber + # («в виде номера») есть только у задачи: у справочника и прочих платформа его отвергает + # («Неверное значение перечисления», 8.3.24 и 8.5.1). + 'Task.DefaultPresentation': ['AsDescription', 'AsNumber'], 'Posting': ['Allow', 'Deny'], 'RealTimePosting': ['Allow', 'Deny'], 'EditType': ['InDialog', 'InList', 'BothWays'], @@ -558,10 +562,10 @@ valid_enum_values = { 'NumberType': ['String', 'Number'], 'NumberAllowedLength': ['Variable', 'Fixed'], 'RegisterRecordsDeletion': ['AutoDelete', 'AutoDeleteOnUnpost', 'AutoDeleteOff'], - 'RegisterRecordsWritingOnPost': ['WriteModified', 'WriteSelected', 'WriteAll'], + 'RegisterRecordsWritingOnPost': ['WriteModified', 'WriteSelected'], 'ReturnValuesReuse': ['DontUse', 'DuringRequest', 'DuringSession'], 'ReuseSessions': ['DontUse', 'Use', 'AutoUse'], - 'FillChecking': ['DontCheck', 'ShowError', 'ShowWarning'], + 'FillChecking': ['DontCheck', 'ShowError'], 'Indexing': ['DontIndex', 'Index', 'IndexWithAdditionalOrder'], 'SubordinationUse': ['ToItems', 'ToFolders', 'ToFoldersAndItems'], 'CodeSeries': ['WholeCatalog', 'WithinSubordination', 'WithinOwnerSubordination', 'WholeCharacteristicKind', 'WholeChartOfAccounts'], @@ -618,8 +622,8 @@ def normalize_enum_value(prop_name, value): # 1. Check alias dictionary — silent auto-correct if value in enum_value_aliases: return enum_value_aliases[value] - # 2. Case-insensitive match against valid values — silent - valid = valid_enum_values.get(prop_name) + # 2. Case-insensitive match against valid values — silent. Список вида объекта — раньше общего. + valid = valid_enum_values.get(f"{obj_type}.{prop_name}") or valid_enum_values.get(prop_name) if valid: for v in valid: if v.lower() == value.lower(): @@ -1394,8 +1398,10 @@ def parse_attribute_shorthand(val): 'comment': str(val['comment']) if val.get('comment') else '', # Лоуэркейз как в строковом пути (стр.809): проверки флагов регистронезависимы (зеркало PS -contains). 'flags': [str(f).strip().lower() for f in val.get('flags', [])], - 'fillChecking': fc, - 'indexing': str(val['indexing']) if val.get('indexing') else '', + # Значения перечислений — через список допустимых, как свойства объекта: иначе значение из DSL + # (ShowWarning, «Ошибка») уходило в XML как есть, и конфигурация не загружалась. + 'fillChecking': normalize_enum_value('FillChecking', fc) if fc else '', + 'indexing': normalize_enum_value('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 '', @@ -1884,7 +1890,7 @@ def emit_standard_attributes(indent, object_type): if d.get('tooltip') is not None: ov['ToolTip'] = d['tooltip'] # строка ИЛИ {ru,en} if d.get('fillChecking'): - ov['FillChecking'] = str(d['fillChecking']) + ov['FillChecking'] = normalize_enum_value('FillChecking', str(d['fillChecking'])) if d.get('fillFromFillingValue') is not None: ov['FillFromFillingValue'] = 'true' if d['fillFromFillingValue'] else 'false' if d.get('fullTextSearch'): @@ -2631,7 +2637,8 @@ def emit_tabular_section(indent, ts_name, columns, object_type, object_name, ts_ else: X(f'{indent}\t\t') emit_mltext(f'{indent}\t\t', 'ToolTip', ts_tooltip) - X(f'{indent}\t\t{ts_fill_checking if ts_fill_checking else "DontCheck"}') + ts_fc = normalize_enum_value('FillChecking', str(ts_fill_checking)) if ts_fill_checking else 'DontCheck' + X(f'{indent}\t\t{ts_fc}') # TS-блок стандартных реквизитов (LineNumber) эмитим ВСЕГДА, кроме подавления `lineNumber: ""` (дом-конвенция # суппресса): ~6% ТЧ исторически опускают блок (правило не выводимо — Товары all-default его имеет, соседи нет). if not (isinstance(ts_line_number, str) and ts_line_number == ''): diff --git a/.claude/skills/meta-edit/scripts/meta-edit.ps1 b/.claude/skills/meta-edit/scripts/meta-edit.ps1 index bd1f1deff..21fc5609b 100644 --- a/.claude/skills/meta-edit/scripts/meta-edit.ps1 +++ b/.claude/skills/meta-edit/scripts/meta-edit.ps1 @@ -1,4 +1,4 @@ -# meta-edit v1.59 — Edit existing 1C metadata object XML +# meta-edit v1.60 — Edit existing 1C metadata object XML # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills [CmdletBinding(PositionalBinding=$false)] param( @@ -129,7 +129,7 @@ $script:enumValueAliases = @{ "Разрешить" = "Allow"; "Запретить" = "Deny" "ВДиалоге" = "InDialog"; "ВСписке" = "InList"; "ОбаСпособа" = "BothWays" "ВВидеНаименования" = "AsDescription"; "ВВидеКода" = "AsCode" - "НеПроверять" = "DontCheck"; "Ошибка" = "ShowError"; "Предупреждение" = "ShowWarning" + "НеПроверять" = "DontCheck"; "Ошибка" = "ShowError" "НеИндексировать" = "DontIndex"; "Индексировать" = "Index" "ИндексироватьСДопУпорядочиванием" = "IndexWithAdditionalOrder" } @@ -138,12 +138,16 @@ $script:validEnumValues = @{ "RegisterType" = @("Balance","Turnovers") "WriteMode" = @("Independent","RecorderSubordinate") "InformationRegisterPeriodicity" = @("Nonperiodical","Second","Day","Month","Quarter","Year","RecorderPosition") - "DependenceOnCalculationTypes" = @("DontUse","OnActionPeriod") + "DependenceOnCalculationTypes" = @("DontUse","OnActionPeriod","OnRegistrationPeriod") # AutomaticAndManaged — только у внешнего источника данных и его таблиц. "DataLockControlMode" = @("Automatic","Managed","AutomaticAndManaged") "FullTextSearch" = @("Use","DontUse") "DataHistory" = @("Use","DontUse") "DefaultPresentation" = @("AsDescription","AsCode") + # Уточнение по виду объекта («Вид.Свойство») — проверяется раньше общего списка. AsNumber + # («в виде номера») есть только у задачи: у справочника и прочих платформа его отвергает + # («Неверное значение перечисления», 8.3.24 и 8.5.1). + "Task.DefaultPresentation" = @("AsDescription","AsNumber") "Posting" = @("Allow","Deny") "RealTimePosting" = @("Allow","Deny") "EditType" = @("InDialog","InList","BothWays") @@ -153,10 +157,10 @@ $script:validEnumValues = @{ "NumberType" = @("String","Number") "NumberAllowedLength" = @("Variable","Fixed") "RegisterRecordsDeletion" = @("AutoDelete","AutoDeleteOnUnpost","AutoDeleteOff") - "RegisterRecordsWritingOnPost" = @("WriteModified","WriteSelected","WriteAll") + "RegisterRecordsWritingOnPost" = @("WriteModified","WriteSelected") "ReturnValuesReuse" = @("DontUse","DuringRequest","DuringSession") "ReuseSessions" = @("DontUse","Use","AutoUse") - "FillChecking" = @("DontCheck","ShowError","ShowWarning") + "FillChecking" = @("DontCheck","ShowError") "Indexing" = @("DontIndex","Index","IndexWithAdditionalOrder") } @@ -166,8 +170,9 @@ function Normalize-EnumValue { if ($script:enumValueAliases.ContainsKey($value)) { return $script:enumValueAliases[$value] } - # 2. Case-insensitive match against valid values — silent - $valid = $script:validEnumValues[$propName] + # 2. Case-insensitive match against valid values — silent. Список вида объекта — раньше общего. + $valid = $script:validEnumValues["$script:objType.$propName"] + if (-not $valid) { $valid = $script:validEnumValues[$propName] } if ($valid) { foreach ($v in $valid) { if ($v -ieq $value) { return $v } diff --git a/.claude/skills/meta-edit/scripts/meta-edit.py b/.claude/skills/meta-edit/scripts/meta-edit.py index e342cc285..0b722b330 100644 --- a/.claude/skills/meta-edit/scripts/meta-edit.py +++ b/.claude/skills/meta-edit/scripts/meta-edit.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# meta-edit v1.59 — Edit existing 1C metadata object XML +# meta-edit v1.60 — Edit existing 1C metadata object XML # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -424,7 +424,7 @@ enum_value_aliases = { # DefaultPresentation 'ВВидеНаименования': 'AsDescription', 'ВВидеКода': 'AsCode', # FillChecking - 'НеПроверять': 'DontCheck', 'Ошибка': 'ShowError', 'Предупреждение': 'ShowWarning', + 'НеПроверять': 'DontCheck', 'Ошибка': 'ShowError', # Indexing 'НеИндексировать': 'DontIndex', 'Индексировать': 'Index', 'ИндексироватьСДопУпорядочиванием': 'IndexWithAdditionalOrder', @@ -437,12 +437,16 @@ valid_enum_values = { 'RegisterType': ['Balance', 'Turnovers'], 'WriteMode': ['Independent', 'RecorderSubordinate'], 'InformationRegisterPeriodicity': ['Nonperiodical', 'Second', 'Day', 'Month', 'Quarter', 'Year', 'RecorderPosition'], - 'DependenceOnCalculationTypes': ['DontUse', 'OnActionPeriod'], + 'DependenceOnCalculationTypes': ['DontUse', 'OnActionPeriod', 'OnRegistrationPeriod'], # AutomaticAndManaged — только у внешнего источника данных и его таблиц. 'DataLockControlMode': ['Automatic', 'Managed', 'AutomaticAndManaged'], 'FullTextSearch': ['Use', 'DontUse'], 'DataHistory': ['Use', 'DontUse'], 'DefaultPresentation': ['AsDescription', 'AsCode'], + # Уточнение по виду объекта («Вид.Свойство») — проверяется раньше общего списка. AsNumber + # («в виде номера») есть только у задачи: у справочника и прочих платформа его отвергает + # («Неверное значение перечисления», 8.3.24 и 8.5.1). + 'Task.DefaultPresentation': ['AsDescription', 'AsNumber'], 'Posting': ['Allow', 'Deny'], 'RealTimePosting': ['Allow', 'Deny'], 'EditType': ['InDialog', 'InList', 'BothWays'], @@ -452,10 +456,10 @@ valid_enum_values = { 'NumberType': ['String', 'Number'], 'NumberAllowedLength': ['Variable', 'Fixed'], 'RegisterRecordsDeletion': ['AutoDelete', 'AutoDeleteOnUnpost', 'AutoDeleteOff'], - 'RegisterRecordsWritingOnPost': ['WriteModified', 'WriteSelected', 'WriteAll'], + 'RegisterRecordsWritingOnPost': ['WriteModified', 'WriteSelected'], 'ReturnValuesReuse': ['DontUse', 'DuringRequest', 'DuringSession'], 'ReuseSessions': ['DontUse', 'Use', 'AutoUse'], - 'FillChecking': ['DontCheck', 'ShowError', 'ShowWarning'], + 'FillChecking': ['DontCheck', 'ShowError'], 'Indexing': ['DontIndex', 'Index', 'IndexWithAdditionalOrder'], } @@ -464,8 +468,8 @@ def normalize_enum_value(prop_name, value): # 1. Check alias dictionary — silent auto-correct if value in enum_value_aliases: return enum_value_aliases[value] - # 2. Case-insensitive match against valid values — silent - valid = valid_enum_values.get(prop_name) + # 2. Case-insensitive match against valid values — silent. Список вида объекта — раньше общего. + valid = valid_enum_values.get(f"{obj_type}.{prop_name}") or valid_enum_values.get(prop_name) if valid: for v in valid: if v.lower() == value.lower(): diff --git a/.claude/skills/meta-validate/scripts/meta-validate.ps1 b/.claude/skills/meta-validate/scripts/meta-validate.ps1 index 42a035254..913936dd8 100644 --- a/.claude/skills/meta-validate/scripts/meta-validate.ps1 +++ b/.claude/skills/meta-validate/scripts/meta-validate.ps1 @@ -1,4 +1,4 @@ -# meta-validate v1.32 — Validate 1C metadata object structure +# meta-validate v1.33 — Validate 1C metadata object structure # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills [CmdletBinding(PositionalBinding=$false)] param( @@ -361,11 +361,14 @@ $validPropertyValues = @{ "Posting" = @("Allow","Deny") "RealTimePosting" = @("Allow","Deny") "RegisterRecordsDeletion" = @("AutoDelete","AutoDeleteOnUnpost","AutoDeleteOff") - "RegisterRecordsWritingOnPost" = @("WriteModified","WriteSelected","WriteAll") + "RegisterRecordsWritingOnPost" = @("WriteModified","WriteSelected") # AutomaticAndManaged — только у внешнего источника данных и его таблиц. "DataLockControlMode" = @("Automatic","Managed","AutomaticAndManaged") "FullTextSearch" = @("Use","DontUse") "DefaultPresentation" = @("AsDescription","AsCode") + # Уточнение по виду объекта («Вид.Свойство») — раньше общего списка. AsNumber («в виде номера») + # есть только у задачи: у справочника и прочих платформа его отвергает (8.3.24 и 8.5.1). + "Task.DefaultPresentation" = @("AsDescription","AsNumber") "HierarchyType" = @("HierarchyFoldersAndItems","HierarchyOfItems") "EditType" = @("InDialog","InList","BothWays") "WriteMode" = @("Independent","RecorderSubordinate") @@ -373,10 +376,10 @@ $validPropertyValues = @{ "RegisterType" = @("Balance","Turnovers") "ReturnValuesReuse" = @("DontUse","DuringRequest","DuringSession") "ReuseSessions" = @("DontUse","Use","AutoUse") - "FillChecking" = @("DontCheck","ShowError","ShowWarning") + "FillChecking" = @("DontCheck","ShowError") "Indexing" = @("DontIndex","Index","IndexWithAdditionalOrder") "DataHistory" = @("Use","DontUse") - "DependenceOnCalculationTypes" = @("DontUse","OnActionPeriod") + "DependenceOnCalculationTypes" = @("DontUse","OnActionPeriod","OnRegistrationPeriod") } # Properties forbidden per type (would cause LoadConfigFromFiles error) @@ -739,11 +742,14 @@ if ($propsNode) { $check4Ok = $true foreach ($propName in $validPropertyValues.Keys) { + if ($propName.Contains('.')) { continue } # «Вид.Свойство» — уточнение, не отдельное свойство $propNode = $propsNode.SelectSingleNode("md:$propName", $ns) if ($propNode -and $propNode.InnerText) { $val = $propNode.InnerText - $allowed = $validPropertyValues[$propName] - if ($allowed -notcontains $val) { + $allowed = $validPropertyValues["$mdType.$propName"] + if (-not $allowed) { $allowed = $validPropertyValues[$propName] } + # Регистр значим: платформа читает перечисление по точному имени (-notcontains его не различал) + if ($allowed -cnotcontains $val) { Report-Error "4. Property '$propName' has invalid value '$val' (allowed: $($allowed -join ', '))" $check4Ok = $false } diff --git a/.claude/skills/meta-validate/scripts/meta-validate.py b/.claude/skills/meta-validate/scripts/meta-validate.py index 98d143068..ad66703c1 100644 --- a/.claude/skills/meta-validate/scripts/meta-validate.py +++ b/.claude/skills/meta-validate/scripts/meta-validate.py @@ -1,4 +1,4 @@ -# meta-validate v1.32 — Validate 1C metadata object structure (Python port) +# meta-validate v1.33 — Validate 1C metadata object structure (Python port) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import os @@ -416,11 +416,14 @@ valid_property_values = { "Posting": ["Allow", "Deny"], "RealTimePosting": ["Allow", "Deny"], "RegisterRecordsDeletion": ["AutoDelete", "AutoDeleteOnUnpost", "AutoDeleteOff"], - "RegisterRecordsWritingOnPost": ["WriteModified", "WriteSelected", "WriteAll"], + "RegisterRecordsWritingOnPost": ["WriteModified", "WriteSelected"], # AutomaticAndManaged — только у внешнего источника данных и его таблиц. "DataLockControlMode": ["Automatic", "Managed", "AutomaticAndManaged"], "FullTextSearch": ["Use", "DontUse"], "DefaultPresentation": ["AsDescription", "AsCode"], + # Уточнение по виду объекта («Вид.Свойство») — раньше общего списка. AsNumber («в виде номера») + # есть только у задачи: у справочника и прочих платформа его отвергает (8.3.24 и 8.5.1). + "Task.DefaultPresentation": ["AsDescription", "AsNumber"], "HierarchyType": ["HierarchyFoldersAndItems", "HierarchyOfItems"], "EditType": ["InDialog", "InList", "BothWays"], "WriteMode": ["Independent", "RecorderSubordinate"], @@ -428,10 +431,10 @@ valid_property_values = { "RegisterType": ["Balance", "Turnovers"], "ReturnValuesReuse": ["DontUse", "DuringRequest", "DuringSession"], "ReuseSessions": ["DontUse", "Use", "AutoUse"], - "FillChecking": ["DontCheck", "ShowError", "ShowWarning"], + "FillChecking": ["DontCheck", "ShowError"], "Indexing": ["DontIndex", "Index", "IndexWithAdditionalOrder"], "DataHistory": ["Use", "DontUse"], - "DependenceOnCalculationTypes": ["DontUse", "OnActionPeriod"], + "DependenceOnCalculationTypes": ["DontUse", "OnActionPeriod", "OnRegistrationPeriod"], } # Properties forbidden per type (would cause LoadConfigFromFiles error) @@ -802,9 +805,12 @@ if props_node is not None: check4_ok = True for prop_name, allowed in valid_property_values.items(): + if "." in prop_name: # «Вид.Свойство» — уточнение, не отдельное свойство + continue prop_node = find(props_node, f"md:{prop_name}") if prop_node is not None and inner_text(prop_node): val = inner_text(prop_node) + allowed = valid_property_values.get(f"{md_type}.{prop_name}") or allowed if val not in allowed: report_error(f"4. Property '{prop_name}' has invalid value '{val}' (allowed: {', '.join(allowed)})") check4_ok = False diff --git a/docs/1c-config-objects-spec.md b/docs/1c-config-objects-spec.md index 235d3acc9..c32e7c632 100644 --- a/docs/1c-config-objects-spec.md +++ b/docs/1c-config-objects-spec.md @@ -558,7 +558,7 @@ Ext/ # Расширение конфигураци |---|---|---| | `name` | атрибут | Имя стандартного реквизита | | `LinkByType` | элемент | Связь по типу (обычно пустой) | -| `FillChecking` | enum | `DontCheck` \| `ShowWarning` \| `ShowError` | +| `FillChecking` | enum | `DontCheck` \| `ShowError` | | `MultiLine` | boolean | Многострочное поле | | `FillFromFillingValue` | boolean | Заполнять из значения заполнения | | `CreateOnInput` | enum | `Auto` \| `Use` \| `DontUse` | @@ -848,7 +848,7 @@ XML-элемент: ``. Категория InternalInfo: CatalogObject, 150 true true -AsDescription +AsDescription ``` **Владелец:** @@ -924,7 +924,7 @@ XML-элемент: ``. Категория InternalInfo: DocumentObjec AccountingRegister.Хозрасчетный AutoDeleteOnUnpost -WriteSelected +WriteSelected AutoFill ``` diff --git a/docs/1c-configuration-spec.md b/docs/1c-configuration-spec.md index 3e1f7263f..7f7603948 100644 --- a/docs/1c-configuration-spec.md +++ b/docs/1c-configuration-spec.md @@ -103,7 +103,7 @@ ClassId — фиксированные идентификаторы классо | `SynchronousPlatformExtensionAndAddInCallUseMode` | enum | Синхр. вызовы (`DontUse` / `Use`) | | `InterfaceCompatibilityMode` | enum | Совместимость интерфейса (`Taxi` / `TaxiEnableVersion8_2`) | | `DatabaseTablespacesUseMode` | enum | Табличные пространства (`DontUse` / `Use`) | -| `MainClientApplicationWindowMode` | enum | Режим окна (`Normal` / `Fullscreen` / `Kiosk`) | +| `MainClientApplicationWindowMode` | enum | Режим окна (`Normal` / `Workplace` / `FullscreenWorkplace` / `Kiosk` / `EmbeddedWorkplace`) | #### Назначение и использование diff --git a/docs/meta-dsl-spec.md b/docs/meta-dsl-spec.md index f6e1afc12..c4197ee8a 100644 --- a/docs/meta-dsl-spec.md +++ b/docs/meta-dsl-spec.md @@ -217,7 +217,7 @@ JSON DSL для описания объектов метаданных конф |------|-----|-----------|----------| | `synonym` / `tooltip` | Synonym / ToolTip | авто / пусто | ML (§4.4) | | `comment` | Comment | пусто | строка | -| `fillChecking` | FillChecking | DontCheck | DontCheck/ShowError/ShowWarning. Синоним `fillCheck` (из формы; `true`→ShowError). Флаг `req`→ShowError | +| `fillChecking` | FillChecking | DontCheck | DontCheck/ShowError. Синоним `fillCheck` (из формы; `true`→ShowError). Флаг `req`→ShowError | | `fullTextSearch` | FullTextSearch | Use | Use/DontUse | | `fillFromFillingValue` | FillFromFillingValue | false | bool | | `fillValue` | FillValue | по типу (см. ниже) | значение заполнения — bool/число/строка/дата/DTR-путь; `null` → nil | @@ -360,7 +360,7 @@ JSON-**строка** → `xsi:type="xs:string"` (напр. год `"2000"`, к } ``` -Свойства объектной формы ТЧ: `synonym` (ML; нет ключа → авто из имени), `tooltip` (ML), `comment` (строка), `fillChecking` (`DontCheck`|`ShowError`|`ShowWarning`), `use` (`ForItem`|`ForFolder`|`ForFolderAndItem`, только Catalog/ПВХ; omit при дефолте `ForItem`), `attributes` (колонки; синоним `columns`), `lineNumber` (кастомизация стандартного реквизита НомерСтроки, см. ниже), `lineNumberLength` (разрядность номера строки, см. §5.2). +Свойства объектной формы ТЧ: `synonym` (ML; нет ключа → авто из имени), `tooltip` (ML), `comment` (строка), `fillChecking` (`DontCheck`|`ShowError`), `use` (`ForItem`|`ForFolder`|`ForFolderAndItem`, только Catalog/ПВХ; omit при дефолте `ForItem`), `attributes` (колонки; синоним `columns`), `lineNumber` (кастомизация стандартного реквизита НомерСтроки, см. ниже), `lineNumberLength` (разрядность номера строки, см. §5.2). Для Catalog/ChartOfCharacteristicTypes в Properties ТЧ пишется `` (дефолт `ForItem`; ключ `use` объектной формы → `ForFolder`/`ForFolderAndItem`). Document `` не имеет. @@ -497,7 +497,7 @@ LineNumber дефолтные. Ключ `lineNumber` на объектной ф Формат: `standardAttributes` — объект `{ ИмяРеквизита: { переопределения } }`. Имена реквизитов — как в XML: `PredefinedDataName`, `Predefined`, `Ref`, `DeletionMark`, `IsFolder`, `Owner`, `Parent`, `Description`, `Code`. -Переопределяемые поля реквизита: `synonym` (ML — строка/`{ru,en}`), `tooltip` (ML), `fillChecking` (`DontCheck`|`ShowError`|`ShowWarning`), `fillFromFillingValue` (bool), `fullTextSearch` (`Use`|`DontUse`), `dataHistory` (`Use`|`DontUse`), `fillValue` (значение — DTR-путь/строка/bool; см. §4.2), `choiceParameterLinks` / `choiceParameters` (как у реквизита, §4.2), `comment`, `mask`, `choiceForm`. +Переопределяемые поля реквизита: `synonym` (ML — строка/`{ru,en}`), `tooltip` (ML), `fillChecking` (`DontCheck`|`ShowError`), `fillFromFillingValue` (bool), `fullTextSearch` (`Use`|`DontUse`), `dataHistory` (`Use`|`DontUse`), `fillValue` (значение — DTR-путь/строка/bool; см. §4.2), `choiceParameterLinks` / `choiceParameters` (как у реквизита, §4.2), `comment`, `mask`, `choiceForm`. > «Пустая ссылка» как значение заполнения (`` без содержимого) — маркер > `fillValue: {emptyRef: true}` (декомпилятор проставляет его сам; тип из строки не выводится, т.к. `DefinedType.X` @@ -862,7 +862,7 @@ Split-CamelCase имени. | `codeLength` | `5` | CodeLength | | `descriptionLength` | `100` | DescriptionLength | | `codeAllowedLength` | `Variable` | CodeAllowedLength | -| `dependenceOnCalculationTypes` | `DontUse` | DependenceOnCalculationTypes (`DontUse`/`OnPeriod`/`OnActionPeriod`) | +| `dependenceOnCalculationTypes` | `DontUse` | DependenceOnCalculationTypes (`DontUse`/`OnActionPeriod`/`OnRegistrationPeriod`) | | `baseCalculationTypes` | `[]` | BaseCalculationTypes (список ссылок на ПВР; `ПланВидовРасчета.X` → `ChartOfCalculationTypes.X`) | | `actionPeriodUse` | `false` | ActionPeriodUse (использовать период действия) | | `dataLockControlMode` | `Automatic` | DataLockControlMode | @@ -1052,7 +1052,7 @@ true); `characteristics` (§7.1.4); `basedOn`/`inputByString`/`dataLockFields` ( ### 7.6d Task (Задача) Ссылочный тип адресных задач. Поля: нумерация (как БП) + `taskNumberAutoPrefix`/`descriptionLength`; `addressing` -(ссылка на регистр сведений исполнителей); `mainAddressingAttribute`/`currentPerformer` (ссылки); `defaultPresentation`; +(ссылка на регистр сведений исполнителей); `mainAddressingAttribute`/`currentPerformer` (ссылки); `defaultPresentation` (`AsDescription`/`AsNumber`); `basedOn`/`characteristics`/`inputByString`/`dataLockFields`; формы/презентации; `dataLockControlMode` (дефолт **Managed**). Дети: `attributes`, `commands` и **`addressingAttributes`** — реквизиты адресации (полный object-слой реквизита + `addressingDimension`: ссылка на измерение регистра исполнителей). diff --git a/tests/skills/cases/cf-init/error-compat-newer-than-format.json b/tests/skills/cases/cf-init/error-compat-newer-than-format.json new file mode 100644 index 000000000..25f276a39 --- /dev/null +++ b/tests/skills/cases/cf-init/error-compat-newer-than-format.json @@ -0,0 +1,14 @@ +{ + "name": "Режим совместимости новее платформы своей версии формата — отказ до генерации", + "params": { + "name": "Конфа" + }, + "args_extra": [ + "-FormatVersion", + "2.17", + "-CompatibilityMode", + "Version8_3_27" + ], + "expectError": "needs platform 8.3.27 (format 2.20 or newer)", + "noSnapshot": "негативный кейс — навык отказывает до генерации" +} diff --git a/tests/skills/cases/cf-validate/error-window-mode-fullscreen.json b/tests/skills/cases/cf-validate/error-window-mode-fullscreen.json new file mode 100644 index 000000000..95749824e --- /dev/null +++ b/tests/skills/cases/cf-validate/error-window-mode-fullscreen.json @@ -0,0 +1,23 @@ +{ + "name": "MainClientApplicationWindowMode=Fullscreen — ошибка: у платформы FullscreenWorkplace", + "preRun": [ + { + "script": "cf-edit/scripts/cf-edit", + "input": [ + { + "operation": "modify-property", + "value": "MainClientApplicationWindowMode=Fullscreen" + } + ], + "args": { + "-ConfigPath": "{workDir}", + "-DefinitionFile": "{inputFile}" + } + } + ], + "expectError": true, + "noSnapshot": "негативный кейс — конфигурация с недопустимым значением; проверяется stdout", + "expect": { + "stdoutContains": "Property 'MainClientApplicationWindowMode' has invalid value 'Fullscreen'" + } +} diff --git a/tests/skills/cases/cf-validate/snapshots/window-mode-fullscreen-workplace/Configuration.xml b/tests/skills/cases/cf-validate/snapshots/window-mode-fullscreen-workplace/Configuration.xml new file mode 100644 index 000000000..6cadbb0fa --- /dev/null +++ b/tests/skills/cases/cf-validate/snapshots/window-mode-fullscreen-workplace/Configuration.xml @@ -0,0 +1,251 @@ + + + + + + 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 + + + + + + FullscreenWorkplace + + + Language.Русский + + + + + + Managed + NotAutoFree + DontUse + DontUse + TaxiEnableVersion8_2 + DontUse + Version8_3_24 + + + + Русский + + + \ No newline at end of file diff --git a/tests/skills/cases/cf-validate/snapshots/window-mode-fullscreen-workplace/Ext/ClientApplicationInterface.xml b/tests/skills/cases/cf-validate/snapshots/window-mode-fullscreen-workplace/Ext/ClientApplicationInterface.xml new file mode 100644 index 000000000..3c1161b2d --- /dev/null +++ b/tests/skills/cases/cf-validate/snapshots/window-mode-fullscreen-workplace/Ext/ClientApplicationInterface.xml @@ -0,0 +1,18 @@ + + + + + UUID-002 + + + + + UUID-004 + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/cf-validate/snapshots/window-mode-fullscreen-workplace/Languages/Русский.xml b/tests/skills/cases/cf-validate/snapshots/window-mode-fullscreen-workplace/Languages/Русский.xml new file mode 100644 index 000000000..37c60d786 --- /dev/null +++ b/tests/skills/cases/cf-validate/snapshots/window-mode-fullscreen-workplace/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file diff --git a/tests/skills/cases/cf-validate/window-mode-fullscreen-workplace.json b/tests/skills/cases/cf-validate/window-mode-fullscreen-workplace.json new file mode 100644 index 000000000..4bc3f66f6 --- /dev/null +++ b/tests/skills/cases/cf-validate/window-mode-fullscreen-workplace.json @@ -0,0 +1,21 @@ +{ + "name": "MainClientApplicationWindowMode=FullscreenWorkplace — допустимо", + "preRun": [ + { + "script": "cf-edit/scripts/cf-edit", + "input": [ + { + "operation": "modify-property", + "value": "MainClientApplicationWindowMode=FullscreenWorkplace" + } + ], + "args": { + "-ConfigPath": "{workDir}", + "-DefinitionFile": "{inputFile}" + } + } + ], + "expect": { + "stdoutNotContains": "MainClientApplicationWindowMode" + } +} diff --git a/tests/skills/cases/meta-compile/calc-dependence-on-registration-period.json b/tests/skills/cases/meta-compile/calc-dependence-on-registration-period.json new file mode 100644 index 000000000..2f4558f31 --- /dev/null +++ b/tests/skills/cases/meta-compile/calc-dependence-on-registration-period.json @@ -0,0 +1,18 @@ +{ + "name": "План видов расчёта: зависимость по периоду регистрации с базовым планом", + "input": { + "type": "ChartOfCalculationTypes", + "name": "Начисления", + "dependenceOnCalculationTypes": "OnRegistrationPeriod", + "baseCalculationTypes": [ + "ChartOfCalculationTypes.Начисления" + ] + }, + "validatePath": "ChartsOfCalculationTypes/Начисления.xml", + "expect": { + "fileContains": { + "file": "ChartsOfCalculationTypes/Начисления.xml", + "text": "OnRegistrationPeriod" + } + } +} diff --git a/tests/skills/cases/meta-compile/error-catalog-presentation-asnumber.json b/tests/skills/cases/meta-compile/error-catalog-presentation-asnumber.json new file mode 100644 index 000000000..d14106e2e --- /dev/null +++ b/tests/skills/cases/meta-compile/error-catalog-presentation-asnumber.json @@ -0,0 +1,9 @@ +{ + "name": "Ошибка: defaultPresentation=AsNumber у справочника — «в виде номера» только у задачи", + "input": { + "type": "Catalog", + "name": "Товары", + "defaultPresentation": "AsNumber" + }, + "expectError": "Invalid value 'AsNumber'" +} diff --git a/tests/skills/cases/meta-compile/error-fillchecking-alias-warning.json b/tests/skills/cases/meta-compile/error-fillchecking-alias-warning.json new file mode 100644 index 000000000..19219e4b0 --- /dev/null +++ b/tests/skills/cases/meta-compile/error-fillchecking-alias-warning.json @@ -0,0 +1,15 @@ +{ + "name": "Ошибка: fillChecking=«Предупреждение» — такого режима у платформы нет", + "input": { + "type": "Catalog", + "name": "Товары", + "attributes": [ + { + "name": "Цена", + "type": "Number(15,2)", + "fillChecking": "Предупреждение" + } + ] + }, + "expectError": "Invalid value 'Предупреждение'" +} diff --git a/tests/skills/cases/meta-compile/error-fillchecking-showwarning.json b/tests/skills/cases/meta-compile/error-fillchecking-showwarning.json new file mode 100644 index 000000000..54947ea6e --- /dev/null +++ b/tests/skills/cases/meta-compile/error-fillchecking-showwarning.json @@ -0,0 +1,15 @@ +{ + "name": "Ошибка: fillChecking=ShowWarning — у платформы только DontCheck и ShowError", + "input": { + "type": "Catalog", + "name": "Товары", + "attributes": [ + { + "name": "Цена", + "type": "Number(15,2)", + "fillChecking": "ShowWarning" + } + ] + }, + "expectError": "Invalid value 'ShowWarning'" +} diff --git a/tests/skills/cases/meta-compile/error-registerrecords-writeall.json b/tests/skills/cases/meta-compile/error-registerrecords-writeall.json new file mode 100644 index 000000000..9b7fd20e8 --- /dev/null +++ b/tests/skills/cases/meta-compile/error-registerrecords-writeall.json @@ -0,0 +1,9 @@ +{ + "name": "Ошибка: registerRecordsWritingOnPost=WriteAll — у платформы только WriteSelected и WriteModified", + "input": { + "type": "Document", + "name": "Заказ", + "registerRecordsWritingOnPost": "WriteAll" + }, + "expectError": "Invalid value 'WriteAll'" +} diff --git a/tests/skills/cases/meta-compile/snapshots/calc-dependence-on-registration-period/ChartsOfCalculationTypes/Начисления.xml b/tests/skills/cases/meta-compile/snapshots/calc-dependence-on-registration-period/ChartsOfCalculationTypes/Начисления.xml new file mode 100644 index 000000000..617d75bc9 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/calc-dependence-on-registration-period/ChartsOfCalculationTypes/Начисления.xml @@ -0,0 +1,381 @@ + + + + + + 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 + + + UUID-016 + UUID-017 + + + UUID-018 + UUID-019 + + + UUID-020 + UUID-021 + + + UUID-022 + UUID-023 + + + + Начисления + + + ru + Начисления + + + + true + 5 + 100 + String + Variable + AsDescription + InDialog + false + BothWays + + ChartOfCalculationTypes.Начисления.StandardAttribute.Description + ChartOfCalculationTypes.Начисления.StandardAttribute.Code + + Begin + DontUse + Directly + DontUse + Auto + + + + + + + + OnRegistrationPeriod + + ChartOfCalculationTypes.Начисления + + false + + + + + + + Ведущие виды расчета + + + + + DontCheck + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + ShowError + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + + + + + Вытесняющие виды расчета + + + + + DontCheck + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + ShowError + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + + + + + Базовые виды расчета + + + + + DontCheck + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + ShowError + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + + Auto + false + + Managed + Use + + + + + + DontUse + false + false + + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-compile/snapshots/calc-dependence-on-registration-period/ChartsOfCalculationTypes/Начисления/Ext/ObjectModule.bsl b/tests/skills/cases/meta-compile/snapshots/calc-dependence-on-registration-period/ChartsOfCalculationTypes/Начисления/Ext/ObjectModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/tests/skills/cases/meta-compile/snapshots/calc-dependence-on-registration-period/Configuration.xml b/tests/skills/cases/meta-compile/snapshots/calc-dependence-on-registration-period/Configuration.xml new file mode 100644 index 000000000..31e199e0b --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/calc-dependence-on-registration-period/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/calc-dependence-on-registration-period/Ext/ClientApplicationInterface.xml b/tests/skills/cases/meta-compile/snapshots/calc-dependence-on-registration-period/Ext/ClientApplicationInterface.xml new file mode 100644 index 000000000..3c1161b2d --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/calc-dependence-on-registration-period/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/calc-dependence-on-registration-period/Languages/Русский.xml b/tests/skills/cases/meta-compile/snapshots/calc-dependence-on-registration-period/Languages/Русский.xml new file mode 100644 index 000000000..37c60d786 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/calc-dependence-on-registration-period/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-compile/snapshots/task-presentation-asnumber/Configuration.xml b/tests/skills/cases/meta-compile/snapshots/task-presentation-asnumber/Configuration.xml new file mode 100644 index 000000000..416142476 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/task-presentation-asnumber/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/task-presentation-asnumber/Ext/ClientApplicationInterface.xml b/tests/skills/cases/meta-compile/snapshots/task-presentation-asnumber/Ext/ClientApplicationInterface.xml new file mode 100644 index 000000000..3c1161b2d --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/task-presentation-asnumber/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/task-presentation-asnumber/Languages/Русский.xml b/tests/skills/cases/meta-compile/snapshots/task-presentation-asnumber/Languages/Русский.xml new file mode 100644 index 000000000..37c60d786 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/task-presentation-asnumber/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-compile/snapshots/task-presentation-asnumber/Tasks/Задача.xml b/tests/skills/cases/meta-compile/snapshots/task-presentation-asnumber/Tasks/Задача.xml new file mode 100644 index 000000000..0c14905ff --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/task-presentation-asnumber/Tasks/Задача.xml @@ -0,0 +1,289 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + + Задача + + + ru + Задача + + + + true + String + 14 + Variable + true + true + BusinessProcessNumber + 150 + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + AsNumber + InDialog + + Task.Задача.StandardAttribute.Number + + Begin + DontUse + Directly + DontUse + + + + + + + Auto + false + + Managed + Use + + + + + + DontUse + false + false + + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-compile/snapshots/task-presentation-asnumber/Tasks/Задача/Ext/ObjectModule.bsl b/tests/skills/cases/meta-compile/snapshots/task-presentation-asnumber/Tasks/Задача/Ext/ObjectModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/tests/skills/cases/meta-compile/task-presentation-asnumber.json b/tests/skills/cases/meta-compile/task-presentation-asnumber.json new file mode 100644 index 000000000..434b19cdc --- /dev/null +++ b/tests/skills/cases/meta-compile/task-presentation-asnumber.json @@ -0,0 +1,15 @@ +{ + "name": "Задача с представлением «в виде номера» (AsNumber)", + "input": { + "type": "Task", + "name": "Задача", + "defaultPresentation": "AsNumber" + }, + "validatePath": "Tasks/Задача.xml", + "expect": { + "fileContains": { + "file": "Tasks/Задача.xml", + "text": "AsNumber" + } + } +} diff --git a/tests/skills/cases/meta-edit/error-attribute-fillchecking-showwarning.json b/tests/skills/cases/meta-edit/error-attribute-fillchecking-showwarning.json new file mode 100644 index 000000000..8c6550591 --- /dev/null +++ b/tests/skills/cases/meta-edit/error-attribute-fillchecking-showwarning.json @@ -0,0 +1,32 @@ +{ + "name": "Ошибка: fillChecking=ShowWarning у реквизита — у платформы только DontCheck и ShowError", + "preRun": [ + { + "script": "meta-compile/scripts/meta-compile", + "input": { + "type": "Catalog", + "name": "Контрагенты", + "attributes": [ + "ИНН: String(12)" + ] + }, + "args": { + "-JsonPath": "{inputFile}", + "-OutputDir": "{workDir}" + } + } + ], + "params": { + "objectPath": "Catalogs/Контрагенты" + }, + "input": { + "modify": { + "attributes": { + "ИНН": { + "fillChecking": "ShowWarning" + } + } + } + }, + "expectError": "Invalid value 'ShowWarning'" +} diff --git a/tests/skills/cases/meta-edit/modify-calc-dependence-on-registration-period.json b/tests/skills/cases/meta-edit/modify-calc-dependence-on-registration-period.json new file mode 100644 index 000000000..aa3f378b9 --- /dev/null +++ b/tests/skills/cases/meta-edit/modify-calc-dependence-on-registration-period.json @@ -0,0 +1,35 @@ +{ + "name": "План видов расчёта: зависимость по периоду регистрации (OnRegistrationPeriod) принимается", + "preRun": [ + { + "script": "meta-compile/scripts/meta-compile", + "input": { + "type": "ChartOfCalculationTypes", + "name": "Начисления", + "baseCalculationTypes": [ + "ChartOfCalculationTypes.Начисления" + ] + }, + "args": { + "-JsonPath": "{inputFile}", + "-OutputDir": "{workDir}" + } + } + ], + "params": { + "objectPath": "ChartsOfCalculationTypes/Начисления" + }, + "input": { + "modify": { + "properties": { + "DependenceOnCalculationTypes": "OnRegistrationPeriod" + } + } + }, + "expect": { + "fileContains": { + "file": "ChartsOfCalculationTypes/Начисления.xml", + "text": "OnRegistrationPeriod" + } + } +} diff --git a/tests/skills/cases/meta-edit/snapshots/modify-calc-dependence-on-registration-period/ChartsOfCalculationTypes/Начисления.xml b/tests/skills/cases/meta-edit/snapshots/modify-calc-dependence-on-registration-period/ChartsOfCalculationTypes/Начисления.xml new file mode 100644 index 000000000..617d75bc9 --- /dev/null +++ b/tests/skills/cases/meta-edit/snapshots/modify-calc-dependence-on-registration-period/ChartsOfCalculationTypes/Начисления.xml @@ -0,0 +1,381 @@ + + + + + + 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 + + + UUID-016 + UUID-017 + + + UUID-018 + UUID-019 + + + UUID-020 + UUID-021 + + + UUID-022 + UUID-023 + + + + Начисления + + + ru + Начисления + + + + true + 5 + 100 + String + Variable + AsDescription + InDialog + false + BothWays + + ChartOfCalculationTypes.Начисления.StandardAttribute.Description + ChartOfCalculationTypes.Начисления.StandardAttribute.Code + + Begin + DontUse + Directly + DontUse + Auto + + + + + + + + OnRegistrationPeriod + + ChartOfCalculationTypes.Начисления + + false + + + + + + + Ведущие виды расчета + + + + + DontCheck + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + ShowError + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + + + + + Вытесняющие виды расчета + + + + + DontCheck + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + ShowError + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + + + + + Базовые виды расчета + + + + + DontCheck + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + ShowError + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + + Auto + false + + Managed + Use + + + + + + DontUse + false + false + + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-edit/snapshots/modify-calc-dependence-on-registration-period/ChartsOfCalculationTypes/Начисления/Ext/ObjectModule.bsl b/tests/skills/cases/meta-edit/snapshots/modify-calc-dependence-on-registration-period/ChartsOfCalculationTypes/Начисления/Ext/ObjectModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/tests/skills/cases/meta-edit/snapshots/modify-calc-dependence-on-registration-period/Configuration.xml b/tests/skills/cases/meta-edit/snapshots/modify-calc-dependence-on-registration-period/Configuration.xml new file mode 100644 index 000000000..31e199e0b --- /dev/null +++ b/tests/skills/cases/meta-edit/snapshots/modify-calc-dependence-on-registration-period/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-edit/snapshots/modify-calc-dependence-on-registration-period/Ext/ClientApplicationInterface.xml b/tests/skills/cases/meta-edit/snapshots/modify-calc-dependence-on-registration-period/Ext/ClientApplicationInterface.xml new file mode 100644 index 000000000..3c1161b2d --- /dev/null +++ b/tests/skills/cases/meta-edit/snapshots/modify-calc-dependence-on-registration-period/Ext/ClientApplicationInterface.xml @@ -0,0 +1,18 @@ + + + + + UUID-002 + + + + + UUID-004 + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-edit/snapshots/modify-calc-dependence-on-registration-period/Languages/Русский.xml b/tests/skills/cases/meta-edit/snapshots/modify-calc-dependence-on-registration-period/Languages/Русский.xml new file mode 100644 index 000000000..37c60d786 --- /dev/null +++ b/tests/skills/cases/meta-edit/snapshots/modify-calc-dependence-on-registration-period/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-validate/error-catalog-presentation-asnumber.json b/tests/skills/cases/meta-validate/error-catalog-presentation-asnumber.json new file mode 100644 index 000000000..a46849611 --- /dev/null +++ b/tests/skills/cases/meta-validate/error-catalog-presentation-asnumber.json @@ -0,0 +1,13 @@ +{ + "name": "DefaultPresentation=AsNumber у справочника — ошибка: «в виде номера» есть только у задачи", + "setup": "fixture:catalog-presentation-asnumber", + "params": { + "objectPath": "Catalogs/Товары.xml" + }, + "expectError": true, + "noSnapshot": "фикстура статична, meta-validate только читает и печатает — эталон зафиксировал бы саму фикстуру; проверяется stdout", + "skipPlatformVerify": "фикстура — один объект без остальной конфигурации; полная загрузка такого дерева невозможна", + "expect": { + "stdoutContains": "Property 'DefaultPresentation' has invalid value 'AsNumber'" + } +} diff --git a/tests/skills/cases/meta-validate/error-enum-case.json b/tests/skills/cases/meta-validate/error-enum-case.json new file mode 100644 index 000000000..9f5f08a06 --- /dev/null +++ b/tests/skills/cases/meta-validate/error-enum-case.json @@ -0,0 +1,13 @@ +{ + "name": "Значение перечисления с другим регистром (writeSelected) — ошибка: платформа читает по точному имени", + "setup": "fixture:document-writeselected-lowercase", + "params": { + "objectPath": "Documents/Заказ.xml" + }, + "expectError": true, + "noSnapshot": "фикстура статична, meta-validate только читает и печатает — эталон зафиксировал бы саму фикстуру; проверяется stdout", + "skipPlatformVerify": "фикстура — один объект без остальной конфигурации; полная загрузка такого дерева невозможна", + "expect": { + "stdoutContains": "Property 'RegisterRecordsWritingOnPost' has invalid value 'writeSelected'" + } +} diff --git a/tests/skills/cases/meta-validate/error-enum-writeall.json b/tests/skills/cases/meta-validate/error-enum-writeall.json new file mode 100644 index 000000000..785c05b67 --- /dev/null +++ b/tests/skills/cases/meta-validate/error-enum-writeall.json @@ -0,0 +1,13 @@ +{ + "name": "RegisterRecordsWritingOnPost=WriteAll — ошибка: платформа такого значения не знает", + "setup": "fixture:document-writeall", + "params": { + "objectPath": "Documents/Заказ.xml" + }, + "expectError": true, + "noSnapshot": "фикстура статична, meta-validate только читает и печатает — эталон зафиксировал бы саму фикстуру; проверяется stdout", + "skipPlatformVerify": "фикстура — один объект без остальной конфигурации; полная загрузка такого дерева невозможна", + "expect": { + "stdoutContains": "Property 'RegisterRecordsWritingOnPost' has invalid value 'WriteAll'" + } +} diff --git a/tests/skills/cases/meta-validate/fixtures/catalog-presentation-asnumber/Catalogs/Товары.xml b/tests/skills/cases/meta-validate/fixtures/catalog-presentation-asnumber/Catalogs/Товары.xml new file mode 100644 index 000000000..93edfb02c --- /dev/null +++ b/tests/skills/cases/meta-validate/fixtures/catalog-presentation-asnumber/Catalogs/Товары.xml @@ -0,0 +1,137 @@ + + + + + + f0dd2ce6-8321-4489-840a-b5615ea1d7a1 + 86999ba3-73a7-4e2b-9bce-e75a8e2fa38a + + + f6f08879-1047-4c24-9ce9-56539b02d53c + c6761365-0f6c-45a2-9947-623385b10606 + + + 3c849226-634d-47e0-807d-2762fe42768f + fb86f429-28c5-46d6-8d83-57d40dd4bb5e + + + dd637eef-d338-4e3b-9132-21c292f82794 + d75ccf09-0d3e-4a96-acce-d7750d0447ae + + + 8847e348-c5d1-4f21-b7fd-57775f0e2cc4 + 1066182c-427e-4ad8-82f2-8d1e2dcd9198 + + + + Товары + + + ru + Товары + + + + false + HierarchyFoldersAndItems + false + 2 + true + true + + ToItems + 9 + 25 + String + Variable + WholeCatalog + false + true + AsNumber + + Auto + InDialog + false + BothWays + + Catalog.Товары.StandardAttribute.Description + Catalog.Товары.StandardAttribute.Code + + Begin + DontUse + Directly + + + + + + + + + + + false + + + Managed + Use + + + + + + Use + Auto + DontUse + false + false + + + + + Цена + + + ru + Цена + + + + + xs:decimal + + 15 + 2 + Any + + + false + + + + false + + false + false + + + false + 0 + DontCheck + Items + + + Auto + Auto + + + Auto + ForItem + DontIndex + Use + Use + + + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-validate/fixtures/catalog-presentation-asnumber/Configuration.xml b/tests/skills/cases/meta-validate/fixtures/catalog-presentation-asnumber/Configuration.xml new file mode 100644 index 000000000..c4c94f599 --- /dev/null +++ b/tests/skills/cases/meta-validate/fixtures/catalog-presentation-asnumber/Configuration.xml @@ -0,0 +1,255 @@ + + + + + + 9cd510cd-abfc-11d4-9434-004095e12fc7 + d78171cf-a8ca-49ac-bcac-def445364157 + + + 9fcd25a0-4822-11d4-9414-008048da11f9 + ddc659d0-00d7-4eea-8e0a-50b00a0a02dc + + + e3687481-0a87-462c-a166-9f34594f9bba + 485bc8a6-ceda-4e2c-a265-3ee199ebb864 + + + 9de14907-ec23-4a07-96f0-85521cb6b53b + 0e6db8dc-07f1-448b-ab37-739da007d9cb + + + 51f2d5d8-ea4d-4064-8892-82951750031e + c1699f7d-d066-4f5c-96df-354add9e9fd7 + + + e68182ea-4237-4383-967f-90c1e3370bc7 + f93dc070-3289-4b6d-923b-0eeb915adc10 + + + fb282519-d103-4dd3-bc12-cb271d631dfc + 33dec689-c459-4a0f-bc81-a8b37f658b79 + + + + 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-validate/fixtures/document-writeall/Configuration.xml b/tests/skills/cases/meta-validate/fixtures/document-writeall/Configuration.xml new file mode 100644 index 000000000..c4c94f599 --- /dev/null +++ b/tests/skills/cases/meta-validate/fixtures/document-writeall/Configuration.xml @@ -0,0 +1,255 @@ + + + + + + 9cd510cd-abfc-11d4-9434-004095e12fc7 + d78171cf-a8ca-49ac-bcac-def445364157 + + + 9fcd25a0-4822-11d4-9414-008048da11f9 + ddc659d0-00d7-4eea-8e0a-50b00a0a02dc + + + e3687481-0a87-462c-a166-9f34594f9bba + 485bc8a6-ceda-4e2c-a265-3ee199ebb864 + + + 9de14907-ec23-4a07-96f0-85521cb6b53b + 0e6db8dc-07f1-448b-ab37-739da007d9cb + + + 51f2d5d8-ea4d-4064-8892-82951750031e + c1699f7d-d066-4f5c-96df-354add9e9fd7 + + + e68182ea-4237-4383-967f-90c1e3370bc7 + f93dc070-3289-4b6d-923b-0eeb915adc10 + + + fb282519-d103-4dd3-bc12-cb271d631dfc + 33dec689-c459-4a0f-bc81-a8b37f658b79 + + + + 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-validate/fixtures/document-writeall/Documents/Заказ.xml b/tests/skills/cases/meta-validate/fixtures/document-writeall/Documents/Заказ.xml new file mode 100644 index 000000000..6e3c3ca69 --- /dev/null +++ b/tests/skills/cases/meta-validate/fixtures/document-writeall/Documents/Заказ.xml @@ -0,0 +1,82 @@ + + + + + + e52093e3-420a-4b92-ba55-ffdbb2a2a575 + 399e7850-45a2-45a1-a062-c94ce4e0e40f + + + af3336db-6cd3-4514-b309-bad7ae5f6203 + c513daa1-abad-4ccc-8a6c-7184c2ac196d + + + 0f5e60d5-c9e7-441f-9075-c25c6bf0fad1 + 968b9c6c-766e-4efa-abab-87fd5b0195a4 + + + a91b0aa0-9809-4f4e-87fe-8375acfd9ceb + 84855023-4029-49ad-bcf9-a921b4a07d4e + + + 4ec2477f-d940-45c8-9084-a5b50b8ad722 + 2faf7950-6794-4e7f-83a6-ac7bae86a0fc + + + + Заказ + + + ru + Заказ + + + + true + + String + 11 + Variable + Year + true + true + + + + Document.Заказ.StandardAttribute.Number + + Use + Begin + DontUse + Directly + + + + + + + Allow + Deny + AutoDelete + WriteAll + AutoFill + + true + true + false + + Managed + Use + + + + + + Auto + DontUse + false + false + + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-validate/fixtures/document-writeselected-lowercase/Configuration.xml b/tests/skills/cases/meta-validate/fixtures/document-writeselected-lowercase/Configuration.xml new file mode 100644 index 000000000..c4c94f599 --- /dev/null +++ b/tests/skills/cases/meta-validate/fixtures/document-writeselected-lowercase/Configuration.xml @@ -0,0 +1,255 @@ + + + + + + 9cd510cd-abfc-11d4-9434-004095e12fc7 + d78171cf-a8ca-49ac-bcac-def445364157 + + + 9fcd25a0-4822-11d4-9414-008048da11f9 + ddc659d0-00d7-4eea-8e0a-50b00a0a02dc + + + e3687481-0a87-462c-a166-9f34594f9bba + 485bc8a6-ceda-4e2c-a265-3ee199ebb864 + + + 9de14907-ec23-4a07-96f0-85521cb6b53b + 0e6db8dc-07f1-448b-ab37-739da007d9cb + + + 51f2d5d8-ea4d-4064-8892-82951750031e + c1699f7d-d066-4f5c-96df-354add9e9fd7 + + + e68182ea-4237-4383-967f-90c1e3370bc7 + f93dc070-3289-4b6d-923b-0eeb915adc10 + + + fb282519-d103-4dd3-bc12-cb271d631dfc + 33dec689-c459-4a0f-bc81-a8b37f658b79 + + + + 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-validate/fixtures/document-writeselected-lowercase/Documents/Заказ.xml b/tests/skills/cases/meta-validate/fixtures/document-writeselected-lowercase/Documents/Заказ.xml new file mode 100644 index 000000000..6321eb536 --- /dev/null +++ b/tests/skills/cases/meta-validate/fixtures/document-writeselected-lowercase/Documents/Заказ.xml @@ -0,0 +1,82 @@ + + + + + + e52093e3-420a-4b92-ba55-ffdbb2a2a575 + 399e7850-45a2-45a1-a062-c94ce4e0e40f + + + af3336db-6cd3-4514-b309-bad7ae5f6203 + c513daa1-abad-4ccc-8a6c-7184c2ac196d + + + 0f5e60d5-c9e7-441f-9075-c25c6bf0fad1 + 968b9c6c-766e-4efa-abab-87fd5b0195a4 + + + a91b0aa0-9809-4f4e-87fe-8375acfd9ceb + 84855023-4029-49ad-bcf9-a921b4a07d4e + + + 4ec2477f-d940-45c8-9084-a5b50b8ad722 + 2faf7950-6794-4e7f-83a6-ac7bae86a0fc + + + + Заказ + + + ru + Заказ + + + + true + + String + 11 + Variable + Year + true + true + + + + Document.Заказ.StandardAttribute.Number + + Use + Begin + DontUse + Directly + + + + + + + Allow + Deny + AutoDelete + writeSelected + AutoFill + + true + true + false + + Managed + Use + + + + + + Auto + DontUse + false + false + + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-validate/fixtures/task-presentation-asnumber/Configuration.xml b/tests/skills/cases/meta-validate/fixtures/task-presentation-asnumber/Configuration.xml new file mode 100644 index 000000000..c4c94f599 --- /dev/null +++ b/tests/skills/cases/meta-validate/fixtures/task-presentation-asnumber/Configuration.xml @@ -0,0 +1,255 @@ + + + + + + 9cd510cd-abfc-11d4-9434-004095e12fc7 + d78171cf-a8ca-49ac-bcac-def445364157 + + + 9fcd25a0-4822-11d4-9414-008048da11f9 + ddc659d0-00d7-4eea-8e0a-50b00a0a02dc + + + e3687481-0a87-462c-a166-9f34594f9bba + 485bc8a6-ceda-4e2c-a265-3ee199ebb864 + + + 9de14907-ec23-4a07-96f0-85521cb6b53b + 0e6db8dc-07f1-448b-ab37-739da007d9cb + + + 51f2d5d8-ea4d-4064-8892-82951750031e + c1699f7d-d066-4f5c-96df-354add9e9fd7 + + + e68182ea-4237-4383-967f-90c1e3370bc7 + f93dc070-3289-4b6d-923b-0eeb915adc10 + + + fb282519-d103-4dd3-bc12-cb271d631dfc + 33dec689-c459-4a0f-bc81-a8b37f658b79 + + + + 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-validate/fixtures/task-presentation-asnumber/Tasks/Задача.xml b/tests/skills/cases/meta-validate/fixtures/task-presentation-asnumber/Tasks/Задача.xml new file mode 100644 index 000000000..71aa610b7 --- /dev/null +++ b/tests/skills/cases/meta-validate/fixtures/task-presentation-asnumber/Tasks/Задача.xml @@ -0,0 +1,289 @@ + + + + + + 791a3e39-c3ed-41bf-bbaa-5e27025da29e + 441790a0-8b36-481d-8c23-ed95150ae8c2 + + + c7a63969-6efe-4add-8348-d8ad72ea0c1c + 45a5eb53-4946-4a1d-aea7-7f372d4ffd05 + + + 07c7ff1e-584e-4f8e-91d9-50ace3d8c54c + 7d8094c0-7f63-4ff4-8449-97f8055db93c + + + bc177e1a-bd7e-477c-aec1-e566fff9597c + 1e1f22c1-ceb6-4c19-aa88-93edbc2d6351 + + + 6a9f103a-24ea-4bda-b503-9b59f95c2573 + 2067d8f5-1bee-48c6-a97f-26acad3edbf8 + + + + Задача + + + ru + Задача + + + + true + String + 14 + Variable + true + true + BusinessProcessNumber + 150 + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + AsNumber + InDialog + + Task.Задача.StandardAttribute.Number + + Begin + DontUse + Directly + DontUse + + + + + + + Auto + false + + Managed + Use + + + + + + DontUse + false + false + + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-validate/task-presentation-asnumber.json b/tests/skills/cases/meta-validate/task-presentation-asnumber.json new file mode 100644 index 000000000..e351fd97e --- /dev/null +++ b/tests/skills/cases/meta-validate/task-presentation-asnumber.json @@ -0,0 +1,12 @@ +{ + "name": "DefaultPresentation=AsNumber у задачи — допустимо", + "setup": "fixture:task-presentation-asnumber", + "params": { + "objectPath": "Tasks/Задача.xml" + }, + "noSnapshot": "фикстура статична, meta-validate только читает и печатает — эталон зафиксировал бы саму фикстуру; проверяется stdout", + "skipPlatformVerify": "фикстура — один объект без остальной конфигурации; полная загрузка такого дерева невозможна", + "expect": { + "stdoutNotContains": "DefaultPresentation" + } +} diff --git a/tests/skills/check-enum-drift.mjs b/tests/skills/check-enum-drift.mjs index 3c2c313bb..645455f5e 100644 --- a/tests/skills/check-enum-drift.mjs +++ b/tests/skills/check-enum-drift.mjs @@ -1,6 +1,6 @@ #!/usr/bin/env node // Анти-дрейф enum-allowlist-ов: сверяет продублированные списки допустимых значений перечислений -// meta-compile (АВТОРИТЕТ) ↔ meta-validate ↔ meta-edit. Навыки автономны (allowlist-ы копируются +// meta-compile (АВТОРИТЕТ) ↔ meta-validate ↔ meta-edit, а также cf-validate (АВТОРИТЕТ) ↔ cfe-validate. Навыки автономны (allowlist-ы копируются // намеренно), поэтому нужен гард от расхождений значений (напр. HierarchyItemsOnly vs HierarchyOfItems). // Парсит .ps1 (канонический порт). Выход 1 при дрейфе. Запуск: node tests/skills/check-enum-drift.mjs import { readFileSync } from 'node:fs'; @@ -23,7 +23,8 @@ function parsePs1EnumMap(file, varName) { } const block = text.slice(text.indexOf('@{', at) + 2, end); const map = {}; - const re = /"([\wА-Яа-яЁё]+)"\s*=\s*@\(([^)]*)\)/g; + // Ключ — свойство или уточнение по виду объекта «Вид.Свойство» (Task.DefaultPresentation) + const re = /"([\wА-Яа-яЁё.]+)"\s*=\s*@\(([^)]*)\)/g; let m; while ((m = re.exec(block)) !== null) { map[m[1]] = [...m[2].matchAll(/"([^"]*)"/g)].map(v => v[1]); @@ -52,5 +53,15 @@ for (const [name, map] of [['meta-validate', validate], ['meta-edit', edit]]) { if (!compile[prop]) console.log(`INFO ${name}.${prop} нет в meta-compile.validEnumValues (проверьте ключ)`); } } -console.log(drift === 0 ? 'OK — нет дрейфа значений enum-allowlist vs meta-compile' : `\n${drift} DRIFT(s) — свести к meta-compile.`); +// Корень конфигурации и корень расширения: общие свойства (режимы совместимости, интерфейс) +// cf-validate и cfe-validate обязаны принимать одинаково — это одни и те же перечисления платформы. +const cfv = parsePs1EnumMap('.claude/skills/cf-validate/scripts/cf-validate.ps1', '$validEnumValues'); +const cfev = parsePs1EnumMap('.claude/skills/cfe-validate/scripts/cfe-validate.ps1', '$validEnumValues'); +for (const prop of Object.keys(cfev)) { + if (cfv[prop] && !eq(cfev[prop], cfv[prop])) { + console.log(`DRIFT cfe-validate.${prop}: [${cfev[prop].join(', ')}] != cf-validate [${cfv[prop].join(', ')}]`); + drift++; + } +} +console.log(drift === 0 ? 'OK — нет дрейфа значений enum-allowlist (meta-* vs meta-compile, cfe-validate vs cf-validate)' : `\n${drift} DRIFT(s) — свести к эталону.`); process.exit(drift ? 1 : 0); diff --git a/tests/skills/check-format-versions.mjs b/tests/skills/check-format-versions.mjs index 463d662cf..1fc7e742b 100644 --- a/tests/skills/check-format-versions.mjs +++ b/tests/skills/check-format-versions.mjs @@ -185,6 +185,27 @@ if (codeMin && ladder.length && !ladder.some((r) => r.version === codeMin)) { errors.push(`Нижняя граница в коде (${codeMin}) отсутствует в лестнице спецификации`); } +// ─── Инвариант 4: копия лестницы в cf-init совпадает со спекой ────────────── +// cf-init отвергает режим совместимости новее платформы своей -FormatVersion; для этого ему нужна +// сама лестница «платформа → формат». Разъедется со спекой — отказ станет ложным или пропустит +// противоречивый заказ, молча. +for (const [port, ext, re] of [ + ['ps1', '.ps1', /"(\d+\.\d+\.\d+)"\s*=\s*"(\d+\.\d+)"/g], + ['py', '.py', /"(\d+\.\d+\.\d+)":\s*"(\d+\.\d+)"/g], +]) { + const text = read(join(SKILLS, 'cf-init', 'scripts', 'cf-init' + ext)); + const block = text && (port === 'ps1' + ? /\$platformFormatLadder\s*=\s*\[ordered\]@\{([\s\S]*?)\}/.exec(text) + : /platform_format_ladder\s*=\s*\{([\s\S]*?)\}/.exec(text)); + if (!block) { + errors.push(`cf-init (${port}): не найдена лестница «платформа → формат» (platformFormatLadder)`); + continue; + } + const copy = [...block[1].matchAll(re)].map((m) => `${m[1]}=${m[2]}`).join(', '); + const spec = ladder.map((r) => `${r.platform}=${r.version}`).join(', '); + if (copy !== spec) errors.push(`cf-init (${port}): лестница [${copy}] != спека §7.1 [${spec}]`); +} + // ─── Вывод ────────────────────────────────────────────────────────────────── if (listMode) { console.log('Лестница версий (docs/1c-configuration-spec.md §7.1):');