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