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

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

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

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

krana-ot-2017-07-13-15-04-38.png»>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Функция ПолучитьГруппуПользователя()
Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
                   | ГруппыПользователей.Наименование КАК Наименование
                   |ИЗ
                   | Справочник.ГруппыПользователей КАК ГруппыПользователей
                   |ГДЕ
                   | ГруппыПользователей.Состав.Пользователь.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка",  ПараметрыСеанса.ТекущийПользователь);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
группа="";
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
//сообщить(ВыборкаДетальныеЗаписи.Наименование);
группа=ВыборкаДетальныеЗаписи.Наименование;
конеццикла;           
возврат группа;
КонецФункции
 
Функция ПроверкаВсяческихПрав(Источник, Отказ) Экспорт
отказываем=истина;
естьправила=ложь;
гп= ПолучитьГруппуПользователя();
естьОтправитель=ложь;
естьПолучатель=ложь;
    отказываемОтправитель=истина;
отказываемПолучатель=истина;
// проверяем соответствие складам "Откуда"
Запрос = Новый Запрос;
   Запрос.Текст =
"ВЫБРАТЬ
| ДополнительныеНастройкиПравГрибовСкладыОткуда.Склад.Ссылка КАК СкладСсылка
|ИЗ
| Справочник.ДополнительныеНастройкиПравГрибов.РазрешенныеСклады КАК ДополнительныеНастройкиПравГрибовСкладыОткуда
|ГДЕ
| ДополнительныеНастройкиПравГрибовСкладыОткуда.Ссылка.ГруппаПользователей.Наименование = &ИмяГруппы
| И ДополнительныеНастройкиПравГрибовСкладыОткуда.Ссылка.ВидДокумента.Наименование = &ИмяДокумента";
Запрос.УстановитьПараметр("ИмяГруппы", гп);
Запрос.УстановитьПараметр("ИмяДокумента", Источник.Ссылка.Метаданные().Имя);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
естьправила=Истина;
если Источник.Ссылка.Метаданные().Реквизиты.Найти("Склад")<>Неопределено тогда
если источник.Склад.Ссылка=ВыборкаДетальныеЗаписи.СкладСсылка тогда отказываем=Ложь;
конецесли;
конецесли;
если Источник.Ссылка.Метаданные().Реквизиты.Найти("СкладОтправитель")<>Неопределено тогда
естьОтправитель=Истина;
если источник.СкладОтправитель.Ссылка=ВыборкаДетальныеЗаписи.СкладСсылка тогда
отказываем=Ложь;
отказываемОтправитель=Ложь;
конецесли;
конецесли;
если Источник.Метаданные().Реквизиты.Найти("СкладПолучатель")<>Неопределено тогда
естьПолучатель=Истина;
если источник.Ссылка.СкладПолучатель.Ссылка=ВыборкаДетальныеЗаписи.СкладСсылка тогда
отказываем=Ложь;
отказываемОтправитель=Ложь;
конецесли;
конецесли;
конеццикла;
если естьправила=Ложь тогда
Отказ=ложь;
иначе
  //отрабатываем вариант что два склада отправитель и получатель!
  если (естьОтправитель=Истина и естьПолучатель=Истина) тогда
  если отказываемОтправитель=Ложь и отказываемПолучатель=Ложь тогда
   отказ=ложь;   
   иначе
   отказ=Истина;
  конецесли;   
  иначе
  отказ=отказываем;   
  конецесли
  
  конецесли;
  
если отказ=Истина тогда сообщить("- вы не можете записать данный документ с данными складами - не хватает прав! Обратитесь к Кочанову Сергею.");
конецесли;   
  
КонецФункции