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