diff --git a/.claude/skills/role-compile/SKILL.md b/.claude/skills/role-compile/SKILL.md index b29653cb0..a143cb639 100644 --- a/.claude/skills/role-compile/SKILL.md +++ b/.claude/skills/role-compile/SKILL.md @@ -64,9 +64,7 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/role-compile.ps1" - ### Сервисы -Платформа проверяет право на **вложенном объекте** сервиса — методе шаблона URL, операции, канале. Права на сервис целиком не существует. - -Весь сервис — короткая запись, навык раскроет её по метаданным сервиса в `OutputDir`: +Право живёт на **вложенном объекте** сервиса — методе шаблона URL, операции, канале; на сервисе целиком его не бывает. Весь сервис — короткая запись, навык раскроет её по метаданным в `OutputDir`: ```json "objects": ["HTTPService.ЭДО: Use"] @@ -119,21 +117,17 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/role-compile.ps1" - ## Что можно писать в `objects` -Права имеют 27 типов объектов; тип или имя права вне списка — ошибка: роль не создаётся, файлы не пишутся, `Configuration.xml` не меняется. Права нельзя назначить на `Enum`, `CommonModule`, `DefinedType`, `CommonPicture`, `CommonTemplate`, `Language`, `FunctionalOption`, `EventSubscription`, `ScheduledJob`, `StyleItem`, `SettingsStorage` и подобные — в дереве редактора ролей их нет. +Прав не бывает у `Enum`, `CommonModule`, `DefinedType`, `CommonPicture`, `CommonTemplate`, `Language`, `FunctionalOption`, `EventSubscription`, `ScheduledJob`, `StyleItem`, `SettingsStorage` и подобных — в дереве редактора ролей их нет. Ошибка в описании — отказ до записи: файлы не создаются, `Configuration.xml` не меняется. Права на части объекта задаются точечным путём: `Catalog.Контрагенты.Attribute.ИНН: View, Edit`, `WebService.Обмен.Operation.Загрузить: Use`, `HTTPService.ЭДО.URLTemplate.ЕстьНовыеДокументы.Method.POST: Use`. -Роль хранит только то, что отличается от её умолчаний, — всё совпавшее навык не пишет и говорит -об этом. При умолчаниях (`setForNewObjects: false`, `setForAttributesByDefault: true`) это значит: -объектам верхнего уровня права выдают, а реквизитам, ТЧ, измерениям и ресурсам — только -запрещают, потому что те наследуют права своего объекта: +Реквизиты, табличные части, измерения и ресурсы наследуют права своего объекта — им задают +запрет, чтобы закрыть унаследованное: ```json {"name": "Catalog.Товары.Attribute.Цена", "rights": {"View": false}} ``` -Запрет тянет за собой права, которым запрещённое нужно: `View: false` у реквизита уносит `Edit`. - Роль расширения, включённая в основные (`DefaultRoles`), прав на заимствованные объекты давать не может — платформа это запрещает. Такие права выноси в отдельную роль вне основных. Полные таблицы «тип → права», виды вложенности (включая внешние источники данных), список типов без прав, таблицы пресетов и дополнительные примеры — в `dsl-reference.md`. diff --git a/.claude/skills/role-compile/scripts/role-compile.ps1 b/.claude/skills/role-compile/scripts/role-compile.ps1 index afa97a641..f0978c6b6 100644 --- a/.claude/skills/role-compile/scripts/role-compile.ps1 +++ b/.claude/skills/role-compile/scripts/role-compile.ps1 @@ -1,4 +1,4 @@ -# role-compile v1.43 — Compile 1C role from JSON +# role-compile v1.44 — Compile 1C role from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills [CmdletBinding(PositionalBinding=$false)] param( @@ -1804,6 +1804,7 @@ Write-Host " Rights: $rightsPath" Write-Host " Objects: $($parsedObjects.Count), Rights: $totalRights, Templates: $templateCount" if ($droppedByDefault.Count -gt 0) { [Console]::Error.WriteLine("[role-compile] Не записаны права, совпадающие с умолчанием роли (платформа их не хранит): $($droppedByDefault -join ', ')") + [Console]::Error.WriteLine(" Запрет хранится у реквизитов и табличных частей (они наследуют права объекта) либо в роли с setForNewObjects=true; выдача прав — наоборот.") } foreach ($note in $closureNotes) { Write-Host $note } switch ($regResult) { diff --git a/.claude/skills/role-compile/scripts/role-compile.py b/.claude/skills/role-compile/scripts/role-compile.py index a0d01cb22..231058edc 100644 --- a/.claude/skills/role-compile/scripts/role-compile.py +++ b/.claude/skills/role-compile/scripts/role-compile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# role-compile v1.43 — Compile 1C role from JSON +# role-compile v1.44 — Compile 1C role from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import json @@ -1859,6 +1859,8 @@ def main(): if dropped_by_default: print("[role-compile] Не записаны права, совпадающие с умолчанием роли " f"(платформа их не хранит): {', '.join(dropped_by_default)}", file=sys.stderr) + print(" Запрет хранится у реквизитов и табличных частей (они наследуют права объекта) " + "либо в роли с setForNewObjects=true; выдача прав — наоборот.", file=sys.stderr) for note in closure_notes: print(note) if reg_result == 'added': diff --git a/.claude/skills/role-edit/SKILL.md b/.claude/skills/role-edit/SKILL.md index d11f4e5cd..d7eb41bda 100644 --- a/.claude/skills/role-edit/SKILL.md +++ b/.claude/skills/role-edit/SKILL.md @@ -37,7 +37,7 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/role-edit.ps1" -Rol | `add-rights` | `Тип.Имя: Право1, Право2` или `Тип.Имя: @пресет` | Добавить права, прежние сохранить | | `set-rights` | то же | Заменить набор прав объекта целиком | | `remove-rights` | `Тип.Имя: Право1, Право2` — снять права
`Тип.Имя` — удалить объект целиком | Снять права | -| `deny-rights` | `Тип.Имя: Право1, Право2` | Запретить права явно | +| `deny-rights` | `Тип.Имя: Право1, Право2` | Закрыть реквизит или ТЧ, которые иначе наследуют права объекта | | `set-rls` | `Тип.Имя.Право: условие`
`Тип.Имя.Право[Поле1, Поле2]: условие` | Ограничение доступа к данным | | `remove-rls` | `Тип.Имя.Право` — снять все
`Тип.Имя.Право[Поле1]` — снять одну строку | Снять ограничение, право оставить | | `add-template` | `Имя(Параметры): условие` | Добавить шаблон ограничения | @@ -85,20 +85,8 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/role-edit.ps1" -Rol `remove-rights` и `deny-rights` задевают больше перечисленного: уходят и права, которым снятое нужно (сняли `Read` — уйдут `Update`, `View`, `Edit`). Снятое каскадом перечисляется в выводе. -Роль хранит только то, что отличается от её умолчаний, — всё совпавшее навык не пишет и говорит -об этом: - -| Где | Что имеет смысл | -|-----|-----------------| -| объект верхнего уровня, `setForNewObjects=false` (умолчание) | выдача прав; запрет бессмыслен | -| объект верхнего уровня, `setForNewObjects=true` | запрет; выдача бессмысленна | -| реквизит, ТЧ, измерение, ресурс, `setForAttributesByDefault=true` (умолчание) | запрет: права наследуются от объекта | -| они же при `setForAttributesByDefault=false` | и выдача, и запрет | - -Запрет тянет за собой права, которым запрещённое нужно: `View=false` у реквизита уносит `Edit`. - -Тип или имя права вне допустимого списка — отказ: файл не меняется, ошибки печатаются все разом. -Полные таблицы «тип → права» и виды вложенности — в справке `/role-compile`. +Ошибка в значении — отказ до записи, файл не меняется. Полные таблицы «тип → права» и виды +вложенности — в справке `/role-compile`. ## RLS @@ -112,8 +100,8 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/role-edit.ps1" -Rol ... -Operation set-rls -Value "Catalog.Товары.Read[Ссылка, Код, Наименование]: " ``` -Строка с тем же набором полей заменяется, с другим — добавляется. -Ограничение на невыданное право — ошибка: платформа такое молча игнорирует. +Строка с тем же набором полей заменяется, с другим — добавляется. Право должно быть уже выдано: +ограничение без права платформа игнорирует, поэтому навык откажет. Ссылка на шаблон — `#ИмяШаблона("")`; `&` в условиях экранируется автоматически. diff --git a/.claude/skills/role-edit/scripts/role-edit.ps1 b/.claude/skills/role-edit/scripts/role-edit.ps1 index 50e19a3e8..c29e86061 100644 --- a/.claude/skills/role-edit/scripts/role-edit.ps1 +++ b/.claude/skills/role-edit/scripts/role-edit.ps1 @@ -1,4 +1,4 @@ -# role-edit v1.4 — Edit existing 1C role rights in place +# role-edit v1.5 — Edit existing 1C role rights in place # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills [CmdletBinding(PositionalBinding=$false)] param( @@ -2360,6 +2360,7 @@ foreach ($note in $script:notes) { Write-Host $note } Write-Host " Added: $($script:addCount), Removed: $($script:removeCount), Modified: $($script:modifyCount)" if ($script:droppedByDefault.Count -gt 0) { [Console]::Error.WriteLine("[role-edit] Не записаны права, совпадающие с умолчанием роли (платформа их не хранит): $($script:droppedByDefault -join ', ')") + [Console]::Error.WriteLine(" Запрет хранится у реквизитов и табличных частей (они наследуют права объекта) либо в роли с setForNewObjects=true; выдача прав — наоборот.") } if (-not $NoValidate) { diff --git a/.claude/skills/role-edit/scripts/role-edit.py b/.claude/skills/role-edit/scripts/role-edit.py index f1642d47e..9c4749680 100644 --- a/.claude/skills/role-edit/scripts/role-edit.py +++ b/.claude/skills/role-edit/scripts/role-edit.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# role-edit v1.4 — Edit existing 1C role rights in place +# role-edit v1.5 — Edit existing 1C role rights in place # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import json @@ -2284,6 +2284,8 @@ def main(): if ed.dropped_by_default: print("[role-edit] Не записаны права, совпадающие с умолчанием роли " f"(платформа их не хранит): {', '.join(ed.dropped_by_default)}", file=sys.stderr) + print(" Запрет хранится у реквизитов и табличных частей (они наследуют права объекта) " + "либо в роли с setForNewObjects=true; выдача прав — наоборот.", file=sys.stderr) if not args.NoValidate: validate_script = os.path.normpath(os.path.join(