При разработке расширений часто возникает задача ограничить видимость записей в новом регистре сведений в зависимости от прав доступа к объектам, указанным в его измерениях. Типичная ситуация: в регистре есть поле ДокументИБ, и если у пользователя нет прав на этот документ, он видит в списке «Объект не найден» или пустые значения. Наша задача — полностью скрыть такие строки, используя современный «производительный» режим RLS, предусмотренный в Библиотеке стандартных подсистем (БСП).
Рассмотрим пошагово, как правильно настроить этот механизм, разберем причины возможных сбоев и проанализируем альтернативные способы решения проблемы.
Для того чтобы механизм производительного RLS «увидел» наш новый регистр в расширении, недостаточно просто создать его. Необходимо выполнить ряд регистрационных действий в программном коде. Проанализируем основные точки входа.
Во-первых, необходимо заимствовать в расширение определяемый тип ВладелецЗначенийКлючейДоступаНаборЗаписей и добавить в него наш регистр сведений. Это позволяет системе создавать записи в таблицах ключей доступа при изменении данных регистра.
Во-вторых, в модуле УправлениеДоступомПереопределяемый необходимо расширить процедуру ПриЗаполненииСписковСОграничениемДоступа. Рассмотрим пример кода:
&После("ПриЗаполненииСписковСОграничениемДоступа")
Процедура ОбмТК_ПриЗаполненииСписковСОграничениемДоступа(Списки)
// Указываем метаданные нашего регистра и устанавливаем Истина для включения RLS
Списки.Вставить(Метаданные.РегистрыСведений.ОбмТК_ДанныеЗаказовТК, Истина);
КонецПроцедуры
Важный нюанс: в последних версиях БСП (3.1.5+) также рекомендуется проверить регистрацию в процедуре НазначитьМишениДляОбъектовAccessRestriction, если стандартная регистрация не дает результата.
Основная логика прав описывается в модуле менеджера регистра сведений в процедуре ПриЗаполненииОграниченияДоступа. Здесь мы определяем, по каким полям и при каких условиях будет ограничиваться доступ.
Выясним причину использования функции ЧтениеОбъектаРазрешено. Эта функция является «инструкцией» для БСП, которая при обновлении данных сформирует необходимые ключи доступа. Посмотрим на пример реализации:
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
Ограничение.Текст =
"РазрешитьЧтениеИзменение
|ГДЕ
| ЧтениеОбъектаРазрешено(ДокументИБ, ПустаяСсылка КАК Истина, Неопределено КАК Истина, Null КАК Истина)";
КонецПроцедуры
В данном коде параметры ПустаяСсылка КАК Истина означают, что если поле ДокументИБ не заполнено, то запись должна быть видна всем пользователям. Это критически важный момент для корректной фильтрации списка.
После описания логики в коде необходимо настроить саму роль. В расширении создается роль, где для регистра сведений на право «Чтение» устанавливается ограничение. БСП предоставляет стандартные шаблоны, которые упрощают написание запросов RLS.
Обычно используется универсальный шаблон #ДляРегистра. Рассмотрим его структуру:
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
#ДляРегистра("ИдентификаторыОбъектовРасширений.РегистрСведенийОбмТК_ДанныеЗаказовТК", "ДокументИБ", "", "", "", "")
#Иначе
ИСТИНА
#КонецЕсли
Почему это может не работать? Если вы заметили, что записи с заполненным документом пропадают, хотя права на документ есть, проблема может быть в следующем:
ИдентификаторыОбъектовМетаданных и ИдентификаторыОбъектовРасширений. Убедитесь, что предопределенный элемент в ИдентификаторыОбъектовРасширений создан верно и соответствует вашему регистру.NULL или Неопределено, БСП переключает внутренний алгоритм на использование таблицы КлючиДоступаКРегистрам. Если эта таблица не заполнена актуальными данными, пользователь не увидит ничего.Одной из самых частых причин неработающего RLS является отсутствие записей в физических таблицах ключей доступа. После внесения изменений в код ПриЗаполненииОграниченияДоступа необходимо «заставить» систему пересчитать права для уже существующих записей регистра.
Выполним следующие действия в режиме «1С:Предприятие» под полными правами:
УправлениеДоступом.ЗарегистрироватьДанныеКОбновлению(Метаданные.РегистрыСведений.ОбмТК_ДанныеЗаказовТК);
После этого необходимо дождаться выполнения регламентного задания «Обновление доступа на уровне записей». Именно оно заполняет таблицу КлючиДоступаКРегистрам, на основании которой работает производительный фильтр.
Если штатный механизм БСП кажется избыточным или не поддается отладке в конкретном расширении, проанализируем другие подходы:
ВЫБРАТЬ РАЗРЕШЕННЫЕ. В сочетании с простым RLS на сам документ (измерения) это позволит автоматически скрывать строки с недоступными ссылками.ОпределяемыйТип.ДокументИБ, сами являются участниками системы доступа БСП. Если вы добавите туда тип объекта, для которого RLS не настроен вовсе, система может вести себя непредсказуемо.Резюме: Настройка RLS в расширении требует строгого соблюдения последовательности регистрации метаданных в БСП. Основное внимание стоит уделить синхронизации справочников идентификаторов и регламентному обновлению ключей доступа. Только после того, как в регистре КлючиДоступаКРегистрам появятся записи с именем вашего регистра, RLS начнет работать корректно.