Доработка прав доступа УТ 10.3

Обратился клиент-программист из регионов за профессиональной помощью. У них небольшой бюджет, работы оплачивают по факту, поэтому стараюсь работать максимально продуктивно, чтобы не разорять.

Постановка задачи:

Для контроля изменения проведенных документов я использовал стандартный ПВХ «Права пользователей»:

Добавил специальное новое правило. Использую код ПЭ, чтобы не конфликтовали номера:

Для контроля доступа к складам решил добавить новый регистр сведений — мини-регистр-правил . Это проще, чем использовать основной склад из «Значений по умолчанию» пользователя. К тому же можно указать сразу несколько складов или все.

Добавил два модуля в конфигурацию:

Привилегированный нужен, чтобы получать список доступных складов без контроля прав, иначе бы пришлось еще ковыряться с ролями. А наша цель — максимальная скорость разработки.

Вот код получения списка складов из привилегированного модуля:

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

Список здесь нужен, чтобы сразу проверить, входит ли склад в список. Я сначала хотел выдавать Неопределено, если все склады доступны, но потом передумал. Это лишняя логика. И потом нельзя отличить от случая, когда ни один склад не доступен, тогда нужно было бы пустой список возвращать. Полное соединение надежнее.

Если склад для пользователя в регистре не заполнен, значит доступны все склады.

Если по пользователю записей в регистре нет, то прав доступа нет ни на один склад.

Добавил две подписки перед и при записи документа «Реализация товаров»:

Код по проверке прав доступа хоть и небольшой, но с грамотными сообщениям (я считаю информировать о причине нехватки прав must have):

Функция ЕстьПравоПользователя(ИмяПрава) Экспорт

   
СписокПрав = УправлениеПользователями.ПолучитьЗначениеПраваДляТекущегоПользователя(
       
ПланыВидовХарактеристик.ПраваПользователей[ИмяПрава],
        Ложь);

    Если
СписокПрав.Количество() = 0 Тогда
       
Результат = Ложь;
    ИначеЕсли
СписокПрав.Количество() > 1 Тогда
       
Результат = Истина;
    Иначе
       
Результат = СписокПрав[0].Значение;
    КонецЕсли;

    Возврат
Результат;

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


Процедура
дор_КонтрольДокументовПередЗаписьюПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
    Если
ЗначениеЗаполнено(Источник.Ссылка) Тогда
       
ПроверитьДоступностьСклада(Источник.Ссылка, Отказ);
       
ПроверитьИзменениеПроведенного(Источник.Ссылка, Отказ);
    КонецЕсли;
КонецПроцедуры


Процедура
дор_КонтрольДокументовПриЗаписиПриЗаписи(Источник, Отказ) Экспорт
   
ПроверитьДоступностьСклада(Источник, Отказ);
КонецПроцедуры

Процедура
ПроверитьДоступностьСклада(Источник, Отказ) Экспорт
   
//Если РольДоступна(«ПолныеПрава») Тогда Возврат; КонецЕсли;
   
ДоступныеПользователюСклады = дор_СерверПрив.ДоступныеПользователюСклады();
   
ТекСклад = Источник.Склад;
    Если
ЗначениеЗаполнено(ТекСклад) И ДоступныеПользователюСклады.НайтиПоЗначению(ТекСклад) = Неопределено Тогда
       
Сообщить(«Нет прав для записи по складу: » + ТекСклад + «. Настройте регистр: Доступные пользователю склады»);
       
Отказ = истина;
        Возврат;
    КонецЕсли;

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

Процедура
ПроверитьИзменениеПроведенного(Источник, Отказ) Экспорт
   
//Если РольДоступна(«ПолныеПрава») Тогда Возврат; КонецЕсли;
   
Если Источник.Проведен И НЕ ЕстьПравоПользователя(«РазрешитьИзменятьПроведенныеДокументы») Тогда
       
Сообщить(«Нет прав для изменения проведенных документов. Настройте дополнительное право: Разрешить изменять проведенные документы»);
       
Отказ = истина;
        Возврат;
    КонецЕсли;
КонецПроцедуры

Кстати, всегда удивляло, что в типовой нет функции для проверки произвольного дополнительного права.

Вот что выводится при попытке провести проведенный документ:

Администратору приходится вызывать регистр через все операции, интерфейс не менял для упрощения обновлений:

Задача из области моих коронных — по правам доступа. Я считаю, что даю клиентом отменную ценность за небольшие деньги. И клиенты тоже так считают:

Время факт: 0.75 час. Среда: УТ 10.3.66.2.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *