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

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

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

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

 

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

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

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

Установкой начальных настроек устанавливается отбор по контрагенту "В списке" по списку контрагентов для которых пользователь является менеджером. Чтобы пользователь не менял настройку отчета "заблокировал" кнопку "Настройка".

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

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

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

13 Comments

  1. Nucky

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

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

    Reply
  2. q_i

    По-моему, что-то не то с некоторыми запросами.

    Насколько я понимаю, в них получается полное соединение таблицы Контрагенты и таб.части МенеджерПокупателя, на которое потом накладывается отбор по &ТекущийПользователь, что должно давать задвои/затрои/т.п. по контрагентам, у которых в таб.части МенеджерыПокупателя больше одного менеджера. Если это так, то, как минимум, это будет медленно работать, а как максимум, если такой запрос будет использован где-то, где получаются цифры (в отчётах/расчётах), будет врать.

    Примеры настораживающих запросов:

    ВЫБРАТЬ
    Контрагенты.Ссылка
    ИЗ
    Справочник.Контрагенты КАК Контрагенты
    ГДЕ
    Контрагенты.МенеджерыПокупателя.МенеджерПокупателя = &МенеджерПокупателя

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

    Reply
  3. Nucky

    «давать задвои/затрои/т.п. по контрагентам»

    А как сделать так чтобы два или три пользователя работали в одном сеансе?…

    Reply
  4. q_i

    (2) я в восторге от 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

    Интересно, как она догадалась? Это где-нибудь в документации есть?

    Reply
  5. Nucky

    🙂 Как получил транслированный код?

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

    Reply
  6. q_i

    (4) пользую технологический журнал.

    Создаёшь файл «C:Program Files1cv82conflogcfg.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>

    Показать

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

    Ну работает — и хорошо. )))

    Впрочем, если стоит задача выбрать контрагентов определённого менеджера, то я бы предложил такой вариант:

    ВЫБРАТЬ [РАЗЛИЧНЫЕ]
    Ссылка
    ИЗ
    Справочник.МенеджерыПокупателя
    ГДЕ
    МенеджерПокупателя = &МенеджерПокупателя
    Reply
  7. Гость

    Спасибо, полезная штука

    Reply
  8. Nucky

    Рад, что вам пригодилось.

    Reply
  9. Масянечка

    СПАСИБОЧКИ!!!!!!!!!!!!!!!!!!!!

    Reply
  10. Nucky

    Рад, что и вам пригодилось.

    Reply
  11. luchyk007

    Спасибо, было интересно ознакомиться, хотелось бы почитать побольше материала про RLS — интересная тема

    Reply
  12. Yimaida

    Статья интересная, но мне кажется, что можно кое что подправить

    Например,

    1.

    Функция ЭтоМенеджер()
    Возврат РольДоступна(«Менеджер»)
    КонецФункции

    2. В запросах, в частности в отчете правильнее будет использовать ВЫБРАТЬ РАЗРЕШЕННЫЕ…

    Т.е. я бы ограничил список контрагентов уже с учетом RLS.

    Reply
  13. pavelyar

    Спасибо!

    Reply

Leave a Comment

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