Случилась у меня задачка сделать в типовой конфигурации (УНФ 1.6.24.193 - это неважно) доступ на уровне записей (RLS) для нового документа. Документ сделан был быстро методом «Копи-Паста» в моем случае исходным был документ ЗаказПоставщику (Источник), а создавался документ РеестрОтгрузки (НовыйДокумент).
С первого раза с правами не влетело. Не взлетело и потом с пинками… Далее опишу методику поиска решения, потому-что через пару лет уже сами объекты библиотеки стандартных подсистем (БСП) сильно поменяются.
Просмотр просторов интернета дал мало ссылок. Вот наиболее стоящая:https://forum.infostart.ru/forum9/topic237082/
Также интересной оказалась обработка для раскручивания шаблона в запрос: //infostart.ru/public/264989/
Чтобы понять объем катастрофы, можно установить фильтр конфигурации по подсистемам - «СтандартныеПодсистемы\УправлениеДоступом» :
Итого: 7 Общих модулей, 13 определяемых типов, 4 справочника, 19 регистров сведений.
Сразу же выделил два регистра с которыми у меня возникли проблемы.
Шаги большого пути:
1. Добавить ссылки на НовыйДокумент, в составных типах данных там где были ссылки на документ Источник. Таких данных оказалось 3. Все они были определяемые типы: ВладелецЗначенийКлючейДоступа, ВладелецЗначенийКлючейДоступаДокумент, ПолеРегистраКлючейДоступаКРегистрам. Эти типы пришлось снимать с поддержки, механизм расширений пока для этого не готов.
2. По условиям задачи требовалось создать новую роль с ограничением доступа по Организации и Контрагентам. В новую роль копируем Шаблоны из роли Источника. Стандартные шаблоны написаны универсально без указания текущего объекта. Обычно всё выносится в параметры. В моем случае копировалось из роли ДобавлениеИзменениеПодсистемыЗакупки :
Настраиваем права Новой роли:
Копировать нужно по очереди отдельно для каждого права. В ограничениях доступа для Прав Чтение, Добавление, Изменение в конструкциях типа:
#ПоЗначениям( "Документ.ЗаказПоставщику","Чтение","",
меняем Источник на НовыйДокумент:
#ПоЗначениям( "Документ.РеестрОтгрузки","Чтение","",
3. Проверяем наличие экспортной процедуры в модуле менеджера НовогоДокумента
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
4. Поиск прямого обращения к документу Источника в модулях этой подсистемы позволило обнаружить 2 процедуры. Переопределяем две экспортные процедуры из модуля УправлениеДоступомПереопределяемый в новом или существующем расширении:
5. В режиме Предприятие создаем новый профиль или в существующем профиле добавляем новую роль. Естественно в профиле должны заданы ограничения доступа:
6. Добавляем в права пользователя профиль созданный в п.5 и выбираем группы доступа контрагентов. Проверяем и... не работает.
После длительного копания в потрохах RLS, выяснил, что основной структурой данных на которые опираются дополнительные условия в запросах является регистр сведений ТаблицыГруппДоступа. Этот регистр описывает как накладывать условия. Измерение (Таблица) этого РС является ссылкой на Справочник.ИдентификаторыОбъектовМетаданных и в моем случае для нового документа записей не содержалось. Сам справочник оказался заполнен новым документом.
Были испробованы несколько вариантов заполнения:
Запуск предприятия с ключом обновления.
Запуск Регламентного задания ЗаполнениеДанныхДляОграниченияДоступа.
Запуск в лоб (своей обработке) кода: УправлениеДоступомСлужебный.ОбновитьВспомогательныеДанныеПоИзменениямКонфигурации().
Ничего не сработало. После долгих поисков было обнаружено, что регистр сведений ПраваРолей, для НовогоОбъекта тоже не заполнены. Решение было в вызове двух служебных процедур (во внешней обработке):
&НаСервере
Процедура ОбновитьПраваРолейНаСервере()
ЕстьИзменения = Неопределено;
РегистрыСведений.ПраваРолей.ОбновитьДанныеРегистра(ЕстьИзменения);
Сообщить("ЕстьИзменения:" + Строка(ЕстьИзменения));
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьПраваРолей(Команда)
ОбновитьПраваРолейНаСервере();
КонецПроцедуры
&НаСервере
Процедура ОбновитьВспомогательныеДанныеНаСервере()
РегистрыСведений.ТаблицыГруппДоступа.ОбновитьДанныеРегистра(); // вызов внутри следующей процедуры не срабатывает, т.к. версии конфы совпадает.
УправлениеДоступомСлужебный.ОбновитьВспомогательныеДанныеПоИзменениямКонфигурации()
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьВспомогательныеДанные(Команда)
ОбновитьВспомогательныеДанныеНаСервере();
КонецПроцедуры
-----
P.S.
Кто найдет более простое решение для заполнения указанных регистров сведений, пишите в комментариях.