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