Как настроить RLS в производительном режиме для регистра сведений в расширении?

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

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

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

Шаг 1. Интеграция регистра в систему управления доступом БСП

Для того чтобы механизм производительного RLS «увидел» наш новый регистр в расширении, недостаточно просто создать его. Необходимо выполнить ряд регистрационных действий в программном коде. Проанализируем основные точки входа.

Во-первых, необходимо заимствовать в расширение определяемый тип ВладелецЗначенийКлючейДоступаНаборЗаписей и добавить в него наш регистр сведений. Это позволяет системе создавать записи в таблицах ключей доступа при изменении данных регистра.

Во-вторых, в модуле УправлениеДоступомПереопределяемый необходимо расширить процедуру ПриЗаполненииСписковСОграничениемДоступа. Рассмотрим пример кода:


&После("ПриЗаполненииСписковСОграничениемДоступа")
Процедура ОбмТК_ПриЗаполненииСписковСОграничениемДоступа(Списки)
    // Указываем метаданные нашего регистра и устанавливаем Истина для включения RLS
    Списки.Вставить(Метаданные.РегистрыСведений.ОбмТК_ДанныеЗаказовТК, Истина); 
КонецПроцедуры

Важный нюанс: в последних версиях БСП (3.1.5+) также рекомендуется проверить регистрацию в процедуре НазначитьМишениДляОбъектовAccessRestriction, если стандартная регистрация не дает результата.

Шаг 2. Настройка логики ограничения в модуле менеджера

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

Выясним причину использования функции ЧтениеОбъектаРазрешено. Эта функция является «инструкцией» для БСП, которая при обновлении данных сформирует необходимые ключи доступа. Посмотрим на пример реализации:


Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт    
    Ограничение.Текст =
        "РазрешитьЧтениеИзменение
        |ГДЕ
        |    ЧтениеОбъектаРазрешено(ДокументИБ, ПустаяСсылка КАК Истина, Неопределено КАК Истина, Null КАК Истина)";
КонецПроцедуры

В данном коде параметры ПустаяСсылка КАК Истина означают, что если поле ДокументИБ не заполнено, то запись должна быть видна всем пользователям. Это критически важный момент для корректной фильтрации списка.

Шаг 3. Работа с ролями и шаблонами RLS

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

Обычно используется универсальный шаблон #ДляРегистра. Рассмотрим его структуру:


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

Почему это может не работать? Если вы заметили, что записи с заполненным документом пропадают, хотя права на документ есть, проблема может быть в следующем:

  1. Идентификаторы объектов: Механизм RLS в расширениях часто путается между справочниками ИдентификаторыОбъектовМетаданных и ИдентификаторыОбъектовРасширений. Убедитесь, что предопределенный элемент в ИдентификаторыОбъектовРасширений создан верно и соответствует вашему регистру.
  2. Переход от #ПоОбъекту к #ПоРегистру: Как только вы добавляете в менеджер регистра условия на NULL или Неопределено, БСП переключает внутренний алгоритм на использование таблицы КлючиДоступаКРегистрам. Если эта таблица не заполнена актуальными данными, пользователь не увидит ничего.

Шаг 4. Принудительное обновление ключей доступа

Одной из самых частых причин неработающего RLS является отсутствие записей в физических таблицах ключей доступа. После внесения изменений в код ПриЗаполненииОграниченияДоступа необходимо «заставить» систему пересчитать права для уже существующих записей регистра.

Выполним следующие действия в режиме «1С:Предприятие» под полными правами:

  1. Запустите обработку «Обновление вспомогательных данных» (входит в состав БСП).
  2. Если это не помогло, выполните программный код для регистрации данных к обновлению:

УправлениеДоступом.ЗарегистрироватьДанныеКОбновлению(Метаданные.РегистрыСведений.ОбмТК_ДанныеЗаказовТК);

После этого необходимо дождаться выполнения регламентного задания «Обновление доступа на уровне записей». Именно оно заполняет таблицу КлючиДоступаКРегистрам, на основании которой работает производительный фильтр.

Альтернативные решения

Если штатный механизм БСП кажется избыточным или не поддается отладке в конкретном расширении, проанализируем другие подходы:

  1. Собственное правило доступа: Вместо использования сложных шаблонов БСП, в роли можно прописать прямое ограничение. Это лишит систему преимуществ «производительного» режима, но обеспечит стабильный результат на небольших объемах данных.
  2. Использование РАЗРЕШЕННЫЕ в динамическом списке: Посмотрим на ситуацию со стороны интерфейса. Если форма списка регистра построена на динамическом списке, можно изменить его основной запрос, добавив ключевое слово ВЫБРАТЬ РАЗРЕШЕННЫЕ. В сочетании с простым RLS на сам документ (измерения) это позволит автоматически скрывать строки с недоступными ссылками.
  3. Проверка через определяемые типы: Убедитесь, что все типы документов, входящие в ваш ОпределяемыйТип.ДокументИБ, сами являются участниками системы доступа БСП. Если вы добавите туда тип объекта, для которого RLS не настроен вовсе, система может вести себя непредсказуемо.

Резюме: Настройка RLS в расширении требует строгого соблюдения последовательности регистрации метаданных в БСП. Основное внимание стоит уделить синхронизации справочников идентификаторов и регламентному обновлению ключей доступа. Только после того, как в регистре КлючиДоступаКРегистрам появятся записи с именем вашего регистра, RLS начнет работать корректно.

← На главную