Ограничение ДинамическогоСписка по Роли

1. XelOla 17 10.07.18 15:19 Сейчас в теме
Здравствуйте!
помогите пожалуйста, ограничить форму списка документа с динамическим списком по Не РольДоступна("Руководитель") если ВидОперации = ВыплатаЗП.
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Doreng 27 10.07.18 15:26 Сейчас в теме
(1)А как насчет "ВЫБРАТЬ РАЗРЕШЕННЫЕ" в запросе?
Извиняюсь...15-й раз прочитал, похоже это Вам не подойдет :-) стало доходить...что Вам нужен отбор динамического списка?
Я делал так
&НаКлиенте
Процедура ПриОткрытии(Отказ)

	УстановитьОтборПоОтветственному()	

КонецПроцедуры

&НаСервере
Процедура УстановитьОтборПоОтветственному()
Пользователь = Справочники.Пользователи.НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь().ПолноеИмя);
ОтветственныйДляОтображения = Справочники.Сотрудники.НайтиПоНаименованию(Пользователь.ПолноеНаименование());
УстановитьМеткуИОтборСписка("Ответственный", "Менеджеры", ОтветственныйДляОтображения);
КонецПроцедуры
Показать

А может Вам нужно так....(видимо я плохо понимаю слово "ограничить")
&НаКлиенте
Процедура ПриОткрытии(Отказ)

Если РольДоступна("ПолныеПрава") Тогда
Отказ = Истина;
КонецЕсли	

КонецПроцедуры
Показать
+
3. XelOla 17 10.07.18 15:45 Сейчас в теме
(2) в самом динамическом списке надо чтото менять?
т.е. фактически он у меня сейчас без условия, надо ли добавлять?
ВЫБРАТЬ
	ДокументУП_ДокументДДС.Ссылка,
	ДокументУП_ДокументДДС.ПометкаУдаления,
	ДокументУП_ДокументДДС.Номер,
	ДокументУП_ДокументДДС.Дата,
	ДокументУП_ДокументДДС.Проведен

ИЗ
	Документ.УП_ДокументДДС КАК ДокументУП_ДокументДДС
Показать
+
10. Doreng 27 10.07.18 15:59 Сейчас в теме
(3)имея такие исходные могу предложить только

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

ИЗ
    Документ.УП_ДокументДДС КАК ДокументУП_ДокументДДС
+ ПодставимОтбор  
Показать

как то так склепал из того что было 6-)
осталось определить параметр
Vitaly1C8; +1
20. XelOla 17 10.07.18 16:41 Сейчас в теме
(10)
простите, есть вопрос
чтото никогда не пользовалась
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если НЕ РольДоступна("УП_Руководитель") Тогда
Список.Параметры.УстановитьЗначениеПараметра("ВидОперации", Перечисления.ВидыОперацийДДС.ВыплатаСотрудникам);
Список.Параметры.УстановитьЗначениеПараметра("РасчСч",*здесь надо задать в целом справочник расчетные счета, т.к. Значение параметра РасчСч - составной тип данных, и там есть еще справочник Касса, т.е. параметром РасчСч надо задать - видеть ТоЛЬКО расчетные счета, НЕ Кассу*);
КонецЕсли;
КонецПроцедуры
+
7. XelOla 17 10.07.18 15:53 Сейчас в теме
(2)
а что "Выбрать разрешенные" можно сделать на одно перечисление?
а кстати, так не пойдет, потому что к перечислению ВидыОперацийДДС.ВыплатаСотрудникам - имеет доступ типа все, как администраторы с полными правами, вообщем менять права пользователй крайне не желательно, но есть группа пользователей без Роли Руководитель, вот им нельзя смотреть документ ДокументУП_ДокументДДС с видом операции ВыплатаСотрудникам
+
22. Vitaly1C8 11.07.18 09:40 Сейчас в теме
(1) Из опыта скажу, что лучше проверять не Роль а Профиль; Потому что Профиль легко можно настроить из программы (не нужен конфигуратор)
Пример из Документооборота:


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

Показать



// Общие модули - вчПрава

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

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

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

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

Показать
+
4. herfis 498 10.07.18 15:48 Сейчас в теме
Прямой путь ограничения динамического списка по роли - это RLS :)
+
6. user633533_encantado 11 10.07.18 15:53 Сейчас в теме
RLS и не на роль руководителя, а на хозяйственную операцию.
+
5. herfis 498 10.07.18 15:52 Сейчас в теме
Всем "рядовым" сотрудникам выдается роль с доступом на документ, где в RLS прописано условие на вид операции.
А в роли "Руководитель" доступ на документ без ограничений. И все. Ничего программировать не надо.
И отчеты, получающие список документов, тоже будут автоматически фильтровать данные (только нужно добавлять ключевое слово РАЗРЕШЕННЫЕ к ВЫБРАТЬ, а то будет падать по нехватке прав доступа).
+
8. XelOla 17 10.07.18 15:54 Сейчас в теме
(5) нет, обратная ситуация возможна?
РОль Руководитель без ограничений, остальные роли - с ограничением?
+
14. herfis 498 10.07.18 16:22 Сейчас в теме
(8) А я разве не так сказал?
Но вообще плохо, когда таких ролей много. Правильный подход - в подсистеме БСП "Управление доступом". Там роли максимально декомпозируются по объектам, а осмысленные наборы прав собираются уже профилями доступа.
+
15. XelOla 17 10.07.18 16:28 Сейчас в теме
(14) подскажите литературу?)
+
16. herfis 498 10.07.18 16:30 Сейчас в теме
17. XelOla 17 10.07.18 16:33 Сейчас в теме
9. user633533_encantado 11 10.07.18 15:55 Сейчас в теме
Только в бухгалтерии RLS не особо поможет, так как любой пользователь может сформировать ОСВ по счету. Поэтому там и нет такого гибкого механизма доступа.
+
11. XelOla 17 10.07.18 16:02 Сейчас в теме
21. user633533_encantado 11 10.07.18 17:17 Сейчас в теме
(11) Версия конфигурации имеет значение. Может и дорабатывать ничего не надо,а только настроить.
+
12. XelOla 17 10.07.18 16:07 Сейчас в теме
(9)
вы можете объяснить RLS?
+
13. XelOla 17 10.07.18 16:08 Сейчас в теме
18. herfis 498 10.07.18 16:33 Сейчас в теме
Но в вашей текущей ситуации это слабо поможет, насколько я понимаю. Это идеальный вариант, если делать с нуля или типовая ее уже использует (я про подсистему "Управление доступом").
Я вот в самописке внедрил (только со своими шаблонами RLS, а не стандартными) и теперь горя не знаю. Красота нечеловеческая.
+
19. herfis 498 10.07.18 16:34 Сейчас в теме
У вас, если "в лоб" и "закрыв глаза" - добавить RLS-ограничение на документ во все роли, где разрешено его чтение. А без ограничения оставить только роль "Руководитель".
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот