Образовательный форум по автоматизации и взаимодействии с федеральными системами
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Ella  
#1 Оставлено : 13 марта 2019 г. 13:31:14(UTC)
Ella

Статус: Advanced Member

Группы: Registered
Зарегистрирован: 28.07.2018(UTC)
Сообщений: 153

Сказала «Спасибо»: 3 раз
Поблагодарили: 27 раз в 25 постах
Поднимаю вопрос пока в качестве идеи.
Доступ у нас настроен так. Т.е. все пользователи на уровне роли "Пользователь" имеют право создавать/проводить приказы (ограничение установлено на уровне "Администрирование прав объектов"). Однако данное ограничение либо позволяет создавать/сохранять приказ, либо не позволяет (независимо от вида).

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

Задача: сделать так, что определенные пользователи могли создавать/проводить только определенный вид приказа.

Пока у меня только одна идея, как это сделать без редактирования конфигурации:
Ограничить возможность проведения по видам приказов при помощи добавления проверки права в обработку проведения приказа (которая задается в настройках вида приказа). Т.е. создание приказа это не запретит, но провести пользователь сможет только доступный ему вид приказа.

Пока идея в виде концепции, но, если получится что-то из этого сделать, напишу.
Также может у кого будут другие идеи, прошу тоже написать.
Offline Ella  
#2 Оставлено : 9 января 2020 г. 16:33:54(UTC)
Ella

Статус: Advanced Member

Группы: Registered
Зарегистрирован: 28.07.2018(UTC)
Сообщений: 153

Сказала «Спасибо»: 3 раз
Поблагодарили: 27 раз в 25 постах
Много времени прошло, но наконец руки дошли сделать это, т.к. для реализации идеи электронных зачетных книжек нам понадобилось, чтобы определенные сотрудники (например, деканаты) могли проводить приказы на утверждение тем курсовых работ и практику, а вот другие виды приказов проводить не могли.

Постараюсь в нескольких постах описать способ реализации функционала по разграничению прав доступа по видам приказов:

Пока такие мысли по данному вопросу. Забегая вперед, скажу, что сама реализовала это через подписку на событие (т.е. слегка дополнила конфигурацию), но опишу и метод без изменения конфигурации, если кому нужно.

Повторюсь, что доступ у нас настроен с помощью функционала - "Администрирование прав объектов" (подробнее об этом тут). Решено использовать этот же функционал для разграничения доступа по видам приказов.

Для этого в справочник "Объекты метаданных" добавляем следующие элементы (их названия не принципиальны, главное, чтобы обработчик их понимал):
Приказы.ВсеВидыДоступны - назначается на группы или пользователей, которым доступны все виды приказов.
Приказы.ВидПриказа_<КодВидаПриказа> (например, "Приказы.ВидПриказа_000000024", код 24 - это приказ на утверждение тем работ) - создается на каждый вид приказа, к которому необходимо настроить отдельный доступ каким либо группам/пользователям.

Скриншот примера результата:
metadannye.png (70kb) загружен 3 раз(а).



Offline Ella  
#3 Оставлено : 9 января 2020 г. 18:56:09(UTC)
Ella

Статус: Advanced Member

Группы: Registered
Зарегистрирован: 28.07.2018(UTC)
Сообщений: 153

Сказала «Спасибо»: 3 раз
Поблагодарили: 27 раз в 25 постах
Допустим, справочник пользователей организован таким образом:

users.png (56kb) загружен 1 раз(а).

Сотрудникам отдела кадров студентов нужно дать полный доступ ко всем видам приказов, независимо от того, кто создал приказ.
А сотрудникам факультетов и приемной комиссии нужно дать возможность создавать и редактировать только свои приказы (свои в рамках группы пользователей, например, сотрудники факультета ЕГФ могут редактировать только приказы сотрудников ЕГФ), а также дать возможность проводить только конкретные виды приказов (естественно тоже только "свои").
Т.е. мы намеренно оставляем возможность деканатам создавать любые виды приказов, например, для подготовки проектов приказов для отдела кадров студентов, но ограничив проведение (если что, это можно скорректировать при использовании метода с подпиской на события и сделать ограничение даже на создание).
В нашем случае мы решим задачу по делегированию создания приказов на практику и утверждению тем курсовых работ и ВКР сотрудникам деканатов.
Offline Ella  
#4 Оставлено : 10 января 2020 г. 11:31:40(UTC)
Ella

