Бесплатная
консультация эксперта
Отправить заявку

Нажимая на кнопку, вы даете согласие на обработку своих персональных данных и соглашаетесь с политикой конфиденциальности.

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

Ретунский Александр Аналитик-эксперт по информационным системам франчайзинговой сети «ИнфоСофт»
01.10.2021
2421
Получить консультацию

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

Вступление

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

В данной статье не буду описывать различия и плюсы/минусы между стандартным и производительным RLS, в Интернете по этому вопросу есть много информации.

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

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

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

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

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

4) Объект должен учитывать ограничение доступа через другой объект (реальная задача: добавить новое ограничение «Группы финансового учета расчетов» из объекта «Договоры контрагента» для документа «Заказ клиента»).

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

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

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

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

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

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

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

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

2) В общей модуль «УправлениеДоступомПереопределяемый» в процедуру «ПриЗаполненииСписковСОграничениемДоступа» добавить объект (метаданные).

3) В общей модуль «УправлениеДоступомПереопределяемый» в процедуру «ПриЗаполненииВидовОграниченийПравОбъектовМетаданных» в запрос - добавить объект и вид доступа.

4) Добавить новую роль на чтение нашего объекта. Добавить права на – «Чтение», «Просмотр» объекта.

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

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

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

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

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

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

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

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

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

7) В форму объекта добавить код в начало процедуры ПриЧтенииНаСервере:

// СтандартныеПодсистемы.УправлениеДоступом

Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда

МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");

МодульУправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);

КонецЕсли;

// Конец СтандартныеПодсистемы.УправлениеДоступом

8)      В форму объекта добавить код в конец процедуры ПослеЗаписиНаСервере:

// СтандартныеПодсистемы.УправлениеДоступом

УправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);

// Конец СтандартныеПодсистемы.УправлениеДоступом

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

10) Запустить конфигурацию с параметром: «/c обновление информационной базы» или запустить обработку – «Инструменты разработчика. Обновление Вспомогательных Данных» (можно скачать на сайте ИТС).

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

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

1. Добавим документ «Реестр платежей» в определяемый тип: ВладелецЗначенийКлючейДоступа

2. Добавим документ «Реестр платежей» в определяемый тип: ВладелецЗначенийКлючейДоступаДокумент

3. В общей модуль «УправлениеДоступомПереопределяемый» в конец процедуры «ПриЗаполненииСписковСОграничениемДоступа» добавил код:

Списки.Вставить(Метаданные.Документы.РеестрПлатежей, Истина);

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

|Документ.РеестрПлатежей.Чтение.Организации

|Документ.РеестрПлатежей.Изменение.Организации

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

1.png

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

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

2.png

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

7. Добавим в модуль менеджера документа «Реестр платежей» следующий код:

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

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

           Ограничение.Текст =

           "РазрешитьЧтениеИзменение

           |ГДЕ

           |           ЗначениеРазрешено(Организация";

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

#КонецОбласти

8. В форме документа «Реестр Платежей» добавим в начало процедуры ПриЧтенииНаСервере, следующий код:

// СтандартныеПодсистемы.УправлениеДоступом

Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда

МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");

МодульУправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);

КонецЕсли;

// Конец СтандартныеПодсистемы.УправлениеДоступом

9. В форме документа «Реестр Платежей» добавим в конец процедуры ПослеЗаписиНаСервере, следующий код:

// СтандартныеПодсистемы.УправлениеДоступом

УправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);

// Конец СтандартныеПодсистемы.УправлениеДоступом

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

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

12) Запустим обработку – «Инструменты разработчика. Обновление Вспомогательных Данных», выполним все пункты (можно скачать на сайте ИТС).

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

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

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

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

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

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

            Ограничение.Текст =

            "РазрешитьЧтениеИзменение

            |ГДЕ

            |           (ЗначениеРазрешено(Организация)

            |           ИЛИ ЗначениеРазрешено(ОрганизацияПолучатель))

            |           И( ЗначениеРазрешено(СкладОтправитель)

            |           ИЛИ ЗначениеРазрешено(СкладПолучатель)

            |           ) ";

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

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

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

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

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

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

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

