From 3ef9e76f0357adb472b5b4f4c56883de90f3c1af Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Thu, 6 Aug 2026 21:41:42 +0300 Subject: [PATCH] =?UTF-8?q?feat(epf-init,erf-init,form-add,form-compile,te?= =?UTF-8?q?mplate-add,mxl-compile,help-add):=20=D0=B2=D0=B5=D1=80=D1=81?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=B0=20?= =?UTF-8?q?=D1=83=20=D0=B0=D0=B2=D1=82=D0=BE=D0=BD=D0=BE=D0=BC=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20EPF/ERF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Детекторы версии искали только Configuration.xml, поэтому внутри автономной внешней обработки или отчёта всегда получалось 2.17 — независимо от version в корне самого объекта. Теперь версия наследуется от корня EPF/ERF: подъём по дереву проверяет и <каталог>.xml с корнем ExternalDataProcessor/ExternalReport, а form-add и template-add читают её прямо из файла объекта, с которым работают. Только после этого у epf-init/erf-init появился параметр -FormatVersion (2.17…2.21, дефолт 2.17 — прежнее поведение). Без наследования он дал бы обработку 2.21, внутри которой формы и макеты остаются 2.17. Проверено сквозным прогоном: epf-init -FormatVersion 2.21 → form-add → template-add → mxl-compile, все файлы 2.21 с xmlns:pal, порты идентичны. Снэпшоты role-info/role-validate/cf-edit обновлены — их фикстуры строит role-compile, дрейф только от смены его формата на платформенный. 648/648 ps1, 645/648 py. Co-Authored-By: Claude Opus 5 (1M context) --- .claude/skills/epf-init/SKILL.md | 15 +- .claude/skills/epf-init/scripts/init.ps1 | 20 +- .claude/skills/epf-init/scripts/init.py | 45 +++- .claude/skills/erf-init/SKILL.md | 17 +- .claude/skills/erf-init/scripts/init.ps1 | 22 +- .claude/skills/erf-init/scripts/init.py | 47 ++++- .claude/skills/form-add/scripts/form-add.ps1 | 18 +- .claude/skills/form-add/scripts/form-add.py | 23 +- .../form-compile/scripts/form-compile.ps1 | 10 +- .../form-compile/scripts/form-compile.py | 12 +- .claude/skills/help-add/scripts/add-help.ps1 | 10 +- .claude/skills/help-add/scripts/add-help.py | 12 +- .../mxl-compile/scripts/mxl-compile.ps1 | 10 +- .../skills/mxl-compile/scripts/mxl-compile.py | 12 +- .../template-add/scripts/add-template.ps1 | 18 +- .../template-add/scripts/add-template.py | 84 +++++--- .../add-default-role/Roles/ПолныеПрава.xml | 43 ++-- .../Roles/ПолныеПрава/Ext/Rights.xml | 11 +- .../set-default-roles/Roles/Администратор.xml | 43 ++-- .../Roles/Администратор/Ext/Rights.xml | 11 +- .../set-default-roles/Roles/ПолныеПрава.xml | 43 ++-- .../Roles/ПолныеПрава/Ext/Rights.xml | 11 +- .../set-home-page/Roles/Оператор.xml | 43 ++-- .../Roles/Оператор/Ext/Rights.xml | 11 +- .../set-home-page/Roles/ПолныеПрава.xml | 43 ++-- .../Roles/ПолныеПрава/Ext/Rights.xml | 11 +- .../multiple-types/Roles/Комплексная.xml | 43 ++-- .../Roles/Комплексная/Ext/Rights.xml | 197 +++++++++--------- .../snapshots/overview/Roles/Тест.xml | 43 ++-- .../overview/Roles/Тест/Ext/Rights.xml | 11 +- .../with-rls/Roles/ОграниченноеЧтение.xml | 43 ++-- .../Roles/ОграниченноеЧтение/Ext/Rights.xml | 85 ++++---- .../multiple-objects/Roles/Менеджер.xml | 43 ++-- .../Roles/Менеджер/Ext/Rights.xml | 175 ++++++++-------- .../snapshots/valid-role/Roles/Тест.xml | 43 ++-- .../valid-role/Roles/Тест/Ext/Rights.xml | 11 +- .../with-rls/Roles/СОграничениями.xml | 43 ++-- .../Roles/СОграничениями/Ext/Rights.xml | 55 +++-- 38 files changed, 723 insertions(+), 714 deletions(-) diff --git a/.claude/skills/epf-init/SKILL.md b/.claude/skills/epf-init/SKILL.md index 85572a69..9761bca8 100644 --- a/.claude/skills/epf-init/SKILL.md +++ b/.claude/skills/epf-init/SKILL.md @@ -18,19 +18,20 @@ allowed-tools: ## Usage ``` -/epf-init [Synonym] [SrcDir] +/epf-init [Synonym] [SrcDir] [FormatVersion] ``` -| Параметр | Обязательный | По умолчанию | Описание | -|-----------|:------------:|--------------|-------------------------------------| -| Name | да | — | Имя обработки (латиница/кириллица) | -| Synonym | нет | = Name | Синоним (отображаемое имя) | -| SrcDir | нет | `src` | Каталог исходников относительно CWD | +| Параметр | Обязательный | По умолчанию | Описание | +|---------------|:------------:|--------------|------------------------------------------------| +| Name | да | — | Имя обработки (латиница/кириллица) | +| Synonym | нет | = Name | Синоним (отображаемое имя) | +| SrcDir | нет | `src` | Каталог исходников относительно CWD | +| FormatVersion | нет | `2.17` | Версия формата: 2.20 — платформа 8.3.27, 2.21 — 8.5. Дефолт открывается любой платформой | ## Команда ```powershell -powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/init.ps1" -Name "" [-Synonym ""] [-SrcDir ""] +powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/init.ps1" -Name "" [-Synonym ""] [-SrcDir ""] [-FormatVersion "<2.17|2.18|2.19|2.20|2.21>"] ``` ## Дальнейшие шаги diff --git a/.claude/skills/epf-init/scripts/init.ps1 b/.claude/skills/epf-init/scripts/init.ps1 index 799c6165..6c2b1ee9 100644 --- a/.claude/skills/epf-init/scripts/init.ps1 +++ b/.claude/skills/epf-init/scripts/init.ps1 @@ -1,4 +1,4 @@ -# epf-init v1.3 — Init 1C external data processor scaffold +# epf-init v1.4 — Init 1C external data processor scaffold # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -6,7 +6,13 @@ param( [string]$Synonym = $Name, - [string]$SrcDir = "src" + [string]$SrcDir = "src", + + # Версия формата выгрузки. Своей конфигурации у автономной обработки нет, наследовать + # версию неоткуда — поэтому её задают явно. Формы, макеты и справку внутри обработки + # навыки берут уже отсюда: их детектор читает version из корня этого файла. + [ValidateSet("2.17", "2.18", "2.19", "2.20", "2.21")] + [string]$FormatVersion = "2.17" ) $ErrorActionPreference = "Stop" @@ -18,9 +24,17 @@ $uuid2 = [guid]::NewGuid().ToString() $uuid3 = [guid]::NewGuid().ToString() $uuid4 = [guid]::NewGuid().ToString() +# Объявления пространств имён — одной переменной: места эмиссии её только интерполируют. +$xmlnsDecl = 'xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +# 2.21 (8.5) добавила в шапку пространство палитры. Вставляем НА МЕСТО (после lf, перед style): +# платформа держит объявления по алфавиту, дописать в конец нельзя. +if (($FormatVersion -match '^(\d+)\.(\d+)$') -and ([int]$Matches[1] * 100 + [int]$Matches[2]) -ge 221) { + $xmlnsDecl = $xmlnsDecl -replace ' xmlns:style=', ' xmlns:pal="http://v8.1c.ru/8.1/data/ui/colors/palette" xmlns:style=' +} + $xml = @" - + diff --git a/.claude/skills/epf-init/scripts/init.py b/.claude/skills/epf-init/scripts/init.py index 2e6cd688..4d7a4d72 100644 --- a/.claude/skills/epf-init/scripts/init.py +++ b/.claude/skills/epf-init/scripts/init.py @@ -1,8 +1,8 @@ #!/usr/bin/env python3 -# epf-init v1.3 — Init 1C external data processor scaffold +# epf-init v1.4 — Init 1C external data processor scaffold # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills """Generates minimal XML source files for a 1C external data processor.""" -import sys, os, argparse, uuid +import sys, os, re, argparse, uuid def esc_xml(s): return s.replace('&','&').replace('<','<').replace('>','>').replace('"','"') @@ -24,6 +24,12 @@ def write_xml_file(path, content): write_utf8_bom(path, text) +def format_rank(ver): + """"2.20" → 220, "2.9" → 209. Строковое сравнение неверно ("2.9" > "2.17").""" + m = re.match(r'^(\d+)\.(\d+)$', ver or '') + return int(m.group(1)) * 100 + int(m.group(2)) if m else 0 + + def main(): sys.stdout.reconfigure(encoding="utf-8") sys.stderr.reconfigure(encoding="utf-8") @@ -31,6 +37,11 @@ def main(): parser.add_argument('-Name', dest='Name', required=True) parser.add_argument('-Synonym', dest='Synonym', default=None) parser.add_argument('-SrcDir', dest='SrcDir', default='src') + # Версия формата выгрузки. Своей конфигурации у автономного объекта нет, наследовать + # версию неоткуда — поэтому её задают явно. Формы, макеты и справку внутри объекта + # навыки берут уже отсюда: их детектор читает version из корня этого файла. + parser.add_argument('-FormatVersion', dest='FormatVersion', default='2.17', + choices=['2.17', '2.18', '2.19', '2.20', '2.21']) args = parser.parse_args() name = args.Name @@ -42,8 +53,36 @@ def main(): uuid3 = new_uuid() uuid4 = new_uuid() + # Объявления пространств имён — одной переменной: места эмиссии её только подставляют. + xmlns_decl = ( + 'xmlns="http://v8.1c.ru/8.3/MDClasses"' + ' xmlns:app="http://v8.1c.ru/8.2/managed-application/core"' + ' xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config"' + ' xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi"' + ' xmlns:ent="http://v8.1c.ru/8.1/data/enterprise"' + ' xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform"' + ' xmlns:style="http://v8.1c.ru/8.1/data/ui/style"' + ' xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system"' + ' xmlns:v8="http://v8.1c.ru/8.1/data/core"' + ' xmlns:v8ui="http://v8.1c.ru/8.1/data/ui"' + ' xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web"' + ' xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows"' + ' xmlns:xen="http://v8.1c.ru/8.3/xcf/enums"' + ' xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef"' + ' xmlns:xr="http://v8.1c.ru/8.3/xcf/readable"' + ' xmlns:xs="http://www.w3.org/2001/XMLSchema"' + ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' + ) + format_version = args.FormatVersion + # 2.21 (8.5) добавила в шапку пространство палитры. Вставляем НА МЕСТО (после lf, перед + # style): платформа держит объявления по алфавиту, дописать в конец нельзя. + if format_rank(format_version) >= 221: + xmlns_decl = xmlns_decl.replace( + ' xmlns:style=', + ' xmlns:pal="http://v8.1c.ru/8.1/data/ui/colors/palette" xmlns:style=') + xml = f''' - + \t \t\t \t\t\t diff --git a/.claude/skills/erf-init/SKILL.md b/.claude/skills/erf-init/SKILL.md index b527b571..a5dce9c4 100644 --- a/.claude/skills/erf-init/SKILL.md +++ b/.claude/skills/erf-init/SKILL.md @@ -18,20 +18,21 @@ allowed-tools: ## Usage ``` -/erf-init [Synonym] [SrcDir] [--with-skd] +/erf-init [Synonym] [SrcDir] [FormatVersion] [--with-skd] ``` -| Параметр | Обязательный | По умолчанию | Описание | -|-----------|:------------:|--------------|---------------------------------------| -| Name | да | — | Имя отчёта (латиница/кириллица) | -| Synonym | нет | = Name | Синоним (отображаемое имя) | -| SrcDir | нет | `src` | Каталог исходников относительно CWD | -| --WithSKD | нет | — | Создать пустую СКД и привязать к MainDataCompositionSchema | +| Параметр | Обязательный | По умолчанию | Описание | +|---------------|:------------:|--------------|---------------------------------------| +| Name | да | — | Имя отчёта (латиница/кириллица) | +| Synonym | нет | = Name | Синоним (отображаемое имя) | +| SrcDir | нет | `src` | Каталог исходников относительно CWD | +| FormatVersion | нет | `2.17` | Версия формата: 2.20 — платформа 8.3.27, 2.21 — 8.5. Дефолт открывается любой платформой | +| --WithSKD | нет | — | Создать пустую СКД и привязать к MainDataCompositionSchema | ## Команда ```powershell -powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/init.ps1" -Name "" [-Synonym ""] [-SrcDir ""] [-WithSKD] +powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/init.ps1" -Name "" [-Synonym ""] [-SrcDir ""] [-FormatVersion "<2.17|2.18|2.19|2.20|2.21>"] [-WithSKD] ``` ## Дальнейшие шаги diff --git a/.claude/skills/erf-init/scripts/init.ps1 b/.claude/skills/erf-init/scripts/init.ps1 index ebf060d5..264f5452 100644 --- a/.claude/skills/erf-init/scripts/init.ps1 +++ b/.claude/skills/erf-init/scripts/init.ps1 @@ -1,4 +1,4 @@ -# erf-init v1.3 — Init 1C external report scaffold +# erf-init v1.4 — Init 1C external report scaffold # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -8,7 +8,13 @@ param( [string]$SrcDir = "src", - [switch]$WithSKD + [switch]$WithSKD, + + # Версия формата выгрузки. Своей конфигурации у автономного отчёта нет, наследовать + # версию неоткуда — поэтому её задают явно. Формы, макеты и справку внутри отчёта + # навыки берут уже отсюда: их детектор читает version из корня этого файла. + [ValidateSet("2.17", "2.18", "2.19", "2.20", "2.21")] + [string]$FormatVersion = "2.17" ) $ErrorActionPreference = "Stop" @@ -20,6 +26,14 @@ $uuid2 = [guid]::NewGuid().ToString() $uuid3 = [guid]::NewGuid().ToString() $uuid4 = [guid]::NewGuid().ToString() +# Объявления пространств имён — одной переменной: места эмиссии её только интерполируют. +$xmlnsDecl = 'xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +# 2.21 (8.5) добавила в шапку пространство палитры. Вставляем НА МЕСТО (после lf, перед style): +# платформа держит объявления по алфавиту, дописать в конец нельзя. +if (($FormatVersion -match '^(\d+)\.(\d+)$') -and ([int]$Matches[1] * 100 + [int]$Matches[2]) -ge 221) { + $xmlnsDecl = $xmlnsDecl -replace ' xmlns:style=', ' xmlns:pal="http://v8.1c.ru/8.1/data/ui/colors/palette" xmlns:style=' +} + # --- Формируем Properties --- $mainDCSValue = "" @@ -48,7 +62,7 @@ $childObjectsXml = if ($childObjectsContent) { $xml = @" - + @@ -150,7 +164,7 @@ if ($WithSKD) { $skdMetaXml = @" - +