Как правильно настроить RLS в БСП для справочника Банковские счета и исправить ошибки ограничения доступа

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

Настройка ограничения доступа на уровне записей (RLS) в 1С с использованием «Библиотеки стандартных подсистем» (БСП) — задача, с которой рано или поздно сталкивается любой разработчик. Часто при первой самостоятельной настройке по статьям из интернета возникает классическая проблема: ограничение либо вообще не срабатывает (пользователь видит все данные), либо скрывает абсолютно все элементы списка (пользователь не видит ничего). В этой статье мы подробно проанализируем причины такого поведения системы, разберем типичные архитектурные ошибки и предоставим пошаговое руководство по правильной настройке RLS.

Выясним причину: почему RLS работает некорректно

Рассмотрим стандартную ситуацию. Разработчик пытается ограничить доступ к определенному банковскому счету (например, «Яковлев»). Для этого создается вспомогательный справочник групп доступа, настраиваются профили, прописывается шаблон RLS в роли, но при тестировании происходят странные вещи:

  1. При настройке профиля «Все разрешить, кроме указанных» (где указана наша группа доступа) — пользователь продолжает видеть абсолютно все счета, ограничение не применяется.
  2. При настройке профиля «Все запретить, кроме указанных» — у пользователя пропадают вообще все счета, список становится полностью пустым.

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

Давайте разберем по шагам две ключевые ошибки, допущенные при реализации этого механизма.

Ошибка 1. Неверное указание параметров в шаблоне ролей

В конфигурации была создана роль, где для права Чтение справочника БанковскиеСчета прописан следующий шаблон:


#ПоЗначениям( "Справочник.БанковскиеСчета","Чтение","","ГруппыБанковскихСчетов","Ссылка", ... )

Давайте подробно разберем параметры этого стандартного шаблона БСП:

Указав в качестве пятого параметра значение "Ссылка", мы заставили систему сравнивать непосредственно саму ссылку на элемент справочника БанковскиеСчета со ссылкой на элемент справочника ГруппыДоступаБанковскихСчетов. Это абсолютно разные типы данных. Естественно, они никогда не совпадут.

Правильное решение: в пятом параметре шаблона необходимо указать имя реквизита, который вы специально добавили в справочник БанковскиеСчета для связи с группой доступа — "ГруппаДоступа":


#ПоЗначениям( "Справочник.БанковскиеСчета","Чтение","","ГруппыБанковскихСчетов","ГруппаДоступа","","","","","","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","" )

Ошибка 2. Нарушение логики связей (Владелец vs Реквизит)

Вторая логическая ошибка кроется в организации связи между справочниками. Разработчики часто пишут: «В новом справочнике групп доступа создаю элемент "Пенза", делаю владельцем наш счет "Яковлев"».

Давайте проанализируем эту структуру. Подчинение справочника групп доступа справочнику банковских счетов нарушает логику RLS в БСП. Связь должна быть направлена строго в противоположную сторону:

  1. Справочник ГруппыДоступаБанковскихСчетов должен быть независимым (неподчиненным). В нем вы создаете элементы-группы (например, «Пенза», «Москва», «Общие»).
  2. В справочнике БанковскиеСчета должен быть создан реквизит ГруппаДоступа с типом значения СправочникСсылка.ГруппыДоступаБанковскихСчетов.
  3. В самом банковском счете «Яковлев» в реквизите ГруппаДоступа вы должны явно выбрать созданную группу «Пенза».

Только при такой структуре шаблон RLS сможет прочитать из реквизита ГруппаДоступа конкретного счета значение группы («Пенза») и сопоставить его с правами текущего пользователя в регистре сведений.

Учет универсального (производительного) режима RLS в БСП

Начиная с БСП версий 3.x, по умолчанию используется так называемый универсальный (производительный) режим ограничения доступа. В этом режиме классические шаблоны вида #ПоЗначениям в чистом виде могут не работать, так как система использует кэширование прав в специальных регистрах сведений (таких как КлючиДоступаКОбъектам и КлючиДоступаПользователей).

Для корректной работы в любом из режимов шаблон RLS в вашей роли должен быть оформлен с использованием специального системного условия:


#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
#ДляОбъекта("")
#Иначе
#ПоЗначениям( "Справочник.БанковскиеСчета","Чтение","","ГруппыБанковскихСчетов","ГруппаДоступа","","","","","","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","" )
#КонецЕсли

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

Альтернативный вариант: RLS напрямую по значениям справочника

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

БСП позволяет настраивать ограничения напрямую по элементам самого ограничиваемого справочника. Посмотрим на этот более простой и изящный вариант реализации.

Шаг 1. Регистрируем вид доступа в общем модуле УправлениеДоступомПереопределяемый в процедуре ПриЗаполненииВидовДоступа:


Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт
    
    ВидДоступа = ВидыДоступа.Добавить();
    ВидДоступа.Имя = "БанковскиеСчета";
    ВидДоступа.Представление = НСтр("ru = 'Банковские счета'");
    ВидДоступа.ТипЗначений = Тип("СправочникСсылка.БанковскиеСчета");
    // Строку ТипГруппЗначений не заполняем! Ограничение идет напрямую по значениям.

КонецПроцедуры

Шаг 2. Настраиваем шаблон в роли. Так как мы ограничиваем доступ по значению самого справочника, проверять мы будем реквизит Ссылка:


#ПоЗначениям( "Справочник.БанковскиеСчета","Чтение","","БанковскиеСчета","Ссылка","","","","","","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","" )

Шаг 3. В режиме «1С:Предприятие» в профиле групп доступа теперь появится вид ограничения «Банковские счета». Администратор сможет напрямую выбрать нужные элементы без необходимости создавать лишние группы доступа и привязывать их к реквизитам.

Инструменты для отладки RLS

Если вы выполнили все настройки, но RLS по-прежнему ведет себя не так, как ожидалось, рекомендуем воспользоваться следующими встроенными инструментами БСП и платформы:

  1. Отчет по правам доступа. Откройте карточку пользователя, перейдите в раздел «Права доступа» и нажмите «Отчет по правам доступа». Он наглядно покажет все действующие ограничения на таблицы для выбранного пользователя.
  2. Анализ регистра «Ключи доступа к объектам». В режиме «Функции для технического специалиста» найдите этот регистр и проверьте, сформировался ли ключ доступа для вашего проблемного счета «Яковлев» и какие группы доступа в него записались.
  3. Проверка через консоль запросов. Вы можете запустить консоль запросов от имени пользователя с ограниченными правами. Если запрос к справочнику БанковскиеСчета выдает пустой результат или ошибку «У пользователя недостаточно прав...», это поможет локализовать проблему и понять, на каком уровне (роли или RLS) происходит сбой.
← На главную