Реализует полный паттерн RLS (Row-Level Security) — разграничение доступа к строкам данных — для объектов конфигурации 1С:Элемент (Справочник, Документ и др.).
За один вызов создаёт все необходимые артефакты: КлючДоступа (.yaml + .xbsl), обновляет YAML объекта (КонтрольДоступа + РасчетРазрешенийПо) и дописывает в .xbsl объекта два обработчика — уровень 1 (доступ к таблице) и уровень 2 (доступ к конкретным строкам).
Вызывай когда пользователь хочет: настроить RLS на справочник или документ; ограничить видимость записей по владельцу/ответственному/организации; реализовать «каждый видит только свои записи»; настроить доступ группы пользователей к записям по контекстному параметру.
Паттерны: P0 — доступ без построчной фильтрации (РазрешеноАутентифицированным / РазрешеноАдминистраторам, без обработчиков); P1 — пользователь видит только свои записи (предопределённый ключ, файлы не создаются); P2 — группа по параметру (собственный КлючДоступа + обработчик ПроверитьНаличиеКлючейДоступа); P2-б — ролевой ключ без парам
Installation
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Реализует полный паттерн RLS (Row-Level Security) — разграничение доступа к строкам данных — для объектов конфигурации 1С:Элемент (Справочник, Документ и др.).
За один вызов создаёт все необходимые артефакты: КлючДоступа (.yaml + .xbsl), обновляет YAML объекта (КонтрольДоступа + РасчетРазрешенийПо) и дописывает в .xbsl объекта два обработчика — уровень 1 (доступ к таблице) и уровень 2 (доступ к конкретным строкам).
Вызывай когда пользователь хочет: настроить RLS на справочник или документ; ограничить видимость записей по владельцу/ответственному/организации; реализовать «каждый видит только свои записи»; настроить доступ группы пользователей к записям по контекстному параметру.
Паттерны: P0 — доступ без построчной фильтрации (РазрешеноАутентифицированным / РазрешеноАдминистраторам, без обработчиков); P1 — пользователь видит только свои записи (предопределённый ключ, файлы не создаются); P2 — группа по параметру (собственный КлючДоступа + обработчик ПроверитьНаличиеКлючейДоступа); P2-б — ролевой ключ без параметров; P3 — два участника с разными правами на один объект.
compatibility
Requires Python 3.
Во всех командах ниже {python} означает python в Windows и python3 в macOS/Linux/WSL. Выбирай команду сразу по текущей ОС, не запускай оба варианта.
RLS-паттерн для объектов 1С:Элемент
Прочитай references/rls-паттерны.md — там точные шаблоны YAML и XBSL для обоих паттернов.
Шаг 1: Определи целевой объект
Из запроса пользователя извлеки тип (Справочник, Документ) и имя объекта.
Если имя не указано — спроси пользователя.
xbsl_file / xbsl_exists — путь к .xbsl-файлу и признак его существования
pattern_hints — подсказки по паттерну на основе типов реквизитов
control_access — текущее состояние секции КонтрольДоступа (используй на шаге 7)
handlers — наличие обработчиков уровня 1/2 (используй на шаге 8)
Если скрипт вернул error с несколькими matches — покажи список и попроси уточнить имя.
⚠️ RLS-обработчики записываются в <Имя>.xbsl (без суффикса .Объект). Файл <Имя>.Объект.xbsl предназначен только для lifecycle-событий (ПослеЗаписи, ДоЗаписи) — туда RLS не кладётся. Если rls_state вернул xbsl_file: null — создай файл <ИмяОбъекта>.xbsl.
Шаг 3: Выбери паттерн
Сначала спроси пользователя: нужна ли построчная фильтрация?
Если нет — используй P0 и завершай на шаге 7 (только YAML).
Для построчной фильтрации проанализируй fields из шага 2:
Признак
Паттерн
Не нужна фильтрация по строкам (все видят всё)
P0 — Без RLS
Один реквизит типа Пользователи.Ссылка?
P1 — По пользователю
Два реквизита-участника, каждый → свой справочник со встроенным полем Пользователь
P3 — Несколько участников
Реквизит типа <Справочник>.Ссылка?, доступ — по роли (нет прямой связи с пользователем)
P2 — По параметру
Роль без привязки к объекту (все руководители видят всё)
P2-б — Ключ без параметров
Если признак не очевиден — спроси пользователя и объясни разницу:
P0: «Все вошедшие пользователи видят все записи. Никаких обработчиков и ключей.»
P1: «Каждый пользователь видит только свои записи. Не нужно создавать дополнительных объектов.»
P2: «Группа пользователей видит записи по общему контексту (организация, регион). Создаётся собственный КлючДоступа.»
P2-б: «Все пользователи с определённой ролью видят все записи. Собственный ключ, но без параметров.»
P3: «Две роли на один объект с разными правами (например, автор — полные права, соисполнитель — только чтение).»
Шаг 4: Уточни детали [только P2, P2-б, P3]
P2 и P2-б — уточни у пользователя:
Имя ключа — дефолт: КлючДоступа<ИмяОбъектаРодительный> (например КлючДоступаЗадач).
Стиль: PascalCase, начинается с КлючДоступа, суффикс отражает контекст.
P2: Поле-контекст — реквизит из fields, по значению которого группируются строки.
P2-б: поле не нужно — ключ без параметров, выдаётся всем с нужной ролью.
Таблица связи — справочник или регистр, где хранится связь «пользователь ↔ контекст»
(P2) или «пользователь ↔ роль» (P2-б).
P3 — уточни оба поля-участника и какие права у каждого.
P1 — уточни только поле-пользователь из fields.
Шаг 5: Сгенерируй UUID [только P2, P2-б]
Для собственного ключа нужен 1 UUID (на объект; параметры Ид не имеют).
Вызови скилл xbsl-uuid с числом 1.
Шаг 6: Создай файлы ключа [только P2, P2-б]
Создай <ИмяКлюча>.yaml в object_path по шаблону из references/rls-паттерны.md (раздел P2).
Создай <ИмяКлюча>.xbsl в той же папке — шаблон ПроверитьНаличиеКлючейДоступа.
Подставь реальные имена из шага 4; оставь // TODO там, где нужна бизнес-логика запроса.
Проверка межподсистемной видимости: если тип параметра (Тип: <Справочник>.Ссылка?)
относится к объекту из другой подсистемы — добавь Импорт: [<ПодсистемаИсточника>]
в YAML ключа и убедись, что источник имеет ОбластьВидимости: ВПроекте.
Шаг 7: Обнови YAML объекта
Используй данные из шага 2: object_path + yaml_file. Состояние КонтрольДоступа уже известно из control_access.
Добавь или обнови секцию КонтрольДоступа. Точный формат — в references/rls-паттерны.md.
РасчетРазрешенийПо — укажи поле-пользователь (P1) или поле-контекст (P2)
Если секция уже существует с другим значением — сообщи пользователю и спроси подтверждение.
Шаг 8: Запиши обработчики в .xbsl объекта
Файл уже известен из шага 2: xbsl_file в object_path. Наличие обработчиков — в handlers.
Если handlers.level1 = true — предложи заменить или пропустить.
Если xbsl_exists = false — создай <ИмяОбъекта>.xbsl (новый файл, без суффикса .Объект).
Добавь оба обработчика: уровень 1 (ВычислитьРазрешенияДоступа) и
уровень 2 (ВычислитьРазрешенияДоступаДляОбъектов) из шаблонов в references/rls-паттерны.md.
Подставь реальные имена:
<Объект> → имя объекта (например Задачи)
<ПолеПользователя> / <ПолеКонтекста> → реальное имя реквизита
<КлючИмя> → имя ключа (только P2)
⚠️ Правило уровней: все права из уровня 2 обязаны присутствовать и в уровне 1.
Проверь перед записью.
Первый пересчёт после деплоя — добавь в Проект.xbsl метод с аннотацией.
Если объект находится в подсистеме — добавь импорт <Подсистема> в начало файла:
импорт <Подсистема> // если объект в подсистеме, а не в корне проекта
@ОбновлениеПроекта(Ид = "recalc_<Объект>_rls_v1", Номер = N)
метод ПересчитатьПрава<Объект>()
<Объект>.ПересчитатьРазрешенияДоступа()
<Объект>.ПересчитатьРазрешенияДоступаДляОбъектов()
;
Своевременный пересчёт при изменении данных (только P2) — в ПослеЗаписи объекта-источника
при изменении поля-контекста:
если До.<ПолеКонтекста> <> Это.<ПолеКонтекста>
исп КонтекстДоступа.Привилегированный()
<КлючИмя>.ПересчитатьКлючи(<Параметр> = Это.Ссылка)
;
Чеклист перед передачей результата
КонтрольДоступа.Разрешения обновлено в YAML объекта
Для P0: обработчики не создаются, шаги 8–9 пропустить
Для P1, P2, P2-б, P3: указан обработчик уровня 1 (ВычислитьРазрешенияДоступа)
Для P1, P2, P2-б, P3: указан обработчик уровня 2 (ВычислитьРазрешенияДоступаДляОбъектов)
Все права из уровня 2 есть и в уровне 1
Добавлена проверка != Неопределено по полю в цикле уровня 2 (не = Неопределено — в XBSL = только присваивание)
Файл обработчика называется <Имя>.xbsl (без суффикса .Объект)
Поле в РасчетРазрешенийПо — не коллекция, не строка без ограничения, не stdlib-перечисление
Для P2, P2-б: написан ПроверитьНаличиеКлючейДоступа с TODO-комментариями
Для P2: параметры ключа в YAML не имеют поля Ид
Для P2-б: в YAML ключа раздел Параметры отсутствует
Для P3: для каждого участника — отдельный запрос и блок если