Доступ разрешен. Универсальное ограничение доступа.
////////////////////////////////////////////////////////////////////////////////
// Универсальное ограничение доступа.
Функция ДоступРазрешен(ОписаниеДанных, Изменение, ВызыватьИсключение = Ложь) Экспорт
Если Пользователи.ЭтоПолноправныйПользователь() Тогда
Возврат Истина;
КонецЕсли;
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(ОписаниеДанных));
Если ОбъектМетаданных = Неопределено Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("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
///////////////////////////////////////////////////////////////////////////////////////////////////////
ВидыДоступаВсеРазрешеныПредставлениеПриИзменении (БСП)
ВидыДоступаВсеРазрешеныПредставлениеОбработкаВыбора (БСП)
РазрешитьРаботуСВнешнимиРесурсами (БСП)
ЗаполнитьВсеРазрешеныПредставление (БСП)
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)