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

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

RLS УНФ УФ Ограничение на уровне записей Подразделение

27
Инструкция для тех, кто столкнулся с 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.Ссылка",
"",
"СтруктурнаяЕдиница","