Статус: Advanced Member

Группы: Registered
Зарегистрирован: 28.07.2018(UTC)
Сообщений: 153

Сказала «Спасибо»: 3 раз
Поблагодарили: 27 раз в 25 постах
Пример настройки Администрирования прав объектов для группы сотрудников отдела кадров студентов (разрешаем все приказы):

prava-1.png (75kb) загружен 1 раз(а).

Пример настройки Администрирования прав объектов для группы "Факультеты" (разрешаем видеть все приказы):

prava-2.png (45kb) загружен 2 раз(а).

Пример настройки Администрирования прав объектов для группы сотрудников деканатов по каждому факультету (разрешаем создавать приказы в рамках группы, а также проводить конкретные виды приказов):

prava-3.png (32kb) загружен 1 раз(а).

Настройку сделали, теперь нужно добавить обработчик, который будет запрещать проведение приказов, если у пользователя нет права на определенный вид приказа.

Тут можно применить несколько вариантов. Опишу пару таких вариантов.

Отредактировано пользователем 10 января 2020 г. 11:33:27(UTC)  | Причина: Не указана

Offline Ella  
#5 Оставлено : 10 января 2020 г. 11:47:25(UTC)
Ella

Статус: Advanced Member

Группы: Registered
Зарегистрирован: 28.07.2018(UTC)
Сообщений: 153

Сказала «Спасибо»: 3 раз
Поблагодарили: 27 раз в 25 постах
Вариант 1
Использовать справочник Обработки проведения приказов (не требует изменения конфигурации). Обработки задаются в настройках видов приказов (см. вебинар по приказам).

Примечание:
Цитата:
Каждая обработка, заданная в приказе, включая допобработку, выполняется для каждой строки в табличной части приказа. Если нужно выполнить один раз, то устанавливаем параметр "Выполнять для запроса" (в типовой конфигурации этот параметр не работает для допобработок, поэтому временно обработку можно назначить в строку с любым регистром. В будущих версиях разработчики возможно эту ситуацию исправят, тогда можно будет перенести в допобработки).
Допобработка не вызывается при отмене проведения приказа. Т.е. пользователь сможет отменить проведение любого вида приказа, но здесь должно отработать ограничение на уровне настройки прав "Администрирование прав объектов", где должно быть настроено, что пользователь может изменять только свои приказы (приказы своей группы пользователей).


Недостаток такого метода - необходимо добавить данную обработку во все виды приказов (т.к. нельзя добавлять несколько допобработок в один вид приказа, то нужно придумать как вызвать нужную нам обработку в случае, если у приказа уже назначена какая-либо допобработка).
Offline Ella  
#6 Оставлено : 10 января 2020 г. 11:51:13(UTC)
Ella

Статус: Advanced Member

Группы: Registered
Зарегистрирован: 28.07.2018(UTC)
Сообщений: 153

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

	РазрешитьРедактирование = Ложь;
	ИмяОбъекта = "Приказы.ВсеВидыДоступны";

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

	Пока ВыборкаДетальныеЗаписиЗапросПользователя.Следующий() Цикл
		РазрешитьРедактирование = ИСТИНА; 
		// разрешаем, т.к. есть хотя бы одна запись с назначением 
		// права редактирования текущего объекта текущему пользователю
		Прервать;
	КонецЦикла; 
			
	Если Не РазрешитьРедактирование Тогда
		// проверяем, есть ли права у текущего пользователя на проведение каждого вида приказа,
		// входящего в приказ (если их несколько)
		Для Каждого ТекущийПриказ Из ЭтотОбъект.СписокПриказов Цикл
			ИмяОбъекта = "Приказы.ВидПриказа_" + ТекущийПриказ.ВидПриказа.Код;  
			ЗапросПользователя = Новый Запрос;
			ЗапросПользователя.Текст = ТекстЗапроса;
			ЗапросПользователя.УстановитьПараметр("Объект", ИмяОбъекта);
			ЗапросПользователя.УстановитьПараметр("ТекущийПользователь", ПараметрыСеанса.ТекущийПользователь);
			ВыборкаДетальныеЗаписиЗапросПользователя = ЗапросПользователя.Выполнить().Выбрать();     
			Пока ВыборкаДетальныеЗаписиЗапросПользователя.Следующий() Цикл
				РазрешитьРедактирование = ИСТИНА; 
				Прервать;
			КонецЦикла; 
			Если Не РазрешитьРедактирование Тогда
				// запрет на проведение всего приказа, 
				// если нет права хотя бы на один вид приказа внутри него   				
				Прервать;
			КонецЕсли;			
		КонецЦикла;		
	КонецЕсли;

	Если НЕ РазрешитьРедактирование Тогда
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Недостаточно прав для сохранения элемента. Обратитесь к администратору. Объект: " + ИмяОбъекта);
	КонецЕсли;
	Отказ = НЕ РазрешитьРедактирование;
