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

Администрирование - Защита, права, пароли

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

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

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

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

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

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

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

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

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

См. также

Комментарии
1. Альтаир (Altair777) 639 13.07.17 16:49 Сейчас в теме
(0)
решается при помощи RLE

чего-чего?

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

насколько новую? :)

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

почему наименование, а не сама группа?
klinval; DrAku1a; JohnConnor; ResetAtreides; kote; chebser; Артано; spogo; TODD22; Andle; manlak; bsturtle; eskor; +13 Ответить
2. Виталий Попов (Сурикат) 152 13.07.17 17:41 Сейчас в теме
Можно было бы сделать все одним запросом...
А если групп будет несколько?

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

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

И все можно было сделать в запросе...
Dmitri93; +1 Ответить
3. Вадим Туманов (Wolfis) 4 13.07.17 17:56 Сейчас в теме
Решение: используем относительно новую фичу от 1С - подписка на события.


эммммммм...я ее еще в году так 2011 использовал ...то есть минимум 6 лет это относительно новое??
4. kiruha Дронов (kiruha) 360 13.07.17 19:00 Сейчас в теме
А что за грибы ?
klinval; DrAku1a; Stim213; Dmitri93; user595120_rybolovlev_ms; ResetAtreides; demkonst; karpik666; Andle; manlak; androgin; +11 Ответить
7. Альтаир (Altair777) 639 14.07.17 09:30 Сейчас в теме
(4) см. фамилию автора
Ну, хочется человеку оставить свой след :)

а вообще, за такой код
если естьправила=Ложь тогда

хочется по рукам надавать. Вот как надо:
Если Не ЕстьПравила Тогда

найди 3 отличия!
Артано; lunjio; +2 1 Ответить
9. борян петров (TODD22) 16 14.07.17 09:46 Сейчас в теме
(7)
Вот как надо:

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

Вариант "Если ЕстьПравила = Ложь Тогда" будет более устойчивым к ошибкам.
sashs1980; Award; Aletar; +3 2 Ответить
10. Альтаир (Altair777) 639 14.07.17 10:05 Сейчас в теме
(9)
Код проанализируйте. Там не может быть другой тип
Прикрепленные файлы:
12. борян петров (TODD22) 16 14.07.17 10:17 Сейчас в теме
(10)
Код проанализируйте. Там не может быть другой тип

Речь была не о конкретном коде. А об утверждении что за такой подход надо руки отрывать.
Award; Aletar; +2 1 Ответить
11. Артано Майаров (Артано) 322 14.07.17 10:09 Сейчас в теме
(9) Если в переменной тип не булево, то это еще один косяк программиста. То что среда разработки позволяет писать говнокод еще не повод действительно писать его
lunjio; ResetAtreides; Fox-trot; Altair777; Octopus; +5 Ответить
13. борян петров (TODD22) 16 14.07.17 10:22 Сейчас в теме
(11)
Если в переменной тип не булево, то это еще один косяк программиста.

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

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

Но почему то люди пишут говнокод. И другим с ним приходится работать. В реальном мире живём... а не в сферическом конфигураторе в вакууме.
14. Артано Майаров (Артано) 322 14.07.17 10:31 Сейчас в теме
(13)
Но почему то люди пишут говнокод. И другим с ним приходится работать. В реальном мире живём... а не в сферическом конфигураторе в вакууме.


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

Если некое отрицательное явление имеет сравнительно широкое распространение в отдельных нишах, то это не повод это явление возводить в норму.
16. борян петров (TODD22) 16 14.07.17 10:39 Сейчас в теме
(14)
И в чем смысл этого высказывания?

Перечитайте 10 раз если не понятно с первого. Ваше сравнение с фикалиями тут не уместно. Просто потому что открываю типовую розницу.
Открываю поиск по конфигурации и ввожу в поиск "Истина Тогда" и получаю 903 результата....

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

А кто то возводит?
Прикрепленные файлы:
19. Альтаир (Altair777) 639 14.07.17 10:43 Сейчас в теме
(16) А кто пишет этот код? Стажеры малооплачиваемые.
Помню видел в каком-то регл.отчете комментарий примерно такой - "Не знаю зачем, на всякий случай"
20. борян петров (TODD22) 16 14.07.17 10:56 Сейчас в теме
(19)
А кто пишет этот код? Стажеры малооплачиваемые.

Может систему стандартов то же они писали?
21. Альтаир (Altair777) 639 14.07.17 10:58 Сейчас в теме
(20) Вы часто упоминаете эту систему, но как-то в общем. Скажите конкретно, в чем я неправ в данном конкретном случае.
22. борян петров (TODD22) 16 14.07.17 11:06 Сейчас в теме
(21)
Скажите конкретно, в чем я неправ в данном конкретном случае.

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

Я вроде как написал что в коде может быть сравнение и это нормальная практика. Аргументировал вроде... скриншот приложил....
15. Альтаир (Altair777) 639 14.07.17 10:38 Сейчас в теме
(13) Ну, тогда в каждой строке кода писать Попытку?
Чтобы уже точно защититься
17. борян петров (TODD22) 16 14.07.17 10:41 Сейчас в теме
(15)
Чтобы уже точно защититься

Если ты точно знаешь что твоя функция возвращает тип булево то нет. Как и написано в "системе стандартов". А если ты точно не уверен?
18. борян петров (TODD22) 16 14.07.17 10:43 Сейчас в теме
(15)
тогда в каждой строке кода писать Попытку?