2. В общей модуль «УправлениеДоступомУТ» в процедуру «ПриЗаполненииВидовДоступа» добавить данные о новом виде доступа.

3. В общей модуль «УправлениеДоступомПереопределяемый» в процедуру «ПриЗаполненииВидовОграниченийПравОбъектовМетаданных» добавить в запросе - данные о новом виде доступа в объекте.

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

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

6. Запустить конфигурацию с параметром: «/c обновление информационной базы» или запустить обработку – «Инструменты разработчика. Обновление Вспомогательных Данных» (можно скачать на сайте ИТС).

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

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

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

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

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

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

2. В общей модуль «УправлениеДоступомУТ» в процедуру «ПриЗаполненииВидовДоступа» добавим следующий код:

ВидДоступа = ВидыДоступа.Добавить();

ВидДоступа.Имя = "ГруппыФинансовогоУчетаРасчетов";

ВидДоступа.Представление = НСтр("ru = 'Группы финансового учета расчетов'");

ВидДоступа.ТипЗначений   = Тип("СправочникСсылка.ГруппыФинансовогоУчетаРасчетов");

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

|Документ.РеализацияТоваровУслуг.Чтение.ГруппыФинансовогоУчетаРасчетов

|Документ.РеализацияТоваровУслуг.Изменение.ГруппыФинансовогоУчетаРасчетов

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

      Ограничение.Текст =

      "РазрешитьЧтениеИзменение

      |ГДЕ

      |           ЗначениеРазрешено(Организация)

      |           И ЗначениеРазрешено(Склад)

      |           И ЗначениеРазрешено(Подразделение)

      |           И ЗначениеРазрешено(Партнер)

      |           И ЗначениеРазрешено(ГруппаФинансовогоУчета)";

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

3.png

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

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

7. Запустить обработку – «Инструменты разработчика. Обновление Вспомогательных Данных», выбрать все пункты (можно скачать на сайте ИТС).

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

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

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

Ограничение.Текст =

"ПрисоединитьДополнительныеТаблицы

|ЭтотСписок КАК Т //Исходный объект с его реквизитами

|ЛЕВОЕ СОЕДИНЕНИЕ ХХХ КАК Т2 //присоединяем другие объекты

|           ПО Т2.хх = Т.ххх //можем использовать необходимые поля в соединениях

|……….. //может быть несколько соединений

|;

|РазрешитьЧтениеИзменение

|ГДЕ

|ЗначениеРазрешено(Т.ххх) //ограничение из основного объекта

|И ЗначениеРазрешено(Т2.ххх)//ограничение через реквизиты другого объекта";

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

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

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

            Ограничение.Текст =

            "ПрисоединитьДополнительныеТаблицы

            |ЭтотСписок КАК Т

            |ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК Т2

            |           ПО Т2.Ссылка = Т.Договор

            |;

            |РазрешитьЧтениеИзменение

            |ГДЕ

            |           ЗначениеРазрешено(Т.Организация)

            |           И ЗначениеРазрешено(Т.Склад)

            |           И ЗначениеРазрешено(Т.Партнер)

            |           И ЗначениеРазрешено(Т.Подразделение)

            |           И ЗначениеРазрешено(Т2.ГруппаФинансовогоУчета)";

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

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

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

 


Статью подготовил аналитик-эксперт по информационным системам франчайзинговой сети «ИнфоСофт» Ретунский Александр.


Рассказать друзьям
Для разработчиков 1С
Бесплатная консультация эксперта
Оставьте заявку и наши эксперты проконсультируют по любому вопросу.
Заказать звонок

Нажимая на кнопку, вы даете согласие на обработку своих персональных данных и соглашаетесь с политикой конфиденциальности.

Комментарии
1  комментарев

Ваше имя*:
Комментарий*:
Вам может быть интересно: