Доработка прав доступа УТ 10.3
Обратился клиент-программист из регионов за профессиональной помощью. У них небольшой бюджет, работы оплачивают по факту, поэтому стараюсь работать максимально продуктивно, чтобы не разорять.
Постановка задачи:
Для контроля изменения проведенных документов я использовал стандартный ПВХ «Права пользователей»:
Добавил специальное новое правило. Использую код ПЭ, чтобы не конфликтовали номера:
Для контроля доступа к складам решил добавить новый регистр сведений — мини-регистр-правил . Это проще, чем использовать основной склад из «Значений по умолчанию» пользователя. К тому же можно указать сразу несколько складов или все.
Добавил два модуля в конфигурацию:
Привилегированный нужен, чтобы получать список доступных складов без контроля прав, иначе бы пришлось еще ковыряться с ролями. А наша цель — максимальная скорость разработки.
Вот код получения списка складов из привилегированного модуля:
Функция ДоступныеПользователюСклады() Экспорт
//Неопределено — все
//Иначе СписокЗначений
З = Новый Запрос(
«ВЫБРАТЬ
| Р.Пользователь,
| Р.Склад
|ИЗ
| Справочник.Склады КАК Склады
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.дор_ДоступныеПользователюСклады КАК Р
| ПО (Р.Пользователь = &Пользователь)
| И (Склады.Ссылка = Р.Склад
| ИЛИ Р.Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка))»);
З.УстановитьПараметр(«Пользователь», ПараметрыСеанса.ТекущийПользователь);
М = З.Выполнить().Выгрузить().ВыгрузитьКолонку(«склад»);
С = Новый СписокЗначений();
С.ЗагрузитьЗначения(М);
Возврат С;
КонецФункции
Список здесь нужен, чтобы сразу проверить, входит ли склад в список. Я сначала хотел выдавать Неопределено, если все склады доступны, но потом передумал. Это лишняя логика. И потом нельзя отличить от случая, когда ни один склад не доступен, тогда нужно было бы пустой список возвращать. Полное соединение надежнее.
Если склад для пользователя в регистре не заполнен, значит доступны все склады.
Если по пользователю записей в регистре нет, то прав доступа нет ни на один склад.
Добавил две подписки перед и при записи документа «Реализация товаров»:
Код по проверке прав доступа хоть и небольшой, но с грамотными сообщениям (я считаю информировать о причине нехватки прав must have):
Функция ЕстьПравоПользователя(ИмяПрава) Экспорт
СписокПрав = УправлениеПользователями.ПолучитьЗначениеПраваДляТекущегоПользователя(
ПланыВидовХарактеристик.ПраваПользователей[ИмяПрава],
Ложь);
Если СписокПрав.Количество() = 0 Тогда
Результат = Ложь;
ИначеЕсли СписокПрав.Количество() > 1 Тогда
Результат = Истина;
Иначе
Результат = СписокПрав[0].Значение;
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура дор_КонтрольДокументовПередЗаписьюПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если ЗначениеЗаполнено(Источник.Ссылка) Тогда
ПроверитьДоступностьСклада(Источник.Ссылка, Отказ);
ПроверитьИзменениеПроведенного(Источник.Ссылка, Отказ);
КонецЕсли;
КонецПроцедуры
Процедура дор_КонтрольДокументовПриЗаписиПриЗаписи(Источник, Отказ) Экспорт
ПроверитьДоступностьСклада(Источник, Отказ);
КонецПроцедуры
Процедура ПроверитьДоступностьСклада(Источник, Отказ) Экспорт
//Если РольДоступна(«ПолныеПрава») Тогда Возврат; КонецЕсли;
ДоступныеПользователюСклады = дор_СерверПрив.ДоступныеПользователюСклады();
ТекСклад = Источник.Склад;
Если ЗначениеЗаполнено(ТекСклад) И ДоступныеПользователюСклады.НайтиПоЗначению(ТекСклад) = Неопределено Тогда
Сообщить(«Нет прав для записи по складу: » + ТекСклад + «. Настройте регистр: Доступные пользователю склады»);
Отказ = истина;
Возврат;
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьИзменениеПроведенного(Источник, Отказ) Экспорт
//Если РольДоступна(«ПолныеПрава») Тогда Возврат; КонецЕсли;
Если Источник.Проведен И НЕ ЕстьПравоПользователя(«РазрешитьИзменятьПроведенныеДокументы») Тогда
Сообщить(«Нет прав для изменения проведенных документов. Настройте дополнительное право: Разрешить изменять проведенные документы»);
Отказ = истина;
Возврат;
КонецЕсли;
КонецПроцедуры
Кстати, всегда удивляло, что в типовой нет функции для проверки произвольного дополнительного права.
Вот что выводится при попытке провести проведенный документ:
Администратору приходится вызывать регистр через все операции, интерфейс не менял для упрощения обновлений:
Задача из области моих коронных — по правам доступа. Я считаю, что даю клиентом отменную ценность за небольшие деньги. И клиенты тоже так считают:
Время факт: 0.75 час. Среда: УТ 10.3.66.2.
Свежие комментарии