Доработка RLS для УНФ

Администрирование - Защита, права, пароли

25
Инструкция для тех, кто столкнулся с RLS на управляемых формах впервые и не знает, с чего начать.

Довелось мне столкнуться со следующей задачкой: ограничить пользователей по подразделениям, то есть пользователь подразделения 1 не должен видеть никаких движений подразделения 2. Некий опыт в этом у меня, конечно присутствовал, но только для УТ 2.3 (10.3) и то с 0, и когда я увидел, что тут активно используются шаблоны - опечалился. Наученный опытом работы с ограничением прав по записям хочу помочь тем, кто столкнулся с данной проблемой, и по шагам расписать мой опыт. Заранее говорю, что я не специалист в данной области, а статья не полная и всеобъемлющая. Также я использовал УНФ для Украины версии 1.6.5.2, но думаю, это будет актуально многим конфигурациям на БСП 3.

Итак, начать необходимо с создания "контейнера" для хранения отборов по подразделениям. Заходим в ветку "определяемые типы" и добавляем в объект "ЗначениеДоступа" наш справочник, для которого будет выполняться отбор.


В общем модуле УправлениеДоступомПереопределяемый модифицируем процедуру ПриЗаполненииВидовДоступа, добавляя наш объект и его представление
 

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



После чего выполняем обновление информационной базы ( запуск с параметром /c ЗапуститьОбновлениеИнформационнойБазы) для того, чтобы отработала процедура "ПроверитьОбновлениеПараметровРаботыПрограммы" общего модуля "Стандартные подсистемы сервер" и обновила список настроек ограничений прав доступа.

В ограничениях групп доступа появляется новый вид доступа "Подразделение", которое можно назначить профилю (применимо к моей задаче) или пользователю. 



Далее совсем просто: открываем любую роль (например "ДобавлениеИзменениеПодсистемыПродажи", ибо продажники крайне ревниво относятся к своим секретам) которая использует РЛС с шаблонами и копируем в нашу (необходимую) роль шаблоны "по значениям" и "по значениям расширенный". 

В начале шаблона присутствует небольшое описание, как с ним работать. Лично мне проще разбираться на нескольких примерах, а описание читать только когда что то уяснил из практики, поэтому мое описание немного отличается от того что там написано.

В ограничение доступа данным добавляем строку. Поля - прочие поля, Ограничение доступа:
1) простое условие 

#ПоЗначениям( "Документ.ЗаказНаПроизводство ","Чтение","",
"СтруктурнаяЕдиница","СтруктурнаяЕдиница", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","" )

1й параметр - таблица, 2й параметр - вид доступа (чтение, добавление,изменение итд..) 4й параметр - имя ограничения данных вида досупа (то что мы указали в  ВидДоступа.Имя=; в модуле) 5й параметр - реквизит таблицы (документа,справочника).

2) сложное условие (пример: документ перемещение, которому нужно использовать 2 подразделения)

#ПоЗначениямРасширенный( "Документ.ПеремещениеЗапасов","Чтение","","",
"(", "СтруктурнаяЕдиница","СтруктурнаяЕдиница", "ИЛИ","СтруктурнаяЕдиница","СтруктурнаяЕдиницаПолучатель", ")",
"","", "", "","", "",
"","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","" )

Структура полей аналогична, но есть параметр "о" и "о1" -открывающиеся и закрывающиеся скобки, внутри которых может быть несколько параметров.

Аналогичная структура для журналов документов и справочников. Для ЖД нужно указать вместо реквизита документа граф, по которому будет вестись ограничение, и проследить чтобы в дин. списке было свойство запроса "Разрешенные" ибо это может вызвать ошибку. Сталкиваясь с ограничением по регистрам (в моем случае это был регистр "ЗаказыНаПроизводство") можно увидеть что в регистре нет ни измерения ни ресурса ни реквизита "СтруктурнаяЕдиница", такая же проблема может возникнуть с документами или справочников, когда нужно ограничить доступ по подчиненному свойству. И такая возможность есть в данных шаблонах! Через RLS мы добавляем к выборке еще одну таблицу, содержащую данный реквизит, например документ-регистратор, на который и накладываем отбор по подразделению. Благодаря внутреннему соединению все лишние толя будут обрезаны, и мы получим лишь необходимые записи.

#ПоЗначениямРасширенный( "РегистрНакопления.ЗаказыНаПроизводство","Чтение","",
"ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказНаПроизводство КАК Т1
ПО Т.ЗаказНаПроизводство = Т1.Ссылка",
"",
"СтруктурнаяЕдиница","Т1.СтруктурнаяЕдиница","",
"","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","" )


Еще одно обновление информационной базы (связанное с добавлением роли, вам может и не понадобится) и вуаля! 


Надеюсь, данная статья поможет вам разобраться, с чего начать при разработке RLS на новых конфигурациях.

P.S. И помните! Самый коварный подводный камень RLS - дать пользователю вторую роль на тот же объект, на которой ограничения не настроены ;)

25

См. также

Комментарии
Сортировка: Древо
1. FesenkoA 26 14.05.18 16:06 Сейчас в теме
Очень качественно скрыл наименование профиля группы доступа, ничего не скажешь))) Благо на примере своей учетки делал..
2. Armando 1386 14.05.18 22:04 Сейчас в теме
Инструкция для тех, кто столкнулся с RLS на управляемых формах

А чем RLS на управляемых формах принципально отличается от RLS на обычных формах? И причем вообще здесь формы? RLS работает и во внешнем соединении, где вообще нет форм.
4. FesenkoA 26 15.05.18 09:18 Сейчас в теме
(2) "На управляемых формах" => "в конфигурациях на БСП 3: УНФ для Укр/РФ, УТ3/УТ11, CRM3", это я хотел сказать. На старых конфигурациях было больше шаблонов и меньше параметров при их вызове. Кроме того шаблоны были похожи на простой запрос, и использовались, если мне не изменяет память, реже.

Сами RLS поменялись точно так же как и запросы: чуть менее чем никак.
5. Yashazz 2277 17.05.18 01:23 Сейчас в теме
Лучший совет по работе с РЛС - никогда с этим не связывайтесь. А если уж надо, то делайте реквизит, агрегирующий несколько понятий, определяющих доступ (как например справочники "Аналитика..." в типовых) и вешайте простейший запрос Реквизит В (&СписокДопустимых). Всё остальное, как ни прыгай, будет самым идиотским образом оттранслировано в запросы СУБД либо просто превратится в малопонятную и непрозрачную кашу.
7. FesenkoA 26 17.05.18 10:03 Сейчас в теме
(5) согласен, если есть возможность справиться отборами - лучше справиться отборами. Но бывают случаи когда без них никак:есть Н подразделений, которые не должны видеть ничего друг у друга кроме остатков. Мы подсчитали количество отчетов, списков и справочников (да, там еще по ГП отбор. Зная что выпущено - можно понять что за работы были) и решили пилить РЛС... К счастью только структурные единицы и только производство
Оставьте свое сообщение