ДоступРазрешен (БСП)

Автор: 1С
ОбщийМодуль.УправлениеДоступомСлужебный
БСП

Доступ разрешен. Универсальное ограничение доступа.

////////////////////////////////////////////////////////////////////////////////
// Универсальное ограничение доступа.

Функция ДоступРазрешен(ОписаниеДанных, Изменение, ВызыватьИсключение = Ложь) Экспорт
	
	Если Пользователи.ЭтоПолноправныйПользователь() Тогда
		Возврат Истина;
	КонецЕсли;
	
	ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(ОписаниеДанных));
	Если ОбъектМетаданных = Неопределено Тогда
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Недопустимое значение параметра %1 в %2.
			           |Ожидалась ссылка или ключ записи.
			           |Передано значение: %3 (тип %4).'"),
			"ОписаниеДанных",
			?(Изменение, "УправлениеДоступом.ИзменениеРазрешено",
				"УправлениеДоступом.ЧтениеРазрешено"),
			Строка(ОписаниеДанных),
			Строка(ТипЗнч(ОписаниеДанных)));
		ВызватьИсключение ТекстОшибки;
	КонецЕсли;
	
	ИмяПраваДоступа = ?(Изменение, "Изменение", "Чтение");
	
	Если ВызыватьИсключение Тогда
		ВыполнитьПроверкуПравДоступа(ИмяПраваДоступа, ОбъектМетаданных);
		
	ИначеЕсли Не ПравоДоступа(ИмяПраваДоступа, ОбъектМетаданных) Тогда
		Возврат Ложь;
	КонецЕсли;
	
	ПолноеИмя = ОбъектМетаданных.ПолноеИмя();
	
	Если Не ОграничиватьДоступНаУровнеЗаписейУниверсально() Тогда
		Возврат ЧтениеДоступно(ПолноеИмя, ОбъектМетаданных, ОписаниеДанных, ВызыватьИсключение);
	КонецЕсли;
	
	ИдентификаторТранзакции = Новый УникальныйИдентификатор;
	ПараметрыОграничения = ПараметрыОграничения(ПолноеИмя, ИдентификаторТранзакции);
	
	УстановитьОтключениеБезопасногоРежима(Истина);
	УстановитьПривилегированныйРежим(Истина);
	
	ОбновитьРазрешенныеНаборыВПараметрахСеанса();
	
	Если ПараметрыОграничения.ОграничениеОтключено Тогда
		Возврат Истина;
	КонецЕсли;
	
	Если ПараметрыОграничения.ДоступЗапрещен Тогда
		ДоступРазрешен = Ложь;
	Иначе
		Запрос = Новый Запрос;
		УстановитьРазрешенныеНаборыВПараметрыЗапроса(Запрос);
		
		Запрос.Текст = ?(Изменение, ПараметрыОграничения.ТекстЗапросаПроверкиПравЧтениеИзменение,
			ПараметрыОграничения.ТекстЗапросаПроверкиПраваЧтение);
		
		Если ПараметрыОграничения.ЭтоСсылочныйТип Тогда
			СсылкаНаОбъект = ?(ОбщегоНазначения.ЭтоСсылка(ТипЗнч(ОписаниеДанных)),
				ОписаниеДанных, ОписаниеДанных.Ссылка);
			
			Запрос.УстановитьПараметр("Объект", СсылкаНаОбъект);
			
			Если ПараметрыОграничения.ПолеВладельца <> Неопределено Тогда
				Запрос.УстановитьПараметр("ИдентификаторТаблицыНастроекПрав",
					ПараметрыОграничения.ИдентификаторТаблицыНастроекПрав);
			КонецЕсли;
			
			ДоступРазрешен = Не Запрос.Выполнить().Пустой();
			ДанныеДляПредставления = СсылкаНаОбъект;
		Иначе
			НаборЗаписей = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПолноеИмя).СоздатьНаборЗаписей();
			
			Если ТипЗнч(ОписаниеДанных) = ТипЗнч(НаборЗаписей) Тогда
				Возврат Истина;
			КонецЕсли;
			
			Для Каждого ЭлементОтбора Из НаборЗаписей.Отбор Цикл
				ЭлементОтбора.Значение = ОписаниеДанных[ЭлементОтбора.Имя];
				ЭлементОтбора.Использование = Истина;
			КонецЦикла;
			ОтборПоИзмерениям = ОтборПоИзмерениямНабораЗаписей(НаборЗаписей, Запрос);
			ТекстЗапроса =
			"ВЫБРАТЬ ПЕРВЫЕ 1
			|	ИСТИНА КАК ЗначениеИстина
			|ИЗ
			|	&ТекущаяТаблица КАК ТекущаяТаблица
			|ГДЕ
			|	&ОтборПоИзмерениям";
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекущаяТаблица", ПолноеИмя);
			Запрос.Текст = Запрос.Текст + ОбщегоНазначения.РазделительПакетаЗапросов() + ТекстЗапроса;
			Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборПоИзмерениям", ОтборПоИзмерениям);
			
			РезультатыЗапроса = Запрос.ВыполнитьПакет();
			ДоступРазрешен = РезультатыЗапроса[0].Пустой() И Не РезультатыЗапроса[1].Пустой();
			ДанныеДляПредставления = НаборЗаписей;
		КонецЕсли;
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Ложь);
	УстановитьОтключениеБезопасногоРежима(Ложь);
	
	Если ДоступРазрешен Или Не ВызыватьИсключение Тогда
		Возврат ДоступРазрешен;
	КонецЕсли;
	
	Если Изменение Тогда
		ПравоЧтения = ДоступРазрешен(ОписаниеДанных, Ложь);
	Иначе
		ПравоЧтения = Ложь;
	КонецЕсли;
	
	СообщитьОбОшибкеДоступа(ДанныеДляПредставления, Истина, ПравоЧтения, Ложь, Ложь);
	
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

ВидыДоступаВсеРазрешеныПредставлениеПриИзменении (БСП)

ВидыДоступаВсеРазрешеныПредставлениеОбработкаВыбора (БСП)

ПользователиПриложения (БСП)

РазрешитьРаботуСВнешнимиРесурсами (БСП)

ЗаполнитьВсеРазрешеныПредставление (БСП)

ЧтениеРазрешено (БСП)

ИзменениеРазрешено (БСП)

ПроверитьЧтениеРазрешено (БСП)

ПроверитьИзменениеРазрешено (БСП)

TurboConf 6 - расширение Конфигуратора 1С