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

Как доработать производительный RLS

Как доработать производительный RLS

В наличии

Неоднократно в последнее время поступали задачи, когда требовалось доработать новый производительный RLS. В своей статье Ретунский Александр, программист компании АО «Корпоративные ИТ-проекты» (официальный партнер ИнфоСофт) опишет последовательность действий при доработке нового RLS, ключевые моменты и сложности, с которыми столкнулся. В Интернете статей или инструкций, которые подробно и просто описывают – как доработать производительный RLS, не так много и автор делиться своим опытом.
В данной статье не будут описаны различия и плюсы/минусы между стандартным и производительным RLS, в Интернете по этому вопросу есть много информации.

Категория:

Описание

 

Задачи, требующие доработок RLS

            Опишу типы задач, в которых потребовалась доработка RLS и приведу примеры реальных задач. В последующих разделах подробно раскрою каждую задачу.

  1. Объект должен учитывать типовое ограничение доступа (реальная задача: типовой документ «Реестр платежей» должен содержать типовое ограничение доступа: «Организация»);
  2. Расширение типового ограничения доступа на другие реквизиты объекта (реальная задача: типовой документ «Перемещение товаров» должен учитывать типовое ограничение доступа: «Организация» по реквизитам: «Организация» и «ОрганизацияПолучатель»); более подробно как организовать работу между филиалами с включенным RLS будет рассказано в следующей статье.
  3. Новое ограничение доступа на типовые объекты (реальная задача: добавить новое ограничение: «Группы финансового учета расчетов» для документа: «Реализация товаров и услуг»).
  4. Объект должен учитывать ограничение доступа через другой объект (реальная задача: добавить новое ограничение «Группы финансового учета расчетов» из объекта «Договоры контрагента» для документа «Заказ клиента»).

 

Объект должен учитывать типовое ограничение доступа

            Чтобы объект учитывал типовое ограничение доступа (организация, склад и т.д.), необходимо выполнить ряд следующих действий:

  1. В первую очередь новый объект нужно добавить в определяемы тип:

— все объекты добавляем в: ВладелецЗначенийКлючейДоступа

— документы в: ВладелецЗначенийКлючейДоступаДокумент

— справочники в: ВладелецЗначенийКлючейДоступаОбъект

— регистры сведений и регистры накопления в: ВладелецЗначенийКлючейДоступаНаборЗаписей

— регистры расчета в: ВладелецЗначенийКлючейДоступаНаборЗаписейРегистраРасчета

  1. В общий модуль «УправлениеДоступомПереопределяемый» в процедуру «ПриЗаполненииСписковСОграничениемДоступа» добавить объект (метаданные).
  2. В общий модуль «УправлениеДоступомПереопределяемый» в процедуру «ПриЗаполненииВидовОграниченийПравОбъектовМетаданных» в запрос — добавить объект и вид доступа.
  3. Добавить новую роль на чтение нашего объекта. Добавить права на – «Чтение», «Просмотр» объекта.

Скопировать в новую роль типовой шаблон RLS — ДляОбъекта(ПолеОбъекта)

Для права «Чтение» для полей <Прочие поля> добавить ограничение: #ДляОбъекта("")

  1. Добавить новую роль на изменение/добавление нашего объекта. Добавить все права, кроме удалений.

Скопировать в новую роль типовой шаблон RLS — ДляОбъекта(ПолеОбъекта)

Для права «Изменение», «Добавление» для полей <Прочие поля> добавить ограничение: #ДляОбъекта("")

  1. В модуль менеджера объекта добавить (при её отсутствии):

#Область ДляВызоваИзДругихПодсистем и процедуру

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

в модуле процедуры заполнить — Ограничение.Текст запросом с нужными видами доступа.

  1. В форму объекта добавить код в начало процедуры ПриЧтенииНаСервере:
  // СтандартныеПодсистемы.УправлениеДоступом
  
  Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
  
  МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
  
  МодульУправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
  
  КонецЕсли;
  
  // Конец СтандартныеПодсистемы.УправлениеДоступом
  1. В форму объекта добавить код в конец процедуры ПослеЗаписиНаСервере:
  // СтандартныеПодсистемы.УправлениеДоступом
  
  УправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
  
  // Конец СтандартныеПодсистемы.УправлениеДоступом
  1. В пользовательском режиме при создании новых профилей/ групп доступа (с ограничениями)  обязательно нужно учитывать, чтобы не добавить типовую роль, на которой отключен RLS (отсутствуют шаблоны ограничений). В следующих статьях я подробно опишу об ограничениях типового RLS.
  2. Запустить конфигурацию с параметром: «/c обновление информационной базы» или запустить обработку – «Инструменты разработчика. Обновление Вспомогательных Данных» (можно скачать на сайте ИТС).
  3. В пользовательском режиме удалить запись из регистра сведений «Параметры ограничений доступа» (через возможности – «Еще»). В «НСИ и администрирование» — «Настройки пользователей и прав» — «Ограничение доступа на уровне записей», запустить процедуру обновления доступа на уровне записей. При выполнения данной процедуры будут появляться ошибки, если они есть в ограничениях доступа объектов.

 

