gifts2017

Настройка роли менеджера по продажам в 1С 8.2 УПП (RLS и немного кода)

Опубликовал Анатолий В. (Nucky) в раздел Программирование - Практика программирования

Требовалось настроить роль МенеджераПоПродажам, с условием, что менеджер видит только «своих» контрагентов (контрагентов, для которых он является менеджером), только документы «своих» контрагентов и в отчета цифры «своих».

Имеем справочник Контрагенты с табличной частью содержащую поля МенеджерПокупателя и Статус, для ввода менеджеров и их помощников, которые работают  с этим контрагентом. Поле Статус с типом перечисление, основной и помощник.


Перво-наперво нужно было чтобы менеджер и его помощники видели только своих контрагентов, для этого в роли МенеджерПоПродажам в правах на чтение поставил ограниченение по :

ГДЕ МенеджерыПокупателя.МенеджерПокупателя = &ТекущийПользователь
    ИЛИ ЭтоГруппа = Истина


Следующим шагом в журнале "Документы контрагентов" оставляем документы контрагетов данного менеджера. Также в роли МенеджерПоПродажам в правах на чтение поставил ограничение по :

с

ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
    ПО ТекущаяТаблица.Контрагент = Контрагенты.Ссылка
ГДЕ Контрагенты.МенеджерыПокупателя.МенеджерПокупателя = &ТекущийПользователь



После поправил отчет Продажи, чтобы не отображались продажи контрагетов для которых данный пользователь не является менеджером, сделал следующим образом:
- отчет оставил в списке справочника Контрагенты, в списке справочника Номенклатуры и в меню Отчеты.
- в модуле объекта отчета Продажи, в процедуре УстановитьНачальныеНастройки, дописал следующее:

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


вместо

  УниверсальныйОтчет.ДобавитьОтбор("Контрагент");


.
Функция ЭтоМенеджер() вызываемая из общего модуля МенеджерПоПродажам имеет следующий код:

Функция ЭтоМенеджер() Экспорт
    Возврат ПользователиИнформационнойБазы.ТекущийПользователь().Роли.Содержит(Метаданные.Роли.МенеджерПоПродажам);
КонецФункции


условились что пользователь имеющий роль МенеджерПоПродажам является менеджером, все остальные пользователи не должны иметь этой роли.

Установкой начальных настроек устанавливается отбор по контрагенту "В списке" по списку контрагентов для которых пользователь является менеджером. Чтобы пользователь не менял настройку отчета "заблокировал" кнопку "Настройка":
В процедуре КоманднаяПанельФормыНастройка(Кнопка) вызываемой этой кнопкой вставил:

 

  Если МенеджерПоПродажам.ЭтоМенеджер() Тогда
        Возврат;
    КонецЕсли;


Таким образом, если менеджер хочет получить отчет по контрагенту, он запускает отчет из списка справочника Контрагенты, если хочет получить отчет по номенклатуре - из списка справочника Номенклатура, если по всем его контрагентам и номенклатуре из меню Отчеты.

Думаю, что криво реализовал работу с отчетом, когда додумаюсь как сделать правильнее напишу.

Еще убрал "лишние" кнопки из командной панели списка справочника Контрагенты:
   

