1001-й способ ограничить пользователей 1С



Описан еще один способ ограничить пользователя 1С, при помощи подписки на события

Задача: разрешить пользователям проводить документы только внутри разрешенных им складов.

Частично данная задача успешно решается при помощи RLS и соответствующих ролей. Но! не полностью. Во всяком случае в конфигурации 1С Розница 2.2 нет возможности ограничить пользователя (без изменения конфигураци)… ну, например, реализовывать  товар с "чужого" склада/Магазина, делать перемещение товаров на "чужие" склады (ограничения работают только для Ордеров???). 

Решение: используем относительно новую фичу от 1С — подписка на события. А именно на событие "Запись". Данные, по которым будем проверять, можно пользователю записывать данный документ или нет, будем брать из специально созданного справочника.

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

И собственно саму обработку события

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

Запрос.УстановитьПараметр("Ссылка",  ПараметрыСеанса.ТекущийПользователь);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
группа="";
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
группа=ВыборкаДетальныеЗаписи.Наименование;
конеццикла;
возврат группа;

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

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

конецесли;

если отказ=Истина тогда
сообщить("- вы не можете записать данный документ с данными складами - не хватает прав! Обратитесь к Администратору.");
конецесли;

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

P.S. Это не "готовое решение", а пример как можно сделать. Есть и другие способы.

39 Comments

  1. Altair777

    (0)

    решается при помощи RLE

    чего-чего?

    используем относительно новую фичу от 1С — подписка на события

    насколько новую? 🙂

    ДополнительныеНастройкиПравГрибовСкладыОткуда.Ссылка.ГруппаПользователей.Наименование = &ИмяГруппы

    почему наименование, а не сама группа?

    Reply ↓
  2. Сурикат

    Можно было бы сделать все одним запросом…

    А если групп будет несколько?

    Склад.Ссылка Т___Т Не надо так…

    А если до этого сработали типовые проверки и Отказ = Истина, а вы его так смело Отказ = Ложь…

    И все можно было сделать в запросе…

    Reply ↓
  3. Wolfis
    Решение: используем относительно новую фичу от 1С — подписка на события.

    эммммммм…я ее еще в году так 2011 использовал …то есть минимум 6 лет это относительно новое??

    Reply ↓
  4. kiruha

    А что за грибы ?

    Reply ↓
  5. logarifm

    Не совсем понимаю для чего там подписка на событие?

    Молчу об РЛС.

    — если пользователь вызвал просто перепровести из списка документа (что тут такого просто перепроведется документ не вижу никакого криминала);

    — хотите ограничить права таким способом (пожалуйста), а что мешает в форме просто перед записью объекта проверку сделать

    Reply ↓
  6. sanek_gk

    (5)

    вызвал просто перепровести из списка документа (что тут такого просто перепроведется документ не вижу никакого криминала);

    — хотите ограничить права таким способом (пожалуйста), а что мешает в форме просто перед записью объекта проверку сде

    Религия! видимо автор хотел «модно» не снимать с поддержки … но почему тогда не расширение которое как раз для этого и служит … (конечно оно не такое новое как подписка на события)

    Reply ↓
  7. Altair777

    (4) см. фамилию автора

    Ну, хочется человеку оставить свой след 🙂

    а вообще, за такой код

    если естьправила=Ложь тогда

    хочется по рукам надавать. Вот как надо:

    Если Не ЕстьПравила Тогда

    найди 3 отличия!

    Reply ↓
  8. Артано

    1000 и 1 способ выстрелить себе в ногу. Поставил минус — хочу в меру сил уменьшить шанс встретить поделия учеников такого мастера.

    Кто считает, что слишком жестко — посмотрите другие публикации автора. Я не поленился перед выставлением минуса и коммента.

    Reply ↓
  9. TODD22

    (7)

    Вот как надо:

    Только при условии что в переменной будет тип булево. Если там будет какой то другой тип то будет ошибка.

    Вариант «Если ЕстьПравила = Ложь Тогда» будет более устойчивым к ошибкам.

    Reply ↓
  10. Altair777

    (9)

    Код проанализируйте. Там не может быть другой тип

    Reply ↓
  11. Артано

    (9) Если в переменной тип не булево, то это еще один косяк программиста. То что среда разработки позволяет писать говнокод еще не повод действительно писать его

    Reply ↓
  12. TODD22

    (10)

    Код проанализируйте. Там не может быть другой тип

    Речь была не о конкретном коде. А об утверждении что за такой подход надо руки отрывать.

    Reply ↓
  13. TODD22

    (11)

    Если в переменной тип не булево, то это еще один косяк программиста.

    Конечно косяк программиста. А чей ещё?

    То что среда разработки позволяет писать говнокод еще не повод действительно писать его

    Но почему то люди пишут говнокод. И другим с ним приходится работать. В реальном мире живём… а не в сферическом конфигураторе в вакууме.

    Reply ↓
  14. Артано

    (13)

    Но почему то люди пишут говнокод. И другим с ним приходится работать. В реальном мире живём… а не в сферическом конфигураторе в вакууме.

    И в чем смысл этого высказывания? А еще есть люди которые едят фекалии, как прокомментируете? Мол в реальном мире живем, пусть едят в общих столовых рядом с остальными? =)

    Если некое отрицательное явление имеет сравнительно широкое распространение в отдельных нишах, то это не повод это явление возводить в норму.

    Reply ↓
  15. Altair777

    (13) Ну, тогда в каждой строке кода писать Попытку?

    Чтобы уже точно защититься

    Reply ↓
  16. TODD22

    (14)

    И в чем смысл этого высказывания?

    Перечитайте 10 раз если не понятно с первого. Ваше сравнение с фикалиями тут не уместно. Просто потому что открываю типовую розницу.

    Открываю поиск по конфигурации и ввожу в поиск «Истина Тогда» и получаю 903 результата….

    то это не повод это явление возводить в норму.

    А кто то возводит?

    Reply ↓
  17. TODD22

    (15)

    Чтобы уже точно защититься

    Если ты точно знаешь что твоя функция возвращает тип булево то нет. Как и написано в «системе стандартов». А если ты точно не уверен?

    Reply ↓
  18. Altair777

    (16) А кто пишет этот код? Стажеры малооплачиваемые.

    Помню видел в каком-то регл.отчете комментарий примерно такой — «Не знаю зачем, на всякий случай»

    Reply ↓
  19. TODD22

    (15)

    тогда в каждой строке кода писать Попытку?

    Для начала не трактовать написанное в стандартах разработки буквально.

    Reply ↓
  20. TODD22

    (19)

    А кто пишет этот код? Стажеры малооплачиваемые.

    Может систему стандартов то же они писали?

    Reply ↓
  21. Altair777

    (20) Вы часто упоминаете эту систему, но как-то в общем. Скажите конкретно, в чем я неправ в данном конкретном случае.

    Reply ↓
  22. TODD22

    (21)

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

    А я где то утверждал что вы не правы?

    Я вроде как написал что в коде может быть сравнение и это нормальная практика. Аргументировал вроде… скриншот приложил….

    Reply ↓
  23. Altair777

    Вот пример из типовой (соседние строка кода)

    Отказ = истина;
    Если Отказ Тогда
    Сообщить(«По договору «+Строка(Платеж.ДоговорКонтрагента)+» не указан Счет учета НДС (неподтвержденный)!»);
    КонецЕсли;

    Кто такое мог написать?! Сколько нужно иметь извилин, чтобы не писать условие?

    Reply ↓
  24. Артано

    (23) Может быть индусы?

    Reply ↓
  25. Altair777

    (24) Суровый индусский код

    Reply ↓
  26. TODD22

    (23)

    Кто такое мог написать?!

    Что вас так смущает в этом коде? И как должно быть написано правильно?

    Reply ↓
  27. Altair777

    (26) Вы что, издеваетесь? Или хочется пофлудить?

    Reply ↓
  28. TODD22

    (27)Исключительно в познавательных целях. Просто интересно в чём по вашему мнению ошибка?

    Reply ↓
  29. uri1978

    (26) Для чего нужна проверка условия

    Если Отказ Тогда

    ? 🙂

    Reply ↓
  30. Altair777

    (28)

    Отказ = истина;
    Сообщить(«По договору «+Строка(Платеж.ДоговорКонтрагента)+» не указан Счет учета НДС (неподтвержденный)!»);
    Reply ↓
  31. Altair777

    (29) Ага. Но товарищу, похоже, это трудно понять

    Reply ↓
  32. Altair777

    (28)

    ОбщегоНазначения.СообщитьОбОшибке(«По договору «+Строка(Платеж.ДоговорКонтрагента)+» не указан Счет учета НДС (неподтвержденный)!»», Отказ);

    Как правило, переменная Отказ уже объявлена

    Reply ↓
  33. SeerRM

    Не хочу обидеть человека, но за такой код я бы руки отрывал. Ну хоть Ctrl + A, Alt+Shift+F нажимали.

    Reply ↓
  34. Jako

    Ну просто все позабавились …

    Reply ↓
  35. Stim213

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

    Но когда время есть и хочется сделать все правильно — делают через RLS.

    А такие поделки обычно не выкладывают, ими стыдятся

    Reply ↓
  36. NoRazum

    (35) вот прямо в точку. Либо студент и первое его перо.

    Reply ↓
  37. YuriFm

    я такой код встречал когда человек с 7.7 переходил на 8. ещё не приловчился походу

    Reply ↓
  38. Labotamy

    Код не по КодСтайлу. Запросы ужасны. Идея дрянь. Забаньте это пожалуйста.

    Reply ↓
  39. IvanovAV

    Внедряли RLS в типовых, ничего нового не кодили, просто расставляли галочки в типовом РЛС в КА 1.1. Тот еще шлак получился, когда база тормозить стала. Нужно уметь курить этот RLS. В некоторых ситуациях, проще и надежнее, по старинке, как в 7.7 прописать, в стандартные процедуры. Зато не тормозит, и не нужно серверный ключик клиенту покупать.

    Reply ↓

Leave a Comment

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