КонецЕсли;


Скрин примера:

screen-check.png (93kb) загружен 1 раз(а).

Если нужно сделать совсем без доработки конфигурации, то можно использовать метод, описанный выше.
Offline Ella  
#7 Оставлено : 12 января 2020 г. 17:36:44(UTC)
Ella

Статус: Advanced Member

Группы: Registered
Зарегистрирован: 28.07.2018(UTC)
Сообщений: 153

Сказала «Спасибо»: 3 раз
Поблагодарили: 27 раз в 25 постах
Если Вы уже меняли конфигурацию в связи с расширенной настройкой прав по этой инструкции (по способу 2) - то можно использовать тот же метод, описанный в инструкции.
А именно:
1) Добавляем новую подписку на запись приказов со ссылкой на обработчик (код обработчика ниже). Скрин:

prikaz-podpiska.png (21kb) загружен 1 раз(а).

2) Корректируем код обработчика п_ОбработкаСобытийОграниченияДоступа (общий модуль, который был создан по вышеназванной инструкции, либо создайте его).

Полный код обработки с учетом обработчка приказов:

Код:

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

Процедура ПередЗаписьюРегистраСведенийПроверкаПрав(Источник, Отказ, Замещение) Экспорт
    // проверка прав на запись в регистр сведений (объект РегистрСведений.<НазваниеРегистра>)
    // ссылка на основную процедуру
    ПередЗаписьюОбъектовПроверкаПрав(Источник, Отказ);
КонецПроцедуры

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

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

Процедура ВывестиСообщение(ИмяОбъекта)
    // сообщение пользователю об отсутствии прав    
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Недостаточно прав для сохранения элемента. Обратитесь к администратору. Объект: " + ИмяОбъекта);
КонецПроцедуры


Если у пользователя не будет предоставлено право на все приказы или конкретный вид приказа, ему при проведении / отмене проведения будет выдано сообщение: Недостаточно прав для сохранения элемента. Обратитесь к администратору. Объект: Приказы.ВидПриказа_000000018 (код зависит от вида проводимого приказа).

Скриншот примера:

prikaz-error.png (53kb) загружен 0 раз(а).

Преимущества этого метода:
1) Работает как на проведение, так и на отмену проведения.
2) Если убрать следующее условие, то ограничение будет работать и на запись/создание приказа, а не только проведение:
Код:
Если РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения 
		ИЛИ РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда

3) Работает для всех приказов (не нужно, как в предыдущем способе добавлять обработку в каждый вид приказа)

Offline Ella  
#8 Оставлено : 12 января 2020 г. 17:39:04(UTC)
Ella

Статус: Advanced Member

Группы: Registered
Зарегистрирован: 28.07.2018(UTC)
Сообщений: 153

Сказала «Спасибо»: 3 раз
Поблагодарили: 27 раз в 25 постах
Допонительно: пример предоставления группе пользователей приемной комиссии права только на приказы "Зачисление в вуз" (код 5) и "Отчисление (приемная комиссия)" (код 27):

prava-PK.png (96kb) загружен 2 раз(а).
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.