Если МенеджерПоПродажам.ЭтоМенеджер() Тогда
        КП = ЭлементыФормы.ДействияФормы;
        Мас = Новый Массив();
        Мас.Добавить(ЭлементыФормы.ДействияФормы.Кнопки.Действие6.Действие);
        Мас.Добавить(ЭлементыФормы.ДействияФормы.Кнопки.Действие8.Действие);
        Мас.Добавить(ЭлементыФормы.ДействияФормы.Кнопки.Действие9.Действие);
        Мас.Добавить(ЭлементыФормы.ДействияФормы.Кнопки.Подменю1.Действие);
        Мас.Добавить(ЭлементыФормы.ДействияФормы.Кнопки.Действие10.Действие);
        Мас.Добавить(ЭлементыФормы.ДействияФормы.Кнопки.Действие11.Действие);
        
        КП.Автозаполнение = Ложь;
        
        ДействиеОткрытиеОтбора = Новый Действие("ОткрытиеКритерияОтбора");
        ЭлементыФормы.ДействияФормы.Кнопки.Вставить(0,"Документы контрагента",ТипКнопкиКоманднойПанели.Действие,"Документы контрагента",ДействиеОткрытиеОтбора);
        ЭлементыФормы.ДействияФормы.Кнопки.Вставить(0,"Обновить",ТипКнопкиКоманднойПанели.Действие,"Обновить",Мас[5]);
        ЭлементыФормы.ДействияФормы.Кнопки.Вставить(0,"Откл.отбора",ТипКнопкиКоманднойПанели.Действие,"Откл.отбора",Мас[4]);
        ЭлементыФормы.ДействияФормы.Кнопки.Вставить(0,"Отбор по знач.",ТипКнопкиКоманднойПанели.Действие,"Отбор по знач.",Мас[2]);
        ЭлементыФормы.ДействияФормы.Кнопки.Вставить(0,"Отбор",ТипКнопкиКоманднойПанели.Действие,"Отбор",Мас[1]);
        ЭлементыФормы.ДействияФормы.Кнопки.Вставить(0,"Иерар.просм.",ТипКнопкиКоманднойПанели.Действие,"Иерар.просм.",Мас[0]);
       
        Кнопки = ЭлементыФормы.ДействияФормы.Кнопки.Отчеты.Кнопки;
        ИндексКнопки = Кнопки.Индекс(Кнопки.Отчет);
        Кнопки.Удалить(ИндексКнопки);

        ИндексКнопки = Кнопки.Индекс(Кнопки.ВедомостьВзаиморасчетов);
        Кнопки.Удалить(ИндексКнопки);
        
        //ИндексКнопки = Кнопки.Индекс(Кнопки.Продажи);
        //Кнопки.Удалить(ИндексКнопки);
        
        ИндексКнопки = Кнопки.Индекс(Кнопки.ЗаказыПоставщикам);
        Кнопки.Удалить(ИндексКнопки);
        
    КонецЕсли;

В роли на чтение журнала «Документы Контрагентов» добавил:

 

ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица

               ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты

               ПО ТекущаяТаблица.Контрагент = Контрагенты.Ссылка

ГДЕ Контрагенты.МенеджерыПокупателя.МенеджерПокупателя = &ТекущийПользователь

 

           

чтобы были видны документы только «его» контрагентов.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Настройка роли менеджера по продажам в 1С 8.doc
.doc 32,00Kb
02.04.12
51
.doc 32,00Kb 51 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

0. Анатолий В. (Nucky) 02.04.12 12:35
Требовалось настроить роль МенеджераПоПродажам, с условием, что менеджер видит только «своих» контрагентов (контрагентов, для которых он является менеджером), только документы «своих» контрагентов и в отчета цифры «своих».


Перейти к публикации

1. q_i 02.04.12 12:35
По-моему, что-то не то с некоторыми запросами.
Насколько я понимаю, в них получается полное соединение таблицы Контрагенты и таб.части МенеджерПокупателя, на которое потом накладывается отбор по &ТекущийПользователь, что должно давать задвои/затрои/т.п. по контрагентам, у которых в таб.части МенеджерыПокупателя больше одного менеджера. Если это так, то, как минимум, это будет медленно работать, а как максимум, если такой запрос будет использован где-то, где получаются цифры (в отчётах/расчётах), будет врать.
Примеры настораживающих запросов:
ВЫБРАТЬ
	Контрагенты.Ссылка
ИЗ
	Справочник.Контрагенты КАК Контрагенты
ГДЕ
	Контрагенты.МенеджерыПокупателя.МенеджерПокупателя = &МенеджерПокупателя