Реальная задача: типовой документ «Реестр платежей» должен содержать типовое ограничение доступа: «Организация»:

  1. Добавим документ «Реестр платежей» в определяемый тип: ВладелецЗначенийКлючейДоступа
  2. Добавим документ «Реестр платежей» в определяемый тип: ВладелецЗначенийКлючейДоступаДокумент
  3. В общий модуль «УправлениеДоступомПереопределяемый» в конец процедуры «ПриЗаполненииСписковСОграничениемДоступа» добавил код:
  Списки.Вставить(Метаданные.Документы.РеестрПлатежей, Истина);
  1. В общий модуль «УправлениеДоступомПереопределяемый» в процедуру «ПриЗаполненииВидовОграниченийПравОбъектовМетаданных» в конец запроса добавим следующий код:
  |Документ.РеестрПлатежей.Чтение.Организации
  
  |Документ.РеестрПлатежей.Изменение.Организации
  1. Добавим новую роль на чтение документа «Реестр платежей», согласно рисунку 1.

Рисунок 1 – Роль «Чтение реестра платежей».

 

  1. Добавим новую роль на добавление/изменение документа «Реестр платежей», согласно рисунку 2.

Рисунок 2 – Роль «Добавление изменение реестра платежей».

 

  1. Добавим в модуль менеджера документа «Реестр платежей» следующий код:
  #Область ДляВызоваИзДругихПодсистем
  
  Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
  
  
             Ограничение.Текст =
  
             "РазрешитьЧтениеИзменение
  
             |ГДЕ
  
             |           ЗначениеРазрешено(Организация";
  
  
  КонецПроцедуры
  
  #КонецОбласти
  1. В форме документа «Реестр Платежей» добавим в начало процедуры ПриЧтенииНаСервере, следующий код:
  // СтандартныеПодсистемы.УправлениеДоступом
  
  Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
  
  МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
  
  МодульУправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
  
  КонецЕсли;
  
  // Конец СтандартныеПодсистемы.УправлениеДоступом
  1. В форме документа «Реестр Платежей» добавим в конец процедуры ПослеЗаписиНаСервере, следующий код:
  // СтандартныеПодсистемы.УправлениеДоступом
  
  УправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
  
  // Конец СтандартныеПодсистемы.УправлениеДоступом
  1. Создаем новый профиль/группу доступа – «Реестр платежей» (ограничение по организациям) добавляем туда новые роли.

Добавляем в группу доступа пользователей, обязательно проверяем – чтобы не были даны права на документ – «Реестр платежей» без RLS (т.к. в типовых ролях может отсутствовать RLS (шаблоны ограничений доступа)).

  1. Запустим обработку – «Инструменты разработчика. Обновление Вспомогательных Данных», выполним все пункты (можно скачать на сайте ИТС).
  2. В пользовательском режиме удалить запись из регистра сведений «Параметры ограничений доступа» (через возможности – «Еще»). В «НСИ и администрирование» — «Настройки пользователей и прав» — «Ограничение доступа на уровне записей», запустить процедуру обновления доступа на уровне записей. При выполнения данной процедуры будут появляться ошибки, если они есть в ограничениях доступа документа «Реестр платежей».

 

Расширение типового ограничения доступа на другие реквизиты объекта

Чтобы расширить типовое ограничения доступа на другие реквизиты объекта, необходимо доработать только в модуле менеджера процедуру – ПриЗаполненииОграниченияДоступа.

В пользовательском режиме при создании новых профилей/групп доступа (ограничение по организациям) – обязательно нужно учитывать, чтобы не добавить типовую роль, на которой отключен RLS (отсутствуют шаблоны ограничений). В следующих статьях я подробно опишу об ограничениях типового RLS.

 

Реальная задача: типовой документ «Перемещение товаров» должен учитывать типовое ограничение доступа: «Организация» по реквизитам: «Организация» и «ОрганизацияПолучатель».

Изменяем код процедуры «ПриЗаполненииОграниченияДоступа» документа «Перемещение товаров» в модуле менеджера на следующий:     

         Ограничение.Текст =
  
              "РазрешитьЧтениеИзменение
  
              |ГДЕ
  
              |           (ЗначениеРазрешено(Организация)
  
              |           ИЛИ ЗначениеРазрешено(ОрганизацияПолучатель))
  
              |           И( ЗначениеРазрешено(СкладОтправитель)
  
              |           ИЛИ ЗначениеРазрешено(СкладПолучатель)
  
              |           ) ";

Создаем новый профиль/группу доступа – «Перемещение товаров» добавляем туда роли для документа «Перемещение товаров» или выбираем уже существующий и туда добавляем роли (ограничение по организациям).

Добавляем в группу доступа пользователей, обязательно проверяем – чтобы не были даны права на документ – «Перемещение товаров» без RLS (т.к. в типовых ролях может отсутствовать RLS (шаблоны ограничений доступа)).

 

Новое ограничение доступа на объекты

Чтобы типовой объект учитывал новое ограничение доступа, необходимо выполнить ряд следующих действий:

  1. Добавить новое ограничение в два определяемых типа:

— ЗначениеДоступа;

— ЗначениеДоступаОбъект.

  1. В общий модуль «УправлениеДоступомУТ» в процедуру «ПриЗаполненииВидовДоступа» добавить данные о новом виде доступа.
  2. В общий модуль «УправлениеДоступомПереопределяемый» в процедуру «ПриЗаполненииВидовОграниченийПравОбъектовМетаданных» добавить в запросе — данные о новом виде доступа в объекте.
  3. В модуле менеджера объекта в процедуру «ПриЗаполненииОграниченияДоступа» добавить необходимый реквизит для ограничения в переменную: Ограничение.Текст
  4. В пользовательском режиме при создании новых профилей/групп доступа (с ограничениями) – обязательно нужно учитывать, чтобы не добавить типовую роль, на которой отключен RLS (отсутствуют шаблоны ограничений). В следующих статьях я подробно опишу об ограничениях типового RLS.
  5. Запустить конфигурацию с параметром: «/c обновление информационной базы» или запустить обработку – «Инструменты разработчика. Обновление Вспомогательных Данных» (можно скачать на сайте ИТС).
  6. В пользовательском режиме удалить запись из регистра сведений «Параметры ограничений доступа» (через возможности – «Еще»). В «НСИ и администрирование» — «Настройки пользователей и прав» — «Ограничение доступа на уровне записей», запустить процедуру обновления доступа на уровне записей. При выполнения данной процедуры будут появляться ошибки, если они есть в ограничениях доступа объектов.

Для добавление нового ограничения доступа на нетиповой объект, нужно выполнить также действия из пункта «Объект должен учитывать типовое ограничение доступа».

 

Реальная задача: добавить новое ограничение: «Группы финансового учета расчетов» для документа: «Реализация товаров и услуг».

  1. Добавить новое ограничение «Группы финансового учета расчетов» в два определяемых типа:

— ЗначениеДоступа;

— ЗначениеДоступаОбъект.

  1. В общий модуль «УправлениеДоступомУТ» в процедуру «ПриЗаполненииВидовДоступа» добавим следующий код:
  ВидДоступа = ВидыДоступа.Добавить();
  
  ВидДоступа.Имя = "ГруппыФинансовогоУчетаРасчетов";
  
  ВидДоступа.Представление = НСтр("ru = 'Группы финансового учета расчетов'");
  
  ВидДоступа.ТипЗначений   = Тип("СправочникСсылка.ГруппыФинансовогоУчетаРасчетов");
  1.  В общий модуль «УправлениеДоступомПереопределяемый» в процедуру «ПриЗаполненииВидовОграниченийПравОбъектовМетаданных» добавим следующий код в конец запроса:
  |Документ.РеализацияТоваровУслуг.Чтение.ГруппыФинансовогоУчетаРасчетов
  
  |Документ.РеализацияТоваровУслуг.Изменение.ГруппыФинансовогоУчетаРасчетов
  1. В модуле менеджера документа «Реализация товаров и услуг» в процедуру «ПриЗаполненииОграниченияДоступа» внесем следующий код:
        Ограничение.Текст =
  
        "РазрешитьЧтениеИзменение
  
        |ГДЕ
  
        |           ЗначениеРазрешено(Организация)
  
        |           И ЗначениеРазрешено(Склад)
  
        |           И ЗначениеРазрешено(Подразделение)
  
        |           И ЗначениеРазрешено(Партнер)
  
        |           И ЗначениеРазрешено(ГруппаФинансовогоУчета)";
  1. Создаем новый профиль/группу доступа – «Реализация товаров и услуг» добавляем туда роли для документа «Реализация товаров и услуг» или выбираем уже существующий и туда добавляем роли (ограничение по группа финансового учета расчетов) (см. рисунок 3).

Рисунок 3 – Отображение нового вида доступа: Группы финансового учета расчетов.

 

  1. Добавляем в группу доступа пользователей, обязательно проверяем – чтобы не были даны права на документ – «Реализация товаров и услуг» без RLS (т.к. в типовых ролях может отсутствовать RLS (шаблоны ограничений доступа)).
  2. Запустить обработку – «Инструменты разработчика. Обновление Вспомогательных Данных», выбрать все пункты (можно скачать на сайте ИТС).
  3. В пользовательском режиме удалить запись из регистра сведений «Параметры ограничений доступа» (через возможности – «Еще»). В «НСИ и администрирование» — «Настройки пользователей и прав» — «Ограничение доступа на уровне записей», запустить процедуру обновления доступа на уровне записей. При выполнения данной процедуры будут появляться ошибки, если они есть в ограничениях доступа документа «Перемещение товаров».

 

Объект должен учитывать ограничение доступа через другой объект

Чтобы учитывалось ограничение доступа через другой объект в исходном объекте, достаточно в модуле менеджера объекта в процедуре «ПриЗаполненииОграниченияДоступа» добавить следующую конструкцию в переменную Ограничение.Текст:

  Ограничение.Текст =
  
  "ПрисоединитьДополнительныеТаблицы
  
  |ЭтотСписок КАК Т //Исходный объект с его реквизитами
  
  |ЛЕВОЕ СОЕДИНЕНИЕ ХХХ КАК Т2 //присоединяем другие объекты
  
  |           ПО Т2.хх = Т.ххх //можем использовать необходимые поля в соединениях
  
  |……….. //может быть несколько соединений
  
  |;
  
  |РазрешитьЧтениеИзменение
  
  |ГДЕ
  
  |ЗначениеРазрешено(Т.ххх) //ограничение из основного объекта
  
  |И ЗначениеРазрешено(Т2.ххх)//ограничение через реквизиты другого объекта";

В пользовательском режиме при создании новых профилей/групп доступа (с учетом нужного ограничения) – обязательно нужно учитывать, чтобы не добавить типовую роль, на которой отключен RLS (отсутствуют шаблоны ограничений). В следующих статьях я подробно опишу об ограничениях типового RLS.

 

Реальная задача: добавить новое ограничение «Группы финансового учета расчетов» из объекта «Договоры контрагента» для документа «Заказ клиента»

Добавим в модуле менеджера документа «Заказ клиента» в процедуру «ПриЗаполненииОграниченияДоступа» следующий код:        

      Ограничение.Текст =
  
              "ПрисоединитьДополнительныеТаблицы
  
              |ЭтотСписок КАК Т
  
              |ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК Т2
  
              |           ПО Т2.Ссылка = Т.Договор
  
              |;
  
              |РазрешитьЧтениеИзменение
  
              |ГДЕ
  
              |           ЗначениеРазрешено(Т.Организация)
  
              |           И ЗначениеРазрешено(Т.Склад)
  
              |           И ЗначениеРазрешено(Т.Партнер)
  
              |           И ЗначениеРазрешено(Т.Подразделение)
  
              |           И ЗначениеРазрешено(Т2.ГруппаФинансовогоУчета)";

Создаем новый профиль/группу доступа – «Заказ клиента» добавляем туда роли для документа «Заказ клиента» или выбираем уже существующий и туда добавляем роли (ограничение по группам финансового учет расчетов).

Добавляем в группу доступа пользователей, обязательно проверяем – чтобы не были даны права на документ – «Заказ клиента» без RLS (т.к. в типовых ролях может отсутствовать RLS (шаблоны ограничений доступа).

 

Тестирование описанных доработок проводил на конфигурации: 1С:ERP. Управление холдингом (3.1.4.31).  Но это применимо и для всех остальных конфигураций, которые поддерживают производительный RLS.

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