Права доступа вместо RLS на скорую руку. Розница 3

Клиенту нужно было добавить права, чтобы сотрудник видел и мог ввести инвентаризации, оприходования и списания только по своему складу.

У сотрудника настроен через RLS доступ к своему складу и главному, е.к. используются перемещения на главный склад. Поэтому он видит также и документы по главному складу.

Было решено скрыть ненужные докумнеты через добавление фильтра на списки.

Также пользователю запретили использование отчетов.

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

Эта проблема была решена через отбор по полю Ссылка.СтруктурнаяЕдиница вместо поля СтруктурнаяЕдиница.

В журналах документов добавлял отбор по полю Склад, там замещение отбора при выборе склада не наблюдалось.

Контроль записи реализовал аналогично открытию, вызывается тот же способ, только эмулируется форма через структуру. Можно было бы и более красиво, но делал на скорую руку.

В модуль контроля выполнение попадает из модуля подключаемых команд, из процедуры открытия формы отчета и из добавленной подписки перед записью документов.

Посмотреть содержимое документа через печать не получится — для этого нужно нажать печать в списке документов или в документе, а это невозможно.

Функция ЭтоТоваровед() Экспорт  
	Возврат Лев(ПолучитьПользователя(),9) = "Товаровед";
КонецФункции  

Функция ГлавныйСклад() Экспорт 
	//Осипов - не совсем корректно, лучше завести константу, но пока так 16 июня 2026
	Возврат Справочники.СтруктурныеЕдиницы.НайтиПоНаименованию("Главный склад");
КонецФункции  

Функция КонтрольДоступа(Форма, Отказ = Неопределено, ЭтоНовый = Неопределено) Экспорт
	
	ИмяФормы = Форма.ИмяФормы; //Документ.ПриходнаяНакладная.Форма.ФормаДокумента, Документ.ИнвентаризацияЗапасов.Форма.ФормаСписка
	
	//Определяем доступ к полю Ответственный
	Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Форма, "Объект") И
		ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Форма.Объект, "Ответственный") И
		Форма.Элементы.Найти("Ответственный") <> Неопределено 
		Тогда
		Если НЕ Пользователи.РолиДоступны("ПолныеПрава") Тогда                                          
			Форма.Элементы.Ответственный.ТолькоПросмотр = истина;
		КонецЕсли;
	КонецЕсли;  

	//Если ИСТИНА ИЛИ ЭтоТоваровед() Тогда                            
	Если ЭтоТоваровед() Тогда
	
		ГлавныйСклад= ГлавныйСклад();
		
		Если ИмяФормы = "Документ.ИнвентаризацияЗапасов.Форма.ФормаДокумента" 
			ИЛИ  ИмяФормы = "Документ.СписаниеЗапасов.Форма.ФормаДокумента"
			ИЛИ  ИмяФормы = "Документ.ОприходованиеЗапасов.Форма.ФормаДокумента" 
		Тогда          
		
		//если ЭтоНовый явно не задано, берем из объекта
		Если НЕ ?(ЭтоНовый = Неопределено, Форма.Объект.Ссылка.Пустая(), ЭтоНовый) 
			И Форма.Объект.СтруктурнаяЕдиница = ГлавныйСклад Тогда
				ВызватьИсключение "Просмотр документа по главному складу запрещен!"
			КонецЕсли;
		КонецЕсли;  
		
		Если ИмяФормы = "Документ.ИнвентаризацияЗапасов.Форма.ФормаСписка" 
			ИЛИ ИмяФормы = "Документ.СписаниеЗапасов.Форма.ФормаСписка" 
			ИЛИ ИмяФормы = "Документ.ОприходованиеЗапасов.Форма.ФормаСписка" 
			Тогда
			ОбновитьОтборСервер(Форма.Список, "Ссылка.СтруктурнаяЕдиница", ГлавныйСклад(),ложь,истина, "дор_СтруктурнаяЕдиница", ВидСравненияКомпоновкиДанных.НеРавно);
		КонецЕсли;  
		
		
		Если ИмяФормы = "ЖурналДокументов.СкладскиеАкты.Форма.ФормаСписка" Тогда 
			ОбновитьОтборСервер(Форма.Список, "Склад", ГлавныйСклад(),ложь,истина, "дор_СтруктурнаяЕдиница", ВидСравненияКомпоновкиДанных.НеРавно);
		КонецЕсли;  
		

		Если ИмяФормы = "ОбщаяФорма.ФормаОтчета" Тогда //Форма.Параметры.Отчет
			ВызватьИсключение "Просмотр отчета запрещен!"
		КонецЕсли;
	КонецЕсли;  
	
	
	
