Часть 3. Концепция ограничения доступа к дополнительным (внешним) обработкам (Настраиваем права доступа в 1С Университет ПРОФ)

Оглавление:
Часть 1. Базовые права
Часть 2. Ограничение доступа к справочникам
Часть 3. Концепция ограничения доступа к дополнительным (внешним) обработкам

Исходя из первых двух частей статьи, может возникнуть вопрос: а как ограничить доступ к внешним обработкам? Например, выгрузку в ФИС, которую зачастую подключают как дополнительную внешнюю обработку и которую получается может открыть любой пользователь (у которого есть права на приемные кампании).
Так вот, используя способ 2, описанный во второй части статьи, можно ограничивать доступ к внешним обработкам, включая часть проверочного кода в код открытия их форм (предварительно добавив наименование обработки в справочник метаданных и назначив права на него).
Рассмотрим механизм на примере выгрузки заявлений в ФИС.
Первоначально добавляем объект "ВнешняяОбработка.ВыгрузкаЗаявленийАбитуриентовВФИС" в справочник "Объектов метаданных":


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


Далее в конфигураторе в код формы обработки в блок "ПриОткрытии" вставляем строку:

Отказ = ПроверитьПравоНаОткрытиеОбработки();

(расположение строки может меняться в зависимости от типа обработки, в некоторых случаях можно вставить ее сразу в начале процедуры "ПриОткрытии")

Также добавляем две функции в модуль формы: ПроверитьПравоНаОткрытие() и ПроверитьПравоНаОткрытиеОбработки(). Вот их код:

&НаСервере
Функция ПроверитьПравоНаОткрытие()
    Если ВспомогательныеФункции.ТекущийПользовательСРольюПолныеПрава() Тогда
        Возврат Ложь;
    КонецЕсли;
    ИмяОбъекта = РеквизитФормыВЗначение("Объект").Метаданные().ПолноеИмя();
    РазрешитьОткрытие = ИСТИНА;

    // проверяем, есть ли хотя бы одна ссылка на объект права
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                    |   Истина
                    |ИЗ
                    |   РегистрСведений.Роли КАК Роли
                    |ГДЕ
                    |   Роли.Объект.Наименование = &Объект";
   
    Запрос.УстановитьПараметр("Объект", ИмяОбъекта);
    ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать();             
   
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        РазрешитьОткрытие = ЛОЖЬ; //запрещаем, т.к. есть хотя бы одна запись с таким правом
        Прервать;
    КонецЦикла;
       
    Если РазрешитьОткрытие = ЛОЖЬ Тогда
        // проверяем, есть ли права на чтение обработки у текущего пользователя
        ЗапросПользователя = Новый Запрос;
        ЗапросПользователя.Текст = "ВЫБРАТЬ
                        |   Истина
                        |ИЗ
                        |   РегистрСведений.Роли КАК Роли
                        |ГДЕ
                        |   Роли.Объект.Наименование = &Объект
                        |   И Роли.ЗначениеПрава = ИСТИНА
                        |   И Роли.Право = ЗНАЧЕНИЕ(Справочник.Права.Чтение)
                        |   И (Роли.Пользователь = &ТекущийПользователь
                        |   ИЛИ Роли.Пользователь В (ВЫБРАТЬ Ссылка
                        |       ИЗ                   
                        |       Справочник.ГруппыПользователей.Состав
                        |       ГДЕ
                        |       Пользователь = &ТекущийПользователь))";
       
        ЗапросПользователя.УстановитьПараметр("Объект", ИмяОбъекта);
        ЗапросПользователя.УстановитьПараметр("ТекущийПользователь", ПараметрыСеанса.ТекущийПользователь);
        ВыборкаДетальныеЗаписиЗапросПользователя = ЗапросПользователя.Выполнить().Выбрать();             
       
        Пока ВыборкаДетальныеЗаписиЗапросПользователя.Следующий() Цикл
            РазрешитьОткрытие = ИСТИНА;
            // разрешаем, т.к. есть хотя бы одна запись с назначением
            // права чтения текущего объекта текущему пользователю
            Прервать;
        КонецЦикла;
   
    КонецЕсли;
    Возврат НЕ РазрешитьОткрытие;
КонецФункции

&НаКлиенте
Функция ПроверитьПравоНаОткрытиеОбработки()
    // проверяет, не ограничено ли право доступа к обработке
    // через администрирование прав объектов метаданных    
    ОграничитьПрава = ПроверитьПравоНаОткрытие();
    Если ОграничитьПрава Тогда
        Предупреждение("Недостаточно прав для открытия элемента. Обратитесь к администратору.", 0, "Внимание!");     
    КонецЕсли;    
    Возврат ОграничитьПрава;

КонецФункции

Для выгрузки в ФИС это может выглядеть примерно так:


Теперь, кроме администратора и пользователя с полными правами, никто не сможет открыть эту обработку, загруженную в справочник дополнительных обработок, и получит сообщение об ошибке:


Как уже было сказано ранее (в части 2 статьи), чтобы открыть доступ к данной обработке, даем на нее право пользователю или группе пользователей:


В данном примере, все пользователи, входящие в группу Секретари ПК, смогут открывать эту обработку.

PS: если есть идеи по оптимизации кода/запросов и т.п., пожалуйста, пишите в комментариях.

(с) Ella S.
Если Вам понравилась статья, пожалуйста, поставьте лайк, сделайте репост или оставьте комментарий. Если у Вас есть какие-либо замечания, также пишите комментарии.

Комментариев нет :

Отправить комментарий