Files
cc-1c-skills/tests/skills/cases/role-compile/nested-and-services.json
T
Nick ShirokovandClaude Opus 5 9d21ad3429 fix(role-compile,role-edit): замыкание прав и фильтр значений по умолчанию
Замер на платформе (debug/role-edit/FINDINGS.md): роль хранит только то,
что отличается от её умолчаний. При setForNewObjects=false на верхнем
уровне живут разрешения, а любой запрет выбрасывается (проверены Update,
Edit, Delete; узел из одних запретов удаляется целиком); при true —
наоборот. У реквизитных вложенных ту же роль играет
setForAttributesByDefault. Конфликт решается в пользу разрешения.

Отсюда три правки, общие для обоих навыков:

1. Прямое замыкание идёт только от РАЗРЕШЁННЫХ прав. Раньше запрет тянул
   зависимости как разрешения: "Catalog.X: {Edit: false}" выдавал
   Read, Update и View — навык раздавал права на основании запрета.
2. Появилось обратное замыкание: запрет уносит права, которым
   запрещённое нужно. Сверено с платформой — при setForNewObjects=true
   она к Update=false дописывает те же десять запретов.
3. Записи, совпавшие с умолчанием роли, не пишутся: платформа их всё
   равно выбросит, а файл разошёлся бы с базой. Отброшенное
   перечисляется в stderr, сообщение операции объясняет причину.

Правило применяется только там, где замерено: внешние источники данных
под него не попадают. Обе функции заведены семьями в check-inline-drift.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FGkXwoXTuafcu1SXMsauFq
2026-09-13 20:00:06 +03:00

28 lines
1.6 KiB
JSON

{
"name": "Позитив: операции сервисов, вложенные объекты и внешний источник данных",
"input": {
"name": "Интеграция",
"synonym": "Интеграция",
"objects": [
"WebService.Обмен.Operation.Загрузить: Use",
"HTTPService.ПередачаДанных.URLTemplate.Файлы.Method.get: Use",
"IntegrationService.Канал.IntegrationServiceChannel.Основной: Use",
"Catalog.Товары.Attribute.Цена: View, Edit",
"Subsystem.Продажи.Subsystem.Опт: View",
"CalculationRegister.Начисления.Recalculation.Перерасчет: Read, Update",
"ExternalDataSource.Источник: Use, Administration",
"ExternalDataSource.Источник.Table.Заказы: Read, View",
"ExternalDataSource.Источник.Table.Заказы.Field.Сумма: View, Edit",
"ExternalDataSource.Источник.Cube.Продажи.Dimension.Период: View"
],
"setForAttributesByDefault": false
},
"expect": {
"files": [
"Roles/Интеграция/Ext/Rights.xml"
]
},
"skipValidation": true,
"skipPlatformVerify": "роль ссылается на объекты, которых нет в пустой фикстуре и которые не создаёт ни один навык (веб-сервис, HTTP-сервис, сервис интеграции, внешний источник данных, перерасчёт); платформа отвергает такую конфигурацию по составу, а не по формату Rights.xml"
}