Механизм ограничения доступа к данным RLS (Row Level Security) позволяет довольно гибко настраивать и разграничивать права доступа к объектам программы. В типовых конфигурациях "1С Предприятие" механизм развит довольно хорошо, однако бывают ситуации, когда типовой настройки недостаточно. Рассмотрим такую ситуацию на примере программы "ERP Управление предприятием 2".
Представим, что на предприятии действует следующая схема: Заявки на расходование денежных средств оформляют сотрудники нескольких подразделений, например "Плановый отдел", "Хозяйственный отдел". Эти отделы – элементы справочника "Подразделения организаций" (сотрудники оформлены в этих отделах). При этом в Заявках на расходование денежных средств указываются другие подразделения – элементы справочника "Структура предприятия". Например, "Подразделение 1", "Подразделение 2". Существует группа пользователей, которая должна видеть только те заявки, которые оформлены сотрудниками "Планового отдела". Типовая настройка RLS для документа "Заявка на расходование денежных средств" и роли "Чтение заявок на расход ДС" не позволяет выполнить такую настройку, поэтому мы её немного доработаем – добавим новый вид доступа.
Начнём доработку с документа "Заявка на расходование денежных средств". Добавим реквизит, содержащий в себе подразделение автора документа. Назовём его ПодразделениеАвтора. Тип значения реквизита – Э-э... Вот здесь есть над чем подумать. Если установить тип значения – "СправочникСсылка.ПодразделенияОрганизаций", то потом, когда мы попытаемся создать новый вид доступа с названием "Подразделения авторов документов" и типом значения "СправочникСсылка.ПодразделенияОрганизаций", система при обновлении выдаст ошибку:
"Тип значений "Подразделение" уже указан для вида доступа "ПодразделенияОрганизаций". Для вида доступа "ПодразделенияАвторовДокументов" его нельзя указать."
Есть соблазн использовать объект "Определяемый тип", что-нибудь вроде:
ВидДоступа.ТипЗначений = Тип("ОпределяемыйТип.ПодразделенияАвторов");
Но система не хочет понимать такие формулировки, так что если кто что может дельного подсказать, буду признателен. А пока создаём справочник "Подразделения авторов документов", владелец которого – справочник "Подразделения организаций". В этом справочнике те же подразделения, что и во владельце. И теперь для нового реквизита документа "Заявка на расходование денежных средств" укажем тип "СправочникСсылка.ПодразделенияАвторовДокументов". Настроим заполнение реквизита при записи документа. Думаю, тут описывать это не стоит, так же как и заполнение нового справочника.
Далее:
Определяемый тип "ЗначениеДоступа"
Добавляем в составной тип ссылки на документ "Заявка на расходование денежных средств" и справочник "Подразделения авторов документов".
Подписка на событие "ОбновитьГруппыЗначенийДоступа"
Добавим в список источника документ "Заявка на расходование денежных средств".
Общий модуль "УправлениеДоступомПереопределяемый"
Добавляем в процедуры модуля несколько строк.
Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт ... //Доработка ВидДоступа = ВидыДоступа.Добавить(); ВидДоступа.Имя = "ПодразделенияАвторовДокументов"; ВидДоступа.Представление = НСтр("ru = 'Подразделения авторов документов'"); ВидДоступа.ТипЗначений = Тип("СправочникСсылка.ПодразделенияАвторовДокументов"); //КонецДоработки КонецПроцедуры Процедура ПриЗаполненииИспользованияВидаДоступа(ВидДоступа, Использование) Экспорт ... //Доработка Если ВидДоступа = "ПодразделенияАвторовДокументов" Тогда Использование = Истина; КонецЕсли; //КонецДоработки КонецПроцедуры Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт Описание = Описание + " |... |//Доработка |Документ.ЗаявкаНаРасходованиеДенежныхСредств.Чтение.ПодразделенияАвторовДокументов |//КонецДоработки |"; КонецПроцедуры
Теперь нужно настроить роль для доступа к документу. Можно создать новую роль, а можно доработать уже существующую "Чтение заявок на расход ДС". Рассмотрим второй вариант. В роли "Чтение заявок на расход ДС" уже есть настройка ограничения доступа с использованием шаблона "ПоЗначениямРасширенный".
Нам нужно вставить в список параметров свой вид доступа и поле таблицы, а также удалить такое же число пустых параметров, так как количество устанавливаемых значений должно соответствовать количеству параметров в шаблоне.
Далее, запускаем конфигурацию в режиме "Предприятие" с параметром запуска "ЗапуститьОбновлениеИнформационнойБазы". Также можно запустить, например с помощью внешней обработки, экспортную процедуру "УправлениеДоступомСлужебный.ОбновитьПараметрыОграниченияДоступа".
После того, как обновление завершится, нам останется создать профиль доступа, включающий в себя роль "Чтение заявок на расход ДС", а также группу доступа, настроить ограничение доступа и, наконец, назначить созданную группу доступа пользователям.