Статус: Advanced Member
Сообщений: 184
Сказала «Спасибо»: 3 раз Поблагодарили: 47 раз в 35 постах
|
Если Вы уже меняли конфигурацию в связи с расширенной настройкой прав по этой инструкции (по способу 2) - то можно использовать тот же метод, описанный в инструкции. А именно: 1) Добавляем новую подписку на запись приказов со ссылкой на обработчик (код обработчика ниже). Скрин: prikaz-podpiska.png (21kb) загружен 4 раз(а). 2) Корректируем код обработчика п_ОбработкаСобытийОграниченияДоступа (общий модуль, который был создан по вышеназванной инструкции, либо создайте его). Полный код обработки с учетом обработчка приказов: Код:
// Обработчик события "ПередЗаписью" подписки на события
Процедура ПередЗаписьюОбъектовПроверкаПрав(Источник, Отказ) Экспорт
Если ВспомогательныеФункции.ТекущийПользовательСРольюПолныеПрава() Тогда
Возврат;
КонецЕсли;
//Отказ = Истина;
ИмяОбъекта = Источник.Метаданные().ПолноеИмя();
РазрешитьРедактирование = ИСТИНА;
// проверяем, есть ли хотя бы одна ссылка на объект права
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Истина
|ИЗ
| РегистрСведений.Роли КАК Роли
|ГДЕ
| Роли.Объект.Наименование = &Объект";
Запрос.УстановитьПараметр("Объект", ИмяОбъекта);
ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
РазрешитьРедактирование = ЛОЖЬ; //запрещаем, т.к. есть хотя бы одна запись с таким правом
Прервать;
КонецЦикла;
Если НЕ РазрешитьРедактирование Тогда
// проверяем, есть ли права на редактирование у текущего пользователя
РазрешитьРедактирование = ПроверкаНаличияПраваНаОбъектПрава(ИмяОбъекта);
КонецЕсли;
Если НЕ РазрешитьРедактирование Тогда
ВывестиСообщение(ИмяОбъекта);
КонецЕсли;
Отказ = НЕ РазрешитьРедактирование;
КонецПроцедуры
Процедура ПередЗаписьюРегистраСведенийПроверкаПрав(Источник, Отказ, Замещение) Экспорт
// проверка прав на запись в регистр сведений (объект РегистрСведений.<НазваниеРегистра>)
// ссылка на основную процедуру
ПередЗаписьюОбъектовПроверкаПрав(Источник, Отказ);
КонецПроцедуры
// Обработчик события "ПередЗаписью" подписки на события приказа (проведение / отмена проведения)
Процедура ПередЗаписьюОбъектовПроверкаПравНаПриказ(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// проверка только, если это проведение / отмена проведения
Если РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения
ИЛИ РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Если ВспомогательныеФункции.ТекущийПользовательСРольюПолныеПрава() Тогда
Возврат;
КонецЕсли;
РазрешитьРедактирование = Ложь;
ИмяОбъекта = "Приказы.ВсеВидыДоступны";
РазрешитьРедактирование = ПроверкаНаличияПраваНаОбъектПрава(ИмяОбъекта);
Если Не РазрешитьРедактирование Тогда
// проверяем, есть ли права у текущего пользователя на проведение каждого вида приказа,
// входящего в приказ (если их несколько)
Для Каждого ТекущийПриказ Из Источник.СписокПриказов Цикл
ИмяОбъекта = "Приказы.ВидПриказа_" + ТекущийПриказ.ВидПриказа.Код;
РазрешитьРедактирование = ПроверкаНаличияПраваНаОбъектПрава(ИмяОбъекта);
Если Не РазрешитьРедактирование Тогда
// запрет на проведение всего приказа,
// если нет права хотя бы на один вид приказа внутри него
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если НЕ РазрешитьРедактирование Тогда
ВывестиСообщение(ИмяОбъекта);
КонецЕсли;
Отказ = НЕ РазрешитьРедактирование;
КонецЕсли;
КонецПроцедуры
Функция ПроверкаНаличияПраваНаОбъектПрава(ИмяОбъектПрава)
ЕстьПраво = Ложь;
ЗапросПользователя = Новый Запрос;
ЗапросПользователя.Текст = "ВЫБРАТЬ
| Истина
|ИЗ
| РегистрСведений.Роли КАК Роли
|ГДЕ
| Роли.Объект.Наименование = &Объект
| И Роли.ЗначениеПрава = ИСТИНА
| И (Роли.Право = ЗНАЧЕНИЕ(Справочник.Права.Добавление)
| ИЛИ Роли.Право = ЗНАЧЕНИЕ(Справочник.Права.Изменение))
| И (Роли.Пользователь = &ТекущийПользователь
| ИЛИ Роли.Пользователь В (ВЫБРАТЬ Ссылка
| ИЗ
| Справочник.ГруппыПользователей.Состав
| ГДЕ
| Пользователь = &ТекущийПользователь))";
ЗапросПользователя.УстановитьПараметр("Объект", ИмяОбъектПрава);
ЗапросПользователя.УстановитьПараметр("ТекущийПользователь", ПараметрыСеанса.ТекущийПользователь);
ВыборкаДетальныеЗаписиЗапросПользователя = ЗапросПользователя.Выполнить().Выбрать();
Пока ВыборкаДетальныеЗаписиЗапросПользователя.Следующий() Цикл
ЕстьПраво = ИСТИНА;
// разрешаем, т.к. есть хотя бы одна запись с назначением
// права редактирования текущего объекта текущему пользователю
Прервать;
КонецЦикла;
Возврат ЕстьПраво;
КонецФункции
Процедура ВывестиСообщение(ИмяОбъекта)
// сообщение пользователю об отсутствии прав
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Недостаточно прав для сохранения элемента. Обратитесь к администратору. Объект: " + ИмяОбъекта);
КонецПроцедуры
Если у пользователя не будет предоставлено право на все приказы или конкретный вид приказа, ему при проведении / отмене проведения будет выдано сообщение: Недостаточно прав для сохранения элемента. Обратитесь к администратору. Объект: Приказы.ВидПриказа_000000018 (код зависит от вида проводимого приказа). Скриншот примера: prikaz-error.png (53kb) загружен 2 раз(а).Преимущества этого метода: 1) Работает как на проведение, так и на отмену проведения. 2) Если убрать следующее условие, то ограничение будет работать и на запись/создание приказа, а не только проведение: Код:Если РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения
ИЛИ РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
3) Работает для всех приказов (не нужно, как в предыдущем способе добавлять обработку в каждый вид приказа)
|