КонецФункции


Процедура ОбновитьОтборСервер(врСписокОтбора, врЛевоеЗначение = "", врПравоеЗначение = "", врОчиститьОтбор = Ложь, врРежимОтображенияНедоступный = Ложь, ИмяОтбора = "", ВидСравнения = Неопределено) Экспорт
	//Осипов 2020-08-20 эта же процедура есть и в модуле Глобальный, пока убрал задвоение имен, непонятно, зачем оно...

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

Процедура дор_ПередЗаписьюДокументаПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
	ВидДокумента = Источник.Метаданные().Имя;
	ИмяФормы = "Документ." + ВидДокумента + ".Форма.ФормаДокумента";
	Форма = Новый Структура("ИмяФормы, Объект", ИмяФормы, Источник);
	КонтрольДоступа(Форма,,ложь);
КонецПроцедуры

Среда: Розница. Объем: 1.5 час.

image_pdfimage_print

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Вам может также понравиться...

комментариев 17

  1. rzd:

    Если уже включен рлс, то почему бы не настроить профили доступа?

  2. rzd:

    Кстати как такая ситуация будет разруливаться в ФЗ (если оно будет)

    • Поживем — увидим. Но F3 как-то эту проблему решать будет, в отличии от типовых, которая игнорирует проблемы.

      • rzd:

        В типовых как раз здесь проблемы нет, разные роли, которые надо собрать в соответствующие профили, но ты же проигнорировал первый коммент.

        • ну раз нет проблемы, распишите свое видение решения проблемы.

          • rzd:

            выборочное прочтение? решение в первом комменте

          • что именно вы имели ввиду под профилями доступа? и как это решит доступность склада в одном месте и не доступность в другом?

  3. rzd:

    >>что именно вы имели ввиду под профилями доступа? и как это решит доступность склада в одном месте и не доступность в другом?

    Так тебе надо пройти курсы типовых. БСП, администрирование….

    • зачем? Я и без этого прекрасно работаю.
      все же я программист 1с, а не консультант 1с.
      По делу есть что сказать?

      • Виталий:

        По делу:Если вы сами переписываете типовой механизм прав, то “я не консультант” тут слабый аргумент. Чтобы заменить штатное решение своим, неплохо бы сначала понимать штатное.

        • спорный вопрос. инженер часто обладает возможностями, недоступными консультанту, поэтому может за счет возможности конфигурирования решать задачи другими способами.
          более дешевыми для клиента, в конечном случае.
          но опять же, rzd пишет из «позы гуру», не объясняя решения, а просто заявляя, что он его знает. Такое себе. Может знает, может нет. Он аноним, ему не нужно следить за своей репутацией.
          да и потом, изучать имеет смысл рабочие эффективные решения, а не «костыли на подпорках», которыми являются RLS в 1С.

          • rzd:

            То есть ты, не зная механизмов работы RLS в БСП, выносишь им оценку «костыли на подпорках»?

          • знаю и выношу. мне не нравится реализация.

          • Виталий:

            Вы уж извините, но не знать, как оно устроено, и при этом уверенно объявлять это костылём — это прям воистину инженерный подход.

          • что именно устроено? почему вы решили, что я не знаю?
            разверните свою мысль до деталей.

  4. rzd:

    Если бы ты знал, то не спрашивал бы, что такое профили доступа

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *