From 4be10e3d7f74ce3779b886ee193577ecbe75a282 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Mon, 17 Aug 2026 16:19:55 +0300 Subject: [PATCH] =?UTF-8?q?fix(role-validate):=20=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BE=20=D0=BD=D0=B0=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=20?= =?UTF-8?q?=D1=86=D0=B5=D0=BB=D0=B8=D0=BA=D0=BE=D0=BC=20=E2=80=94=20=D0=BE?= =?UTF-8?q?=D1=88=D0=B8=D0=B1=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Роль с правом на `HTTPService.Имя` формально валидна и молча не работает: платформа проверяет вложенный объект (метод шаблона URL, операцию, канал), маршруты отвечают 403, и по симптому причина не читается. В Конфигураторе галки на корне сервиса нет вовсе — это недостижимое состояние, а не стилистика. Co-Authored-By: Claude Opus 5 (1M context) --- .claude/skills/role-validate/SKILL.md | 3 ++- .../role-validate/scripts/role-validate.ps1 | 15 ++++++++++++++- .../role-validate/scripts/role-validate.py | 17 ++++++++++++++++- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/.claude/skills/role-validate/SKILL.md b/.claude/skills/role-validate/SKILL.md index 166b8cc0..554892be 100644 --- a/.claude/skills/role-validate/SKILL.md +++ b/.claude/skills/role-validate/SKILL.md @@ -33,6 +33,7 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/role-validate.ps1" - тип объекта, не имеющий прав в ролях (`Enum`, `CommonModule`, `CommonPicture`, `ScheduledJob` и т.п.) — конфигурация с блоком прав на перечисление не загружается в базу, конфигуратор зависает без сообщений; - незнакомый тип объекта (опечатка); - имя права, которого у этого типа нет; -- вид вложенности, невозможный у данного типа, и недопустимое право у вложенного объекта. +- вид вложенности, невозможный у данного типа, и недопустимое право у вложенного объекта; +- право на сервис целиком (`HTTPService.Имя` и т.п.) — платформа проверяет вложенный объект (метод шаблона URL, операцию, канал), а роль с правом на корень молча не работает: маршруты отвечают `403 Недостаточно прав`. Полные списки «тип → права» и виды вложенности — в `role-compile/dsl-reference.md`. diff --git a/.claude/skills/role-validate/scripts/role-validate.ps1 b/.claude/skills/role-validate/scripts/role-validate.ps1 index c7515bda..f1e683dc 100644 --- a/.claude/skills/role-validate/scripts/role-validate.ps1 +++ b/.claude/skills/role-validate/scripts/role-validate.ps1 @@ -1,4 +1,4 @@ -# role-validate v1.3 — Validate 1C role structure +# role-validate v1.4 — Validate 1C role structure # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -176,6 +176,13 @@ $script:kindOwners = @{ "IntegrationServiceChannel" = "IntegrationService" } +# Подсказка формата для каждого вида сервиса: {0} подставляется как `Тип.Имя` из роли. +$script:serviceLeafHints = @{ + "WebService" = "{0}.Operation.<Операция>" + "HTTPService" = "{0}.URLTemplate.<Шаблон>.Method.<Метод>" + "IntegrationService" = "{0}.IntegrationServiceChannel.<Канал>" +} + # Один и тот же вид под разными родителями имеет разный набор: измерение регистра — # View + Edit, измерение куба внешнего источника — только View. Объединять нельзя, # объединение молча разрешило бы Edit там, где платформа его не даёт. @@ -405,6 +412,12 @@ foreach ($obj in $objects) { Report-Error "${objName}: вид '$nestedKind' бывает только у $($script:kindOwners[$nestedKind])" } elseif ($isNested -and $null -eq (Get-NestedRights $objectType $nestedKind)) { Report-Error "${objName}: неизвестный вид вложенности '$nestedKind'" + } elseif (-not $isNested -and $script:serviceLeafHints.ContainsKey($objectType)) { + # Право на сервис целиком платформа игнорирует: проверяется лист (метод шаблона URL, + # операция, канал). Роль формально валидна и молча не работает — 403 на всех + # маршрутах, причина по симптому не читается. В Конфигураторе галки на корне сервиса + # нет вовсе, так что это недостижимое состояние, а не стилистика. + Report-Error "${objName}: право на сервис целиком не действует — назначайте права на вложенные объекты: $($script:serviceLeafHints[$objectType] -f $objName)" } # Check rights diff --git a/.claude/skills/role-validate/scripts/role-validate.py b/.claude/skills/role-validate/scripts/role-validate.py index 93fe1915..5800bcce 100644 --- a/.claude/skills/role-validate/scripts/role-validate.py +++ b/.claude/skills/role-validate/scripts/role-validate.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# role-validate v1.3 — Validate 1C role Rights.xml structure +# role-validate v1.4 — Validate 1C role Rights.xml structure # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills """Validates role Rights.xml: root element, global flags, objects, rights, RLS, templates.""" import sys, os, argparse, re @@ -194,6 +194,13 @@ KIND_OWNERS = { 'IntegrationServiceChannel': 'IntegrationService', } +# Подсказка формата для каждого вида сервиса: {0} подставляется как `Тип.Имя` из роли. +SERVICE_LEAF_HINTS = { + 'WebService': '{0}.Operation.<Операция>', + 'HTTPService': '{0}.URLTemplate.<Шаблон>.Method.<Метод>', + 'IntegrationService': '{0}.IntegrationServiceChannel.<Канал>', +} + # Один и тот же вид под разными родителями имеет разный набор: измерение регистра — # View + Edit, измерение куба внешнего источника — только View. Объединять нельзя, # объединение молча разрешило бы Edit там, где платформа его не даёт. @@ -436,6 +443,14 @@ def main(): report_error(f"{obj_name}: вид '{nested_kind}' бывает только у {KIND_OWNERS[nested_kind]}") elif is_nested and get_nested_rights(object_type, nested_kind) is None: report_error(f"{obj_name}: неизвестный вид вложенности '{nested_kind}'") + elif not is_nested and object_type in SERVICE_LEAF_HINTS: + # Право на сервис целиком платформа игнорирует: проверяется лист (метод шаблона + # URL, операция, канал). Роль формально валидна и молча не работает — 403 на всех + # маршрутах, причина по симптому не читается. В Конфигураторе галки на корне + # сервиса нет вовсе, так что это недостижимое состояние, а не стилистика. + hint = SERVICE_LEAF_HINTS[object_type].format(obj_name) + report_error(f"{obj_name}: право на сервис целиком не действует — " + f"назначайте права на вложенные объекты: {hint}") # Check rights for child in obj: