Права доступа вместо RLS на скорую руку. Розница 3
Клиенту нужно было добавить права, чтобы сотрудник видел и мог ввести инвентаризации, оприходования и списания только по своему складу.
У сотрудника настроен через RLS доступ к своему складу и главному, е.к. используются перемещения на главный склад. Поэтому он видит также и документы по главному складу.
Было решено скрыть ненужные докумнеты через добавление фильтра на списки.
Также пользователю запретили использование отчетов.
В списке документов было обнаружено, что добавленный фильтр заменяется отобором по выбранному складу. Поэтому, когда пользователь выбирал главный склад ему показывались документы главного склада.
Эта проблема была решена через отбор по полю Ссылка.СтруктурнаяЕдиница вместо поля СтруктурнаяЕдиница.
В журналах документов добавлял отбор по полю Склад, там замещение отбора при выборе склада не наблюдалось.
Контроль записи реализовал аналогично открытию, вызывается тот же способ, только эмулируется форма через структуру. Можно было бы и более красиво, но делал на скорую руку.
В модуль контроля выполнение попадает из модуля подключаемых команд, из процедуры открытия формы отчета и из добавленной подписки перед записью документов.
Посмотреть содержимое документа через печать не получится — для этого нужно нажать печать в списке документов или в документе, а это невозможно.
Функция ЭтоТоваровед() Экспорт Возврат Лев(ПолучитьПользователя(),9) = "Товаровед"; КонецФункции Функция ГлавныйСклад() Экспорт //Осипов - не совсем корректно, лучше завести константу, но пока так 16 июня 2026 Возврат Справочники.СтруктурныеЕдиницы.НайтиПоНаименованию("Главный склад"); КонецФункции Функция КонтрольДоступа(Форма, Отказ = Неопределено, ЭтоНовый = Неопределено) Экспорт ИмяФормы = Форма.ИмяФормы; //Документ.ПриходнаяНакладная.Форма.ФормаДокумента, Документ.ИнвентаризацияЗапасов.Форма.ФормаСписка //Определяем доступ к полю Ответственный Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Форма, "Объект") И ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Форма.Объект, "Ответственный") И Форма.Элементы.Найти("Ответственный") <> Неопределено Тогда Если НЕ Пользователи.РолиДоступны("ПолныеПрава") Тогда Форма.Элементы.Ответственный.ТолькоПросмотр = истина; КонецЕсли; КонецЕсли; //Если ИСТИНА ИЛИ ЭтоТоваровед() Тогда Если ЭтоТоваровед() Тогда ГлавныйСклад= ГлавныйСклад(); Если ИмяФормы = "Документ.ИнвентаризацияЗапасов.Форма.ФормаДокумента" ИЛИ ИмяФормы = "Документ.СписаниеЗапасов.Форма.ФормаДокумента" ИЛИ ИмяФормы = "Документ.ОприходованиеЗапасов.Форма.ФормаДокумента" Тогда //если ЭтоНовый явно не задано, берем из объекта Если НЕ ?(ЭтоНовый = Неопределено, Форма.Объект.Ссылка.Пустая(), ЭтоНовый) И Форма.Объект.СтруктурнаяЕдиница = ГлавныйСклад Тогда ВызватьИсключение "Просмотр документа по главному складу запрещен!" КонецЕсли; КонецЕсли; Если ИмяФормы = "Документ.ИнвентаризацияЗапасов.Форма.ФормаСписка" ИЛИ ИмяФормы = "Документ.СписаниеЗапасов.Форма.ФормаСписка" ИЛИ ИмяФормы = "Документ.ОприходованиеЗапасов.Форма.ФормаСписка" Тогда ОбновитьОтборСервер(Форма.Список, "Ссылка.СтруктурнаяЕдиница", ГлавныйСклад(),ложь,истина, "дор_СтруктурнаяЕдиница", ВидСравненияКомпоновкиДанных.НеРавно); КонецЕсли; Если ИмяФормы = "ЖурналДокументов.СкладскиеАкты.Форма.ФормаСписка" Тогда ОбновитьОтборСервер(Форма.Список, "Склад", ГлавныйСклад(),ложь,истина, "дор_СтруктурнаяЕдиница", ВидСравненияКомпоновкиДанных.НеРавно); КонецЕсли; Если ИмяФормы = "ОбщаяФорма.ФормаОтчета" Тогда //Форма.Параметры.Отчет ВызватьИсключение "Просмотр отчета запрещен!" КонецЕсли; КонецЕсли; КонецФункции Процедура ОбновитьОтборСервер(врСписокОтбора, врЛевоеЗначение = "", врПравоеЗначение = "", врОчиститьОтбор = Ложь, врРежимОтображенияНедоступный = Ложь, ИмяОтбора = "", ВидСравнения = Неопределено) Экспорт //Осипов 2020-08-20 эта же процедура есть и в модуле Глобальный, пока убрал задвоение имен, непонятно, зачем оно... // !!! Не забыть поменять Процедуру в модуле "ГлавныйНаКлиенте" !!! // Если врОчиститьОтбор Тогда врСписокОтбора.Отбор.Элементы.Очистить(); КонецЕсли; ЭлементОтбора = Неопределено; Если ИмяОтбора <> "" Тогда Для Каждого ТекЭлементОтбора ИЗ врСписокОтбора.Отбор.Элементы Цикл Если ТекЭлементОтбора.Представление = ИмяОтбора Тогда ЭлементОтбора = ТекЭлементОтбора; Прервать; КонецЕсли; КонецЦикла; КонецЕсли; Если ЭлементОтбора = Неопределено Тогда ЭлементОтбора = врСписокОтбора.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.Представление = ИмяОтбора; КонецЕсли; ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(врЛевоеЗначение); ЭлементОтбора.ВидСравнения = ВидСравнения; ЭлементОтбора.Использование = Истина; ЭлементОтбора.ПравоеЗначение = врПравоеЗначение; Если врРежимОтображенияНедоступный Тогда ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; Иначе ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ; КонецЕсли; КонецПроцедуры Процедура дор_ПередЗаписьюДокументаПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт ВидДокумента = Источник.Метаданные().Имя; ИмяФормы = "Документ." + ВидДокумента + ".Форма.ФормаДокумента"; Форма = Новый Структура("ИмяФормы, Объект", ИмяФормы, Источник); КонтрольДоступа(Форма,,ложь); КонецПроцедуры
Среда: Розница. Объем: 1.5 час.




Если уже включен рлс, то почему бы не настроить профили доступа?
Кстати как такая ситуация будет разруливаться в ФЗ (если оно будет)