Довелось мне столкнуться со следующей задачкой: ограничить пользователей по подразделениям, то есть пользователь подразделения 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 — дать пользователю вторую роль на тот же объект, на которой ограничения не настроены 😉
Очень качественно скрыл наименование профиля группы доступа, ничего не скажешь))) Благо на примере своей учетки делал..
А чем RLS на управляемых формах принципально отличается от RLS на обычных формах? И причем вообще здесь формы? RLS работает и во внешнем соединении, где вообще нет форм.
(2) «На управляемых формах» => «в конфигурациях на БСП 3: УНФ для Укр/РФ, УТ3/УТ11, CRM3», это я хотел сказать. На старых конфигурациях было больше шаблонов и меньше параметров при их вызове. Кроме того шаблоны были похожи на простой запрос, и использовались, если мне не изменяет память, реже.
Сами RLS поменялись точно так же как и запросы: чуть менее чем никак.
Лучший совет по работе с РЛС — никогда с этим не связывайтесь. А если уж надо, то делайте реквизит, агрегирующий несколько понятий, определяющих доступ (как например справочники «Аналитика…» в типовых) и вешайте простейший запрос Реквизит В (&СписокДопустимых). Всё остальное, как ни прыгай, будет самым идиотским образом оттранслировано в запросы СУБД либо просто превратится в малопонятную и непрозрачную кашу.
(5) согласен, если есть возможность справиться отборами — лучше справиться отборами. Но бывают случаи когда без них никак:есть Н подразделений, которые не должны видеть ничего друг у друга кроме остатков. Мы подсчитали количество отчетов, списков и справочников (да, там еще по ГП отбор. Зная что выпущено — можно понять что за работы были) и решили пилить РЛС… К счастью только структурные единицы и только производство
(5)
Почитайте
ОграничениеДоступаНаУровнеЗаписейУниверсально
И уж тем более почитайте про разделение данных