Настройка ограничения доступа на уровне записей (RLS) в 1С с использованием «Библиотеки стандартных подсистем» (БСП) — задача, с которой рано или поздно сталкивается любой разработчик. Часто при первой самостоятельной настройке по статьям из интернета возникает классическая проблема: ограничение либо вообще не срабатывает (пользователь видит все данные), либо скрывает абсолютно все элементы списка (пользователь не видит ничего). В этой статье мы подробно проанализируем причины такого поведения системы, разберем типичные архитектурные ошибки и предоставим пошаговое руководство по правильной настройке RLS.
Рассмотрим стандартную ситуацию. Разработчик пытается ограничить доступ к определенному банковскому счету (например, «Яковлев»). Для этого создается вспомогательный справочник групп доступа, настраиваются профили, прописывается шаблон RLS в роли, но при тестировании происходят странные вещи:
Проанализируем ситуацию подробнее. Такое поведение системы однозначно указывает на то, что механизм RLS 1С не может сопоставить проверяемый объект (банковский счет) с разрешенным или запрещенным значением (группой доступа). Система пытается выполнить сравнение, получает отрицательный результат и действует согласно выбранной логике: либо разрешает всё, поскольку «исключение» не найдено, либо запрещает всё по той же причине.
Давайте разберем по шагам две ключевые ошибки, допущенные при реализации этого механизма.
В конфигурации была создана роль, где для права Чтение справочника БанковскиеСчета прописан следующий шаблон:
#ПоЗначениям( "Справочник.БанковскиеСчета","Чтение","","ГруппыБанковскихСчетов","Ссылка", ... )
Давайте подробно разберем параметры этого стандартного шаблона БСП:
"Справочник.БанковскиеСчета" — имя таблицы, к которой ограничивается доступ."Чтение" — право доступа, на которое накладывается ограничение."" — имя поля (полей) текущей таблицы, по которому накладывается ограничение (если пусто, используется по умолчанию)."ГруппыБанковскихСчетов" — имя вида доступа, зарегистрированного в общем модуле."Ссылка" — имя реквизита в ограничиваемой таблице (в нашем случае в справочнике БанковскиеСчета), значение которого должно сопоставляться с группой доступа.Указав в качестве пятого параметра значение "Ссылка", мы заставили систему сравнивать непосредственно саму ссылку на элемент справочника БанковскиеСчета со ссылкой на элемент справочника ГруппыДоступаБанковскихСчетов. Это абсолютно разные типы данных. Естественно, они никогда не совпадут.
Правильное решение: в пятом параметре шаблона необходимо указать имя реквизита, который вы специально добавили в справочник БанковскиеСчета для связи с группой доступа — "ГруппаДоступа":
#ПоЗначениям( "Справочник.БанковскиеСчета","Чтение","","ГруппыБанковскихСчетов","ГруппаДоступа","","","","","","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","" )
Вторая логическая ошибка кроется в организации связи между справочниками. Разработчики часто пишут: «В новом справочнике групп доступа создаю элемент "Пенза", делаю владельцем наш счет "Яковлев"».
Давайте проанализируем эту структуру. Подчинение справочника групп доступа справочнику банковских счетов нарушает логику RLS в БСП. Связь должна быть направлена строго в противоположную сторону:
ГруппыДоступаБанковскихСчетов должен быть независимым (неподчиненным). В нем вы создаете элементы-группы (например, «Пенза», «Москва», «Общие»).БанковскиеСчета должен быть создан реквизит ГруппаДоступа с типом значения СправочникСсылка.ГруппыДоступаБанковскихСчетов.ГруппаДоступа вы должны явно выбрать созданную группу «Пенза».Только при такой структуре шаблон RLS сможет прочитать из реквизита ГруппаДоступа конкретного счета значение группы («Пенза») и сопоставить его с правами текущего пользователя в регистре сведений.
Начиная с БСП версий 3.x, по умолчанию используется так называемый универсальный (производительный) режим ограничения доступа. В этом режиме классические шаблоны вида #ПоЗначениям в чистом виде могут не работать, так как система использует кэширование прав в специальных регистрах сведений (таких как КлючиДоступаКОбъектам и КлючиДоступаПользователей).
Для корректной работы в любом из режимов шаблон RLS в вашей роли должен быть оформлен с использованием специального системного условия:
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
#ДляОбъекта("")
#Иначе
#ПоЗначениям( "Справочник.БанковскиеСчета","Чтение","","ГруппыБанковскихСчетов","ГруппаДоступа","","","","","","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","" )
#КонецЕсли
Если в вашей информационной базе включен производительный (универсальный) режим RLS, после любого изменения программного кода переопределяемых модулей или изменения прав в профилях необходимо в режиме «1С:Предприятие» запустить регламентное задание «Заполнение данных для ограничения доступа». Также можно принудительно обновить ключи доступа через административную панель БСП (раздел «Настройки пользователей и прав» -> «Обновление доступа на уровне записей»). Без этого новые связи и элементы не попадут в регистры ключей, и RLS работать не будет.
Давайте рассмотрим ситуацию, когда вам нужно ограничить доступ всего к одному или двум конкретным банковским счетам, и вы не планируете масштабировать систему групп доступа до сотен элементов. В таком случае городить огород с созданием дополнительного справочника-сателлита ГруппыДоступаБанковскихСчетов абсолютно не требуется.
БСП позволяет настраивать ограничения напрямую по элементам самого ограничиваемого справочника. Посмотрим на этот более простой и изящный вариант реализации.
Шаг 1. Регистрируем вид доступа в общем модуле УправлениеДоступомПереопределяемый в процедуре ПриЗаполненииВидовДоступа:
Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт
ВидДоступа = ВидыДоступа.Добавить();
ВидДоступа.Имя = "БанковскиеСчета";
ВидДоступа.Представление = НСтр("ru = 'Банковские счета'");
ВидДоступа.ТипЗначений = Тип("СправочникСсылка.БанковскиеСчета");
// Строку ТипГруппЗначений не заполняем! Ограничение идет напрямую по значениям.
КонецПроцедуры
Шаг 2. Настраиваем шаблон в роли. Так как мы ограничиваем доступ по значению самого справочника, проверять мы будем реквизит Ссылка:
#ПоЗначениям( "Справочник.БанковскиеСчета","Чтение","","БанковскиеСчета","Ссылка","","","","","","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","" )
Шаг 3. В режиме «1С:Предприятие» в профиле групп доступа теперь появится вид ограничения «Банковские счета». Администратор сможет напрямую выбрать нужные элементы без необходимости создавать лишние группы доступа и привязывать их к реквизитам.
Если вы выполнили все настройки, но RLS по-прежнему ведет себя не так, как ожидалось, рекомендуем воспользоваться следующими встроенными инструментами БСП и платформы:
БанковскиеСчета выдает пустой результат или ошибку «У пользователя недостаточно прав...», это поможет локализовать проблему и понять, на каком уровне (роли или RLS) происходит сбой.