Для начала не трактовать написанное в стандартах разработки буквально.
5. Александр Хомяк (logarifm) 985 13.07.17 23:00 Сейчас в теме
Не совсем понимаю для чего там подписка на событие?

Молчу об РЛС.

- если пользователь вызвал просто перепровести из списка документа (что тут такого просто перепроведется документ не вижу никакого криминала);
- хотите ограничить права таким способом (пожалуйста), а что мешает в форме просто перед записью объекта проверку сделать
6. Александр Шишков (sanek_gk) 68 14.07.17 08:20 Сейчас в теме
(5)
вызвал просто перепровести из списка документа (что тут такого просто перепроведется документ не вижу никакого криминала);
- хотите ограничить права таким способом (пожалуйста), а что мешает в форме просто перед записью объекта проверку сде

Религия! видимо автор хотел "модно" не снимать с поддержки ... но почему тогда не расширение которое как раз для этого и служит ... (конечно оно не такое новое как подписка на события)
Lok`Tar; Andle; manlak; +3 Ответить
8. Артано Майаров (Артано) 322 14.07.17 09:35 Сейчас в теме
1000 и 1 способ выстрелить себе в ногу. Поставил минус - хочу в меру сил уменьшить шанс встретить поделия учеников такого мастера.
Кто считает, что слишком жестко - посмотрите другие публикации автора. Я не поленился перед выставлением минуса и коммента.
23. Альтаир (Altair777) 639 14.07.17 11:09 Сейчас в теме
Вот пример из типовой (соседние строка кода)
Отказ = истина;
Если Отказ Тогда
	Сообщить("По договору "+Строка(Платеж.ДоговорКонтрагента)+" не указан Счет учета НДС (неподтвержденный)!");
КонецЕсли;

Кто такое мог написать?! Сколько нужно иметь извилин, чтобы не писать условие?
Прикрепленные файлы:
Артано; IvanovAV; klinval; DrAku1a; Just; +5 Ответить
24. Артано Майаров (Артано) 322 15.07.17 07:12 Сейчас в теме
(23) Может быть индусы?
Dmitri93; +1 Ответить
25. Альтаир (Altair777) 639 17.07.17 16:38 Сейчас в теме
(24) Суровый индусский код
Прикрепленные файлы:
IvanovAV; +1 Ответить
26. борян петров (TODD22) 16 17.07.17 17:04 Сейчас в теме
(23)
Кто такое мог написать?!

Что вас так смущает в этом коде? И как должно быть написано правильно?
27. Альтаир (Altair777) 639 17.07.17 17:48 Сейчас в теме
(26) Вы что, издеваетесь? Или хочется пофлудить?
Dmitri93; +1 Ответить
28. борян петров (TODD22) 16 17.07.17 17:48 Сейчас в теме
(27)Исключительно в познавательных целях. Просто интересно в чём по вашему мнению ошибка?
30. Альтаир (Altair777) 639 17.07.17 17:52 Сейчас в теме
(28)
Отказ = истина;
Сообщить("По договору "+Строка(Платеж.ДоговорКонтрагента)+" не указан Счет учета НДС (неподтвержденный)!");
32. Альтаир (Altair777) 639 17.07.17 18:26 Сейчас в теме
(28)
ОбщегоНазначения.СообщитьОбОшибке("По договору "+Строка(Платеж.ДоговорКонтрагента)+" не указан Счет учета НДС (неподтвержденный)!"", Отказ);

Как правило, переменная Отказ уже объявлена
29. uri1978 uri1978 (uri1978) 109 17.07.17 17:50 Сейчас в теме
(26) Для чего нужна проверка условия
Если Отказ Тогда
? :)
31. Альтаир (Altair777) 639 17.07.17 17:54 Сейчас в теме
(29) Ага. Но товарищу, похоже, это трудно понять
33. Seer NaSA (SeerRM) 1 18.07.17 12:32 Сейчас в теме
Не хочу обидеть человека, но за такой код я бы руки отрывал. Ну хоть Ctrl + A, Alt+Shift+F нажимали.
34. Сергей Корнев (Jako) 46 19.07.17 09:08 Сейчас в теме
Ну просто все позабавились ...
35. Павел Колмаков (Stim213) 318 19.07.17 15:30 Сейчас в теме
Да ладно. Все так делают, когда времени мало, а базу можно курочить.

Но когда время есть и хочется сделать все правильно - делают через RLS.
А такие поделки обычно не выкладывают, ими стыдятся
36. Юрий Патласов (NoRazum) 18 19.07.17 18:57 Сейчас в теме
(35) вот прямо в точку. Либо студент и первое его перо.
37. Юрий Водич (YuriFm) 20.07.17 01:12 Сейчас в теме
я такой код встречал когда человек с 7.7 переходил на 8. ещё не приловчился походу
38. Алексей Сосновый (Labotamy) 21.07.17 15:20 Сейчас в теме
Код не по КодСтайлу. Запросы ужасны. Идея дрянь. Забаньте это пожалуйста.
39. Алексей Иванов (IvanovAV) 42 25.07.17 15:15 Сейчас в теме
Внедряли RLS в типовых, ничего нового не кодили, просто расставляли галочки в типовом РЛС в КА 1.1. Тот еще шлак получился, когда база тормозить стала. Нужно уметь курить этот RLS. В некоторых ситуациях, проще и надежнее, по старинке, как в 7.7 прописать, в стандартные процедуры. Зато не тормозит, и не нужно серверный ключик клиенту покупать.
Оставьте свое сообщение