...Показать Скрыть

ГДЕ МенеджерыПокупателя.МенеджерПокупателя = &ТекущийПользователь
    ИЛИ ЭтоГруппа = Истина

2. Анатолий В. (Nucky) 02.04.12 12:45
"давать задвои/затрои/т.п. по контрагентам"
А как сделать так чтобы два или три пользователя работали в одном сеансе?...
3. q_i 02.04.12 16:57
(2) Nucky, я в восторге от 1с!
оказывается она может запрос
ВЫБРАТЬ
   Контрагенты.Ссылка
ИЗ
   Справочник.Контрагенты КАК Контрагенты
ГДЕ
   Контрагенты.МенеджерыПокупателя.МенеджерПокупателя = &МенеджерПокупателя
...Показать Скрыть

оттранслировать в
SELECT
T1._IDRRef
FROM _Reference7 T1
WHERE EXISTS(
SELECT 1 
FROM _Reference7_VT9 T2
WHERE T1._IDRRef = T2._Reference7_IDRRef AND ((T2._Fld11RRef = 0xA084005056C0000811E17CC165ADD72E)))
...Показать Скрыть

я же был в полной уверенности что на выходе будет нечто вроде
SELECT
T1._IDRRef
FROM _Reference7 T1 LEFT OUTER JOIN _Reference7_VT9 T2 ON T1._IDRRef = T2._Reference7_IDRRef 
WHERE T2._Fld11RRef = 0xA084005056C0000811E17CC165ADD72E

Интересно, как она догадалась? Это где-нибудь в документации есть?
4. Анатолий В. (Nucky) 02.04.12 18:05
:-) Как получил транслированный код?
Документации нет. К такому запросу пришел методом проб и ошибок.
5. q_i 02.04.12 19:16
(4) Nucky, пользую технологический журнал.
Создаёшь файл "C:\Program Files\1cv82\conf\logcfg.xml" с примерно таким содержимым ("Z:\LOGS82\" заменить на свой каталог для логов):
<config xmlns="http://v8.1c.ru/v8/tech-log">
  <log location="Z:\LOGS82\" history="1">
    <event>
     <eq property="name" value="dbmssql"/>
    </event>
    <event>
     <eq property="name" value="dbpostgrs"/>
    </event>
    <event>
     <eq property="name" value="dbv8dbeng"/>
    </event>
    <property name="sql">
    </property>
  </log>
</config>
...Показать Скрыть

К такому запросу пришел методом проб и ошибок.

Ну работает - и хорошо. )))
Впрочем, если стоит задача выбрать контрагентов определённого менеджера, то я бы предложил такой вариант:
ВЫБРАТЬ [РАЗЛИЧНЫЕ]
   Ссылка
ИЗ
   Справочник.МенеджерыПокупателя
ГДЕ
   МенеджерПокупателя = &МенеджерПокупателя
...Показать Скрыть
6. Гость 25.04.12 11:02
Спасибо, полезная штука
7. Анатолий В. (Nucky) 25.04.12 11:08
Рад, что вам пригодилось.
8. Масянечка 30.05.12 21:59
9. Анатолий В. (Nucky) 31.05.12 10:25
Рад, что и вам пригодилось.
10. Юлия Пухова (luchyk007) 27.05.13 19:25
Спасибо, было интересно ознакомиться, хотелось бы почитать побольше материала про RLS - интересная тема
11. Павел (Yimaida) 22.08.13 16:02
Статья интересная, но мне кажется, что можно кое что подправить
Например,
1.
Функция ЭтоМенеджер()
Возврат РольДоступна("Менеджер")
КонецФункции


2. В запросах, в частности в отчете правильнее будет использовать ВЫБРАТЬ РАЗРЕШЕННЫЕ...
Т.е. я бы ограничил список контрагентов уже с учетом RLS.
12. pavel ev (pavelyar) 03.10.15 21:05
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа