В процессе разработки конфигураций на платформе 1С:Предприятие часто возникают задачи по разграничению доступа к данным. Одной из таких задач является скрытие конкретных числовых показателей (ресурсов) в регистрах для определенных ролей пользователей, например, для стажеров. Возникает вопрос: можно ли при помощи штатного механизма RLS (ограничение доступа на уровне записей) просто подменить значение ресурса на ноль, если условие не выполняется?
Давайте подробно проанализируем эту задачу, разберем ограничения платформы и рассмотрим рабочие альтернативы, которые позволят вам достичь желаемого результата, не нарушая целостность данных.
Первое, что важно усвоить: механизм RLS в платформе 1С не предназначен для изменения значений внутри записей. Его архитектурная задача — это фильтрация. То есть, RLS решает исключительно бинарную задачу: либо запись доступна пользователю полностью (со всеми ресурсами и реквизитами), либо запись полностью исключается из выборки.
Если вы попытаетесь настроить RLS так, чтобы при несоблюдении условия (например, если дата договора меньше текущего года) ресурс «Задаток» превращался в 0, вы столкнетесь со следующими проблемами:
RLS, она просто исчезнет из результатов запросов к виртуальным таблицам (остатки, обороты). Это приведет к тому, что общие итоги по регистру станут неверными, так как «запрещенные» записи перестанут учитываться в расчетах вовсе.RLS нет функционала, позволяющего «на лету» заменить значение поля Задаток на 0. Платформа либо разрешает чтение строки, либо запрещает.Таким образом, попытка использовать RLS для «маскировки» или «обнуления» данных является архитектурно неверной.
Если ваша основная задача — скрыть данные в отчетах, то наиболее профессиональным и «чистым» методом будет использование Системы компоновки данных (СКД). Вместо того чтобы пытаться повлиять на физическую таблицу, мы скорректируем вывод данных на уровне представления отчета.
Рассмотрим, как это реализовать:
СкрытыйЗадаток.
ВЫБОР
КОГДА Пользователи.ТекущаяРоль("Стажер") И Год(Договор.Дата) < Год(ТекущаяДата())
ТОГДА 0
ИНАЧЕ Задаток
КОНЕЦ
Задаток.Этот метод хорош тем, что он не требует изменения структуры конфигурации, не влияет на производительность запросов к базе данных и позволяет гибко управлять отображением для различных групп пользователей.
Если данные необходимо скрывать не только в отчетах, но и в формах списков (динамических списках), где СКД не применяется напрямую, используйте расширения конфигурации.
Для этих целей подходит обработчик события ПриПолученииДанных, который доступен для списков. Разберем логику:
ПриПолученииДанных динамического списка переберите полученные строки оформления.
Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
Если РольДоступна("Стажер") Тогда
Для Каждого Оформление Из ОформленияСтрок Цикл
Если Год(Оформление.ДанныеСтроки.Договор.Дата) < Год(ТекущаяДата()) Тогда
Оформление.Ячейки.Задаток.УстановитьТекст(0);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Обратите внимание: этот метод работает только на отображение данных в интерфейсе пользователя. Сами данные в базе остаются неизменными, что гарантирует целостность системы.
Мы выяснили, что механизм RLS предназначен строго для ограничения доступа к строкам (записям) и не подходит для подмены значений внутри этих записей. Использование RLS для «обнуления» ресурсов приведет к потере данных в отчетах и неверным остаткам.
Вместо этого мы рекомендуем:
СКД. Это самый надежный способ, сохраняющий логику расчетов.ПриПолученииДанных через расширения конфигурации.Применяя эти методы, вы обеспечите безопасность данных для роли «Стажер», сохранив при этом корректность работы всей системы в целом.