Каталог решений - Как поженить типовой RLS и новый документ

Как поженить типовой RLS и новый документ

Как поженить типовой RLS и новый документ

В наличии

Создание доступа на уровне записей (RLS) для нового документа средствами библиотеки стандартных подсистем (БСП).

Категория:

Описание

Случилась у меня задачка сделать в типовой конфигурации (УНФ 1.6.24.193 — это неважно) доступ на уровне записей (RLS) для нового документа. Документ сделан был быстро методом «Копи-Паста» в моем случае исходным был документ ЗаказПоставщику (Источник), а создавался документ РеестрОтгрузки (НовыйДокумент).

С первого раза с правами не влетело. Не взлетело и потом с пинками…  Далее опишу методику поиска решения, потому-что через пару лет уже сами объекты библиотеки стандартных подсистем (БСП) сильно поменяются.

Просмотр просторов интернета дал мало ссылок. Вот наиболее стоящая:https://forum.infostart.ru/forum9/topic237082/

Также интересной оказалась обработка для раскручивания шаблона в запрос: //sale.itcity.ru/public/264989/

Чтобы понять объем катастрофы, можно установить фильтр конфигурации по подсистемам — «СтандартныеПодсистемы\УправлениеДоступом» :

 

 

Итого: 7 Общих модулей, 13 определяемых типов, 4 справочника, 19 регистров сведений.

Сразу же выделил два регистра с которыми у меня возникли проблемы.

Шаги большого пути:

1. Добавить ссылки на НовыйДокумент, в составных типах данных там где были ссылки на документ Источник. Таких данных оказалось 3. Все они были определяемые типы: ВладелецЗначенийКлючейДоступа, ВладелецЗначенийКлючейДоступаДокумент, ПолеРегистраКлючейДоступаКРегистрам. Эти типы пришлось снимать с поддержки, механизм расширений пока для этого не готов.

2. По условиям задачи требовалось создать новую роль с ограничением доступа по Организации и Контрагентам. В новую роль копируем Шаблоны из роли Источника. Стандартные шаблоны написаны универсально без указания текущего объекта. Обычно всё выносится в параметры. В моем случае копировалось из роли ДобавлениеИзменениеПодсистемыЗакупки :

 

 

Настраиваем права Новой роли: 

 

 

Копировать нужно по очереди отдельно для каждого права. В ограничениях доступа для Прав Чтение, Добавление, Изменение в конструкциях типа:

#ПоЗначениям( "Документ.ЗаказПоставщику","Чтение","",

меняем Источник на НовыйДокумент:

#ПоЗначениям( "Документ.РеестрОтгрузки","Чтение","",

3. Проверяем наличие экспортной процедуры в модуле менеджера НовогоДокумента

Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт

 

 

4. Поиск прямого обращения к документу Источника в модулях этой подсистемы позволило обнаружить 2 процедуры. Переопределяем две экспортные процедуры из модуля УправлениеДоступомПереопределяемый в новом или существующем расширении:

 

 

5. В режиме Предприятие создаем новый профиль или в существующем профиле добавляем новую роль. Естественно в профиле должны заданы ограничения доступа:

 

 

6. Добавляем в права пользователя профиль созданный в п.5 и выбираем группы доступа контрагентов. Проверяем и… не работает.

После длительного копания в потрохах RLS, выяснил, что основной структурой данных на которые опираются дополнительные условия в запросах является регистр сведений ТаблицыГруппДоступа. Этот регистр описывает как накладывать условия. Измерение (Таблица) этого РС является ссылкой на Справочник.ИдентификаторыОбъектовМетаданных и в моем случае для нового документа записей не содержалось. Сам справочник оказался заполнен новым документом. 

Были испробованы несколько вариантов заполнения:

Запуск предприятия с ключом обновления.

Запуск Регламентного задания ЗаполнениеДанныхДляОграниченияДоступа.

Запуск в лоб (своей обработке) кода: УправлениеДоступомСлужебный.ОбновитьВспомогательныеДанныеПоИзменениямКонфигурации().

Ничего не сработало. После долгих поисков было обнаружено, что регистр сведений ПраваРолей, для НовогоОбъекта тоже не заполнены. Решение было в вызове двух служебных процедур (во внешней обработке):

&НаСервере

Процедура ОбновитьПраваРолейНаСервере()

ЕстьИзменения = Неопределено;

РегистрыСведений.ПраваРолей.ОбновитьДанныеРегистра(ЕстьИзменения);

Сообщить("ЕстьИзменения:" + Строка(ЕстьИзменения));

КонецПроцедуры

&НаКлиенте

Процедура ОбновитьПраваРолей(Команда)

ОбновитьПраваРолейНаСервере();

КонецПроцедуры

&НаСервере

Процедура ОбновитьВспомогательныеДанныеНаСервере()

РегистрыСведений.ТаблицыГруппДоступа.ОбновитьДанныеРегистра(); // вызов внутри следующей процедуры не срабатывает, т.к. версии конфы совпадает.

УправлениеДоступомСлужебный.ОбновитьВспомогательныеДанныеПоИзменениямКонфигурации()

КонецПроцедуры

&НаКлиенте

Процедура ОбновитьВспомогательныеДанные(Команда)

ОбновитьВспомогательныеДанныеНаСервере();

КонецПроцедуры

——

P.S.

Кто найдет более простое решение для заполнения указанных регистров сведений, пишите в комментариях.

has been added to your cart:
Оформление заказа