Как с помощью RLS скрыть значение ресурса для определенных пользователей и можно ли это сделать?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

В процессе разработки конфигураций на платформе 1С:Предприятие часто возникают задачи по разграничению доступа к данным. Одной из таких задач является скрытие конкретных числовых показателей (ресурсов) в регистрах для определенных ролей пользователей, например, для стажеров. Возникает вопрос: можно ли при помощи штатного механизма RLS (ограничение доступа на уровне записей) просто подменить значение ресурса на ноль, если условие не выполняется?

Давайте подробно проанализируем эту задачу, разберем ограничения платформы и рассмотрим рабочие альтернативы, которые позволят вам достичь желаемого результата, не нарушая целостность данных.

Почему RLS не может подменять данные «на лету»

Первое, что важно усвоить: механизм RLS в платформе 1С не предназначен для изменения значений внутри записей. Его архитектурная задача — это фильтрация. То есть, RLS решает исключительно бинарную задачу: либо запись доступна пользователю полностью (со всеми ресурсами и реквизитами), либо запись полностью исключается из выборки.

Если вы попытаетесь настроить RLS так, чтобы при несоблюдении условия (например, если дата договора меньше текущего года) ресурс «Задаток» превращался в 0, вы столкнетесь со следующими проблемами:

Таким образом, попытка использовать RLS для «маскировки» или «обнуления» данных является архитектурно неверной.

Альтернатива 1: Использование вычисляемых полей в СКД

Если ваша основная задача — скрыть данные в отчетах, то наиболее профессиональным и «чистым» методом будет использование Системы компоновки данных (СКД). Вместо того чтобы пытаться повлиять на физическую таблицу, мы скорректируем вывод данных на уровне представления отчета.

Рассмотрим, как это реализовать:

  1. Откройте настройки отчета и перейдите в раздел Вычисляемые поля.
  2. Создайте новое поле, например, СкрытыйЗадаток.
  3. В поле «Выражение» введите условие, которое проверяет текущую роль пользователя или дату договора:
  4. 
    ВЫБОР
        КОГДА Пользователи.ТекущаяРоль("Стажер") И Год(Договор.Дата) < Год(ТекущаяДата())
            ТОГДА 0
        ИНАЧЕ Задаток
    КОНЕЦ
    
  5. Используйте созданное вычисляемое поле в ресурсах отчета вместо стандартного поля Задаток.

Этот метод хорош тем, что он не требует изменения структуры конфигурации, не влияет на производительность запросов к базе данных и позволяет гибко управлять отображением для различных групп пользователей.

Альтернатива 2: Использование расширений конфигурации

Если данные необходимо скрывать не только в отчетах, но и в формах списков (динамических списках), где СКД не применяется напрямую, используйте расширения конфигурации.

Для этих целей подходит обработчик события ПриПолученииДанных, который доступен для списков. Разберем логику:

  1. Создайте расширение для нужной формы документа или регистра.
  2. В обработчике ПриПолученииДанных динамического списка переберите полученные строки оформления.
  3. Проверьте права текущего пользователя и значение реквизита:
  4. 
    Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
        Если РольДоступна("Стажер") Тогда
            Для Каждого Оформление Из ОформленияСтрок Цикл
                Если Год(Оформление.ДанныеСтроки.Договор.Дата) < Год(ТекущаяДата()) Тогда
                    Оформление.Ячейки.Задаток.УстановитьТекст(0);
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецПроцедуры
    

Обратите внимание: этот метод работает только на отображение данных в интерфейсе пользователя. Сами данные в базе остаются неизменными, что гарантирует целостность системы.

Подведем итоги

Мы выяснили, что механизм RLS предназначен строго для ограничения доступа к строкам (записям) и не подходит для подмены значений внутри этих записей. Использование RLS для «обнуления» ресурсов приведет к потере данных в отчетах и неверным остаткам.

Вместо этого мы рекомендуем:

Применяя эти методы, вы обеспечите безопасность данных для роли «Стажер», сохранив при этом корректность работы всей системы в целом.

← На главную