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