falsetruefalseДляОбъекта(ПолеОбъекта)// ДляОбъекта(ПолеОбъекта = "")
// Шаблон используется для ограничения элементов справочников, документов и
// других списков объектов по полю Ссылка, а также элементов зависимых списков
// объектов и записей регистров через поле объекта-владельца.
//
// Параметры:
// ПолеОбъекта - имя поля, содержащего ссылку на объект, от которого зависит элемент списка.
// Значение "" (по умолчанию) то же, что имя поля "Ссылка".
//
#Если &СпискиСОтключеннымОграничениемЧтения = "Неопределено" #Тогда
// Информационная база заблокирована для обновления.
ГДЕ ЛОЖЬ
#ИначеЕсли Не СтрСодержит(&ВерсииШаблоновОграниченияДоступа, ",ДляОбъекта9,") #Тогда
Ошибка: Требуется обновить шаблон на актуальную версию, поставляемую в роли ИзменениеУчастниковГруппДоступа по причине: Используется устаревшая версия 9 шаблона ограничения доступа ДляОбъекта. Объект: #ИмяТекущейТаблицы, Право: #ИмяТекущегоПраваДоступа.
#ИначеЕсли &СпискиСОтключеннымОграничениемЧтения = "Все" #Тогда
// У пользователя отключены все виды доступа или
// ограничение на уровне записей не используется.
ГДЕ ИСТИНА
#ИначеЕсли СтрСодержит(&СпискиСОтключеннымОграничениемЧтения, #ИмяТекущейТаблицы + ";") #Тогда
// У пользователя отключено ограничение для текущей таблицы.
ГДЕ ИСТИНА
#ИначеЕсли СтрСодержит(&ВерсииШаблоновОграниченияДоступа, ",ТребуетсяПерезапуститьСеанс,") #Тогда
Ошибка: Версия программы обновлена, требуется перезапустить сеанс. Объект: #ИмяТекущейТаблицы, Право: #ИмяТекущегоПраваДоступа.
#ИначеЕсли #ИмяТекущегоПраваДоступа <> "Чтение" #Тогда
// Проверка прав Добавление, Изменение, Удаление выполняется ПередЗаписью / ПриЗаписи.
ГДЕ ИСТИНА
#ИначеЕсли СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ";0") #Тогда
ГДЕ ЛОЖЬ
#ИначеЕсли СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ";1") #Тогда
Ошибка: Внешние пользователи отключены.
#ИначеЕсли Не СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;")
И Не СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") #Тогда
Ошибка: Требуется актуализировать ограничение доступа по причине: Не удалось определить вариант ограничения доступа в параметрах сеанса для шаблона ДляОбъекта со значением параметра "#ПолеОбъекта". Объект: #ИмяТекущейТаблицы, Право: #ИмяТекущегоПраваДоступа.
#Иначе
ТекущаяТаблица ГДЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.КлючиДоступаКОбъектам КАК КлючиДоступаКОбъектам
#Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") #Тогда
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаНаборовГруппДоступа КАК КлючиДоступаНаборовГруппДоступа
ПО
#Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
КлючиДоступаНаборовГруппДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаПользователей
#Иначе
КлючиДоступаНаборовГруппДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаВнешнихПользователей
#КонецЕсли
И КлючиДоступаНаборовГруппДоступа.НаборГруппДоступа = &РазрешенныйНаборГруппДоступа
#КонецЕсли
#Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;*") #Тогда
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаНаборовГруппДоступа КАК КлючиДоступаРазрешенногоНабораГруппДоступа
ПО
#Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
КлючиДоступаРазрешенногоНабораГруппДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаПользователей
#Иначе
КлючиДоступаРазрешенногоНабораГруппДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаВнешнихПользователей
#КонецЕсли
И КлючиДоступаРазрешенногоНабораГруппДоступа.НаборГруппДоступа = &РазрешенныйПустойНаборГруппДоступа
#КонецЕсли
#Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") #Тогда
#Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаПользователей КАК КлючиДоступаПользователей
ПО
КлючиДоступаПользователей.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаПользователей
И КлючиДоступаПользователей.Пользователь = &РазрешенныйПользователь
#Иначе
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаВнешнихПользователей КАК КлючиДоступаПользователей
ПО
КлючиДоступаПользователей.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаВнешнихПользователей
И КлючиДоступаПользователей.ВнешнийПользователь = &РазрешенныйПользователь
#КонецЕсли
#КонецЕсли
#Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;+") #Тогда
#Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаПользователей КАК КлючиДоступаНаборовГруппПользователей
ПО
КлючиДоступаНаборовГруппПользователей.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаПользователей
И КлючиДоступаНаборовГруппПользователей.Пользователь = &РазрешенныйНаборГруппПользователей
#Иначе
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаВнешнихПользователей КАК КлючиДоступаНаборовГруппПользователей
ПО
КлючиДоступаНаборовГруппПользователей.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаВнешнихПользователей
И КлючиДоступаНаборовГруппПользователей.ВнешнийПользователь = &РазрешенныйНаборГруппПользователей
#КонецЕсли
#КонецЕсли
ГДЕ
#Если "#ПолеОбъекта" = ""
Или СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;;-")
Или СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;*;-")
Или СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;;-")
Или СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;+;-") #Тогда
КлючиДоступаКОбъектам.Объект = ТекущаяТаблица.Ссылка
#Иначе
КлючиДоступаКОбъектам.Объект = ТекущаяТаблица.#ПолеОбъекта
#КонецЕсли
И (
#Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") #Тогда
НЕ КлючиДоступаНаборовГруппДоступа.КлючДоступа ЕСТЬ NULL
#Иначе
ЛОЖЬ
#КонецЕсли
#Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;*") #Тогда
ИЛИ НЕ КлючиДоступаРазрешенногоНабораГруппДоступа.КлючДоступа ЕСТЬ NULL
#КонецЕсли
#Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") #Тогда
ИЛИ НЕ КлючиДоступаПользователей.КлючДоступа ЕСТЬ NULL
#КонецЕсли
#Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;+") #Тогда
ИЛИ НЕ КлючиДоступаНаборовГруппПользователей.КлючДоступа ЕСТЬ NULL
#КонецЕсли
)
)
#Если Не СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, #ИмяТекущейТаблицы + ":Пропустить;")
И ( СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";УточнитьДляВсех;")
Или СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, #ИмяТекущейТаблицы + ":Уточнить;") ) #Тогда
#Если Не СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") #Тогда
И ИСТИНА В (ИСТИНА
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";31;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";30;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";29;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";28;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";27;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";26;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";25;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";24;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";23;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";22;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";21;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";20;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";19;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";18;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";17;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";16;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";15;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";14;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";13;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";12;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";11;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";10;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";09;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";08;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";07;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";06;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";05;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";04;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";03;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";02;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";01;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";00;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
)
#Иначе
И ИСТИНА В (ИСТИНА
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";31^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";30^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";29^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";28^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";27^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";26^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";25^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";24^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";23^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";22^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";21^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";20^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";19^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";18^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";17^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";16^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";15^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";14^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";13^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";12^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";11^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";10^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";09^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";08^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";07^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";06^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";05^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";04^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";03^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";02^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";01^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";00^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
)
#КонецЕсли
#КонецЕсли
#КонецЕслиПоЗначениям// ПоЗначениям(Таблица, -, Модификатор, В1,П1, В2,П2, ..., В(n), П(n)).
// № параметра: 1, 2, 3, 4, 5, 6, 7, ..., 2+n*2,3+n*2.
// Читается так: "ограничение доступа по значениям".
// Параметры:
// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг".
// Модификатор - изменяет шаблон.
// 1-й модификатор - строка "НеОграничиватьДоступКГруппам" указывает
// безусловно выбирать группы иерархического справочника.
// Других модификаторов в этой версии шаблона не предусмотрено.
// В(n) - Вид доступа - имя вида доступа, например, "Организации". Для полей составного типа, с целью повышения
// производительности, лучше указать несколько имен, например, "Организации,ГруппыФизическихЛиц",
// чем использовать несколько блоков параметров, с одним и тем же именем поля.
// Специальные виды доступа "Условие", "НастройкиПрав", "ПравоЧтения", "ПравоИзменения",
// "ПравоЧтенияПоИдентификатору", "ПравоИзмененияПоИдентификатору" можно использовать только отдельно.
// Когда В(n) = "Условие" (или ""), тогда П(n) содержит строку условия на языке запросов, например
// "Т.Автор = &АвторизованныйПользователь",
// "ТИПЗНАЧЕНИЯ(Т.Владелец) = ТИП(Справочник.Организации)", где Т - псевдоним текущей таблицы.
// Когда В(n) = "ПравоЧтения" Или "ПравоИзменения",
// выполняется проверка наличия права на таблицу значения Т.П(n).
// Когда В(n) = "ПравоЧтенияПоИдентификатору" или "ПравоИзмененияПоИдентификатору",
// выполняется проверка наличия права на таблицу по идентификатору в значении Т.П(n).
// П(n) - Поле проверяемого значения, кроме случая В(n) = "Условие" (или "").
// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но
// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального.
// Шаблон имеет структуру:
// <Общая часть условий> <Условие по группе параметров 1> И <Условие по группе параметров 2> И ... <Условие по группе параметров(n)>
// Пример:
// ПоЗначениям("Документ.ПоступлениеТоваровИУслуг", "", "",
// "Организации","Организация",
// "Поставщики","Контрагент", "","", ...)
#Если &ОграничениеДоступаНаУровнеЗаписейИспользуется = "" #Тогда // Информационная база заблокирована для обновления.
ГДЕ ЛОЖЬ
#ИначеЕсли Не СтрСодержит(&ВерсииШаблоновОграниченияДоступа, ",ПоЗначениям18,") #Тогда
Ошибка: Требуется обновить шаблон на актуальную версию, поставляемую в роли ИзменениеУчастниковГруппДоступа по причине: Используется устаревшая версия 18 шаблона ограничения доступа ПоЗначениям. Объект: #ИмяТекущейТаблицы, Право: #ИмяТекущегоПраваДоступа.
#Иначе
// Проверка правильности параметра Право.
#Если Не ("#Параметр(2)" = "Чтение" Или "#Параметр(2)" = "Добавление" Или
"#Параметр(2)" = "Изменение" Или "#Параметр(2)" = "Удаление" Или "#Параметр(2)" = "")
Или #ИмяТекущегоПраваДоступа <> "Чтение" И "#Параметр(2)" = "Чтение"
Или #ИмяТекущегоПраваДоступа = "Чтение" И "#Параметр(2)" <> "Чтение" И "#Параметр(2)" <> "" #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверноеПраво: #Параметр(2)
#КонецЕсли
// Проверка правильности параметра ИмяТаблицы.
#Если "#Параметр(1)" <> #ИмяТекущейТаблицы #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверноеИмяТекущейТаблицы: "#Параметр(1)"
#КонецЕсли
// Проверка правильности параметра Модификатор.
#Если Не ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" Или "#Параметр(3)" = "") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйМодификатор: #Параметр(3)
#КонецЕсли
// Общая проверка использования ограничений доступа на уровне записей и
// проверка использования хотя бы одного ограничения из указанных видов доступа.
#Если Не
( Истина
И ("#Параметр(4)" = "" И "#Параметр(5)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(4),"))
И ("#Параметр(6)" = "" И "#Параметр(7)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(6),"))
И ("#Параметр(8)" = "" И "#Параметр(9)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(8),"))
И ("#Параметр(10)" = "" И "#Параметр(11)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(10),"))
И ("#Параметр(12)" = "" И "#Параметр(13)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(12),"))
И ("#Параметр(14)" = "" И "#Параметр(15)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(14),"))
И ("#Параметр(16)" = "" И "#Параметр(17)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(16),"))
И ("#Параметр(18)" = "" И "#Параметр(19)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(18),"))
И ("#Параметр(20)" = "" И "#Параметр(21)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(20),"))
И ("#Параметр(22)" = "" И "#Параметр(23)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(22),"))
И ("#Параметр(24)" = "" И "#Параметр(25)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(24),"))
И ("#Параметр(26)" = "" И "#Параметр(27)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(26),"))
И ("#Параметр(28)" = "" И "#Параметр(29)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(28),"))
И ("#Параметр(30)" = "" И "#Параметр(31)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(30),"))
И ("#Параметр(32)" = "" И "#Параметр(33)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(32),"))
И ("#Параметр(34)" = "" И "#Параметр(35)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(34),"))
) #Тогда
Т ГДЕ // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов).
ИСТИНА В
( // Проверка права пользователя на текущую таблицу в целом.
// Права на таблицы формируются по составу ролей профиля группы доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ
#Если СтрСодержит(&ТаблицыРасширенийСОграничениемДоступа, "|#Параметр(1);") #Тогда
Справочник.ИдентификаторыОбъектовРасширений КАК СвойстваТекущейТаблицы
#Иначе
Справочник.ИдентификаторыОбъектовМетаданных КАК СвойстваТекущейТаблицы
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа
ПО
СвойстваТекущейТаблицы.ПолноеИмя = "#Параметр(1)"
И ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ
РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа
ГДЕ
ТаблицыГруппДоступа.Таблица = СвойстваТекущейТаблицы.Ссылка
И ТаблицыГруппДоступа.ГруппаДоступа = ГруппыДоступа.Ссылка
#Если #ИмяТекущегоПраваДоступа = "Изменение" #Тогда
И ТаблицыГруппДоступа.ПравоИзменение
#ИначеЕсли #ИмяТекущегоПраваДоступа = "Добавление" #Тогда
И ТаблицыГруппДоступа.ПравоДобавление
#КонецЕсли
)
И ГруппыДоступа.Ссылка В
(
ВЫБРАТЬ
ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа
ИЗ
Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = ГруппыДоступаПользователи.Пользователь
)
ГДЕ
// Безусловная выборка групп в иерархическом объекте метаданных (если нужно).
#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда
Т.ЭтоГруппа ИЛИ
#КонецЕсли
( // Поиск значений заданных полей в разрешенных значениях групп доступа (пользователей).
//// Проверка значения поля группы параметров 1.
#Если &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(4)" = "Условие" Или "#Параметр(4)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(5) )
#ИначеЕсли "#Параметр(4)" = "ПравоЧтения" Или "#Параметр(4)" = "ПравоИзменения" #Тогда
Т.#Параметр(5) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(5))
#Если Не "#Параметр(4)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(4)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(4)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(5)
#Если Не "#Параметр(4)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(4)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(5)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(5)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(4),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(4)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(4)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(4)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(4),") #Тогда
(
ЕСТЬNULL(Т.#Параметр(5), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(4),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(4),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(5)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(4),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.#Параметр(5)
#ИначеЕсли "Т.#Параметр(5)" = "Т.Ссылка"
И "#Параметр(4)" <> "Пользователи"
И "#Параметр(4)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(4)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(4)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(4),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = Т.#Параметр(5)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(5)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(5))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(Т.#Параметр(5), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
//// Проверка значения поля группы параметров 2.
#Если "#Параметр(6)" = "" И "#Параметр(7)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(6)" = "Условие" Или "#Параметр(6)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
И ( #Параметр(7) )
#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" Или "#Параметр(6)" = "ПравоИзменения" #Тогда
И Т.#Параметр(7) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(7))
#Если Не "#Параметр(6)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(6)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(6)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(7)
#Если Не "#Параметр(6)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Группа параметров отключена.
#ИначеЕсли "#Параметр(6)" = "НастройкиПрав" #Тогда
И
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(7)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(7)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(6),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(6)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(6)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(6)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(6),") #Тогда
И
(
ЕСТЬNULL(Т.#Параметр(7), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(6),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(6),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(7)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(6),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.#Параметр(7)
#ИначеЕсли "Т.#Параметр(7)" = "Т.Ссылка"
И "#Параметр(6)" <> "Пользователи"
И "#Параметр(6)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(6)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(6)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(6),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = Т.#Параметр(7)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(7)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(7))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
И ЕСТЬNULL(Т.#Параметр(7), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
//// Проверка значения поля группы параметров 3.
#Если "#Параметр(8)" = "" И "#Параметр(9)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(8)" = "Условие" Или "#Параметр(8)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
И ( #Параметр(9) )
#ИначеЕсли "#Параметр(8)" = "ПравоЧтения" Или "#Параметр(8)" = "ПравоИзменения" #Тогда
И Т.#Параметр(9) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(9))
#Если Не "#Параметр(8)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(8)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(8)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(9)
#Если Не "#Параметр(8)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Группа параметров отключена.
#ИначеЕсли "#Параметр(8)" = "НастройкиПрав" #Тогда
И
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(9)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(9)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(8),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(8)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(8)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(8)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(8),") #Тогда
И
(
ЕСТЬNULL(Т.#Параметр(9), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(8),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(8),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(9)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(8),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.#Параметр(9)
#ИначеЕсли "Т.#Параметр(9)" = "Т.Ссылка"
И "#Параметр(8)" <> "Пользователи"
И "#Параметр(8)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(8)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(8)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(8),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = Т.#Параметр(9)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(9)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(9))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
И ЕСТЬNULL(Т.#Параметр(9), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
//// Проверка значения поля группы параметров 4.
#Если "#Параметр(10)" = "" И "#Параметр(11)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(10)" = "Условие" Или "#Параметр(10)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
И ( #Параметр(11) )
#ИначеЕсли "#Параметр(10)" = "ПравоЧтения" Или "#Параметр(10)" = "ПравоИзменения" #Тогда
И Т.#Параметр(11) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(11))
#Если Не "#Параметр(10)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(10)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(10)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(11)
#Если Не "#Параметр(10)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Группа параметров отключена.
#ИначеЕсли "#Параметр(10)" = "НастройкиПрав" #Тогда
И
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(11)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(11)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(10),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(10)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(10)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(10)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(10),") #Тогда
И
(
ЕСТЬNULL(Т.#Параметр(11), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(10),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(10),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(11)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(10),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.#Параметр(11)
#ИначеЕсли "Т.#Параметр(11)" = "Т.Ссылка"
И "#Параметр(10)" <> "Пользователи"
И "#Параметр(10)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(10)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(10)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(10),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = Т.#Параметр(11)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(11)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(11))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
И ЕСТЬNULL(Т.#Параметр(11), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
//// Проверка значения поля группы параметров 5.
#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(12)" = "Условие" Или "#Параметр(12)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
И ( #Параметр(13) )
#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" Или "#Параметр(12)" = "ПравоИзменения" #Тогда
И Т.#Параметр(13) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(13))
#Если Не "#Параметр(12)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(12)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(12)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(13)
#Если Не "#Параметр(12)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Группа параметров отключена.
#ИначеЕсли "#Параметр(12)" = "НастройкиПрав" #Тогда
И
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(13)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(13)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(12),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(12)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(12)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(12)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(12),") #Тогда
И
(
ЕСТЬNULL(Т.#Параметр(13), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(12),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(12),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(13)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(12),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.#Параметр(13)
#ИначеЕсли "Т.#Параметр(13)" = "Т.Ссылка"
И "#Параметр(12)" <> "Пользователи"
И "#Параметр(12)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(12)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(12)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(12),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = Т.#Параметр(13)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(13)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(13))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
И ЕСТЬNULL(Т.#Параметр(13), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
//// Проверка значения поля группы параметров 6.
#Если "#Параметр(14)" = "" И "#Параметр(15)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(14)" = "Условие" Или "#Параметр(14)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
И ( #Параметр(15) )
#ИначеЕсли "#Параметр(14)" = "ПравоЧтения" Или "#Параметр(14)" = "ПравоИзменения" #Тогда
И Т.#Параметр(15) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(15))
#Если Не "#Параметр(14)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(14)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(14)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(15)
#Если Не "#Параметр(14)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Группа параметров отключена.
#ИначеЕсли "#Параметр(14)" = "НастройкиПрав" #Тогда
И
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(15)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(15)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(14),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(14)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(14)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(14)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(14),") #Тогда
И
(
ЕСТЬNULL(Т.#Параметр(15), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(14),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(14),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(15)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(14),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.#Параметр(15)
#ИначеЕсли "Т.#Параметр(15)" = "Т.Ссылка"
И "#Параметр(14)" <> "Пользователи"
И "#Параметр(14)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(14)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(14)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(14),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = Т.#Параметр(15)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(15)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(15))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
И ЕСТЬNULL(Т.#Параметр(15), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
//// Проверка значения поля группы параметров 7.
#Если "#Параметр(16)" = "" И "#Параметр(17)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(16)" = "Условие" Или "#Параметр(16)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
И ( #Параметр(17) )
#ИначеЕсли "#Параметр(16)" = "ПравоЧтения" Или "#Параметр(16)" = "ПравоИзменения" #Тогда
И Т.#Параметр(17) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(17))
#Если Не "#Параметр(16)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(16)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(16)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(17)
#Если Не "#Параметр(16)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Группа параметров отключена.
#ИначеЕсли "#Параметр(16)" = "НастройкиПрав" #Тогда
И
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(17)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(17)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(16),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(16)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(16)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(16)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(16),") #Тогда
И
(
ЕСТЬNULL(Т.#Параметр(17), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(16),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(16),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(17)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(16),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.#Параметр(17)
#ИначеЕсли "Т.#Параметр(17)" = "Т.Ссылка"
И "#Параметр(16)" <> "Пользователи"
И "#Параметр(16)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(16)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(16)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(16),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = Т.#Параметр(17)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(17)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(17))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
И ЕСТЬNULL(Т.#Параметр(17), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
//// Проверка значения поля группы параметров 8.
#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(18)" = "Условие" Или "#Параметр(18)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
И ( #Параметр(19) )
#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" Или "#Параметр(18)" = "ПравоИзменения" #Тогда
И Т.#Параметр(19) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(19))
#Если Не "#Параметр(18)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(18)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(18)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(19)
#Если Не "#Параметр(18)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Группа параметров отключена.
#ИначеЕсли "#Параметр(18)" = "НастройкиПрав" #Тогда
И
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(19)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(19)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(18),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(18)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(18)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(18)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(18),") #Тогда
И
(
ЕСТЬNULL(Т.#Параметр(19), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(18),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(18),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(19)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(18),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.#Параметр(19)
#ИначеЕсли "Т.#Параметр(19)" = "Т.Ссылка"
И "#Параметр(18)" <> "Пользователи"
И "#Параметр(18)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(18)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(18)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(18),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = Т.#Параметр(19)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(19)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(19))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
И ЕСТЬNULL(Т.#Параметр(19), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
//// Проверка значения поля группы параметров 9.
#Если "#Параметр(20)" = "" И "#Параметр(21)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(20)" = "Условие" Или "#Параметр(20)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
И ( #Параметр(21) )
#ИначеЕсли "#Параметр(20)" = "ПравоЧтения" Или "#Параметр(20)" = "ПравоИзменения" #Тогда
И Т.#Параметр(21) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(21))
#Если Не "#Параметр(20)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(20)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(20)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(21)
#Если Не "#Параметр(20)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Группа параметров отключена.
#ИначеЕсли "#Параметр(20)" = "НастройкиПрав" #Тогда
И
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(21)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(21)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(20),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(20)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(20)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(20)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(20),") #Тогда
И
(
ЕСТЬNULL(Т.#Параметр(21), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(20),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(20),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(21)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(20),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.#Параметр(21)
#ИначеЕсли "Т.#Параметр(21)" = "Т.Ссылка"
И "#Параметр(20)" <> "Пользователи"
И "#Параметр(20)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(20)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(20)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(20),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = Т.#Параметр(21)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(21)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(21))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
И ЕСТЬNULL(Т.#Параметр(21), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
//// Проверка значения поля группы параметров 10.
#Если "#Параметр(22)" = "" И "#Параметр(23)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(22)" = "Условие" Или "#Параметр(22)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
И ( #Параметр(23) )
#ИначеЕсли "#Параметр(22)" = "ПравоЧтения" Или "#Параметр(22)" = "ПравоИзменения" #Тогда
И Т.#Параметр(23) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(23))
#Если Не "#Параметр(22)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(22)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(22)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(23)
#Если Не "#Параметр(22)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Группа параметров отключена.
#ИначеЕсли "#Параметр(22)" = "НастройкиПрав" #Тогда
И
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(23)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(23)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(22),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(22)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(22)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(22)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(22),") #Тогда
И
(
ЕСТЬNULL(Т.#Параметр(23), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(22),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(22),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(23)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(22),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.#Параметр(23)
#ИначеЕсли "Т.#Параметр(23)" = "Т.Ссылка"
И "#Параметр(22)" <> "Пользователи"
И "#Параметр(22)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(22)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(22)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(22),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = Т.#Параметр(23)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(23)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(23))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
И ЕСТЬNULL(Т.#Параметр(23), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
//// Проверка значения поля группы параметров 11.
#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(24)" = "Условие" Или "#Параметр(24)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
И ( #Параметр(25) )
#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" Или "#Параметр(24)" = "ПравоИзменения" #Тогда
И Т.#Параметр(25) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(25))
#Если Не "#Параметр(24)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(24)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(24)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(25)
#Если Не "#Параметр(24)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Группа параметров отключена.
#ИначеЕсли "#Параметр(24)" = "НастройкиПрав" #Тогда
И
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(25)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(25)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(24),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(24)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(24)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(24)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(24),") #Тогда
И
(
ЕСТЬNULL(Т.#Параметр(25), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(24),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(24),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(25)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(24),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.#Параметр(25)
#ИначеЕсли "Т.#Параметр(25)" = "Т.Ссылка"
И "#Параметр(24)" <> "Пользователи"
И "#Параметр(24)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(24)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(24)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(24),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = Т.#Параметр(25)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(25)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(25))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
И ЕСТЬNULL(Т.#Параметр(25), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
//// Проверка значения поля группы параметров 12.
#Если "#Параметр(26)" = "" И "#Параметр(27)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(26)" = "Условие" Или "#Параметр(26)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
И ( #Параметр(27) )
#ИначеЕсли "#Параметр(26)" = "ПравоЧтения" Или "#Параметр(26)" = "ПравоИзменения" #Тогда
И Т.#Параметр(27) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(27))
#Если Не "#Параметр(26)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(26)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(26)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(27)
#Если Не "#Параметр(26)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Группа параметров отключена.
#ИначеЕсли "#Параметр(26)" = "НастройкиПрав" #Тогда
И
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(27)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(27)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(26),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(26)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(26)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(26)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(26),") #Тогда
И
(
ЕСТЬNULL(Т.#Параметр(27), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(26),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(26),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(27)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(26),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.#Параметр(27)
#ИначеЕсли "Т.#Параметр(27)" = "Т.Ссылка"
И "#Параметр(26)" <> "Пользователи"
И "#Параметр(26)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(26)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(26)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(26),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = Т.#Параметр(27)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(27)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(27))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
И ЕСТЬNULL(Т.#Параметр(27), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
//// Проверка значения поля группы параметров 13.
#Если "#Параметр(28)" = "" И "#Параметр(29)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(28)" = "Условие" Или "#Параметр(28)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
И ( #Параметр(29) )
#ИначеЕсли "#Параметр(28)" = "ПравоЧтения" Или "#Параметр(28)" = "ПравоИзменения" #Тогда
И Т.#Параметр(29) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(29))
#Если Не "#Параметр(28)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(28)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(28)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(29)
#Если Не "#Параметр(28)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Группа параметров отключена.
#ИначеЕсли "#Параметр(28)" = "НастройкиПрав" #Тогда
И
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(29)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(29)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(28),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(28)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(28)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(28)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(28),") #Тогда
И
(
ЕСТЬNULL(Т.#Параметр(29), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(28),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(28),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(29)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(28),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.#Параметр(29)
#ИначеЕсли "Т.#Параметр(29)" = "Т.Ссылка"
И "#Параметр(28)" <> "Пользователи"
И "#Параметр(28)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(28)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(28)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(28),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = Т.#Параметр(29)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(29)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(29))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
И ЕСТЬNULL(Т.#Параметр(29), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
//// Проверка значения поля группы параметров 14.
#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(30)" = "Условие" Или "#Параметр(30)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
И ( #Параметр(31) )
#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" Или "#Параметр(30)" = "ПравоИзменения" #Тогда
И Т.#Параметр(31) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(31))
#Если Не "#Параметр(30)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(30)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(30)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(31)
#Если Не "#Параметр(30)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Группа параметров отключена.
#ИначеЕсли "#Параметр(30)" = "НастройкиПрав" #Тогда
И
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(31)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(31)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(30),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(30)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(30)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(30)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(30),") #Тогда
И
(
ЕСТЬNULL(Т.#Параметр(31), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(30),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(30),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(31)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(30),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.#Параметр(31)
#ИначеЕсли "Т.#Параметр(31)" = "Т.Ссылка"
И "#Параметр(30)" <> "Пользователи"
И "#Параметр(30)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(30)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(30)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(30),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = Т.#Параметр(31)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(31)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(31))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
И ЕСТЬNULL(Т.#Параметр(31), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
//// Проверка значения поля группы параметров 15.
#Если "#Параметр(32)" = "" И "#Параметр(33)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(32)" = "Условие" Или "#Параметр(32)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
И ( #Параметр(33) )
#ИначеЕсли "#Параметр(32)" = "ПравоЧтения" Или "#Параметр(32)" = "ПравоИзменения" #Тогда
И Т.#Параметр(33) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(33))
#Если Не "#Параметр(32)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(32)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(32)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(33)
#Если Не "#Параметр(32)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Группа параметров отключена.
#ИначеЕсли "#Параметр(32)" = "НастройкиПрав" #Тогда
И
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(33)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(33)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(32),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(32)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(32)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(32)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(32),") #Тогда
И
(
ЕСТЬNULL(Т.#Параметр(33), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(32),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(32),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(33)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(32),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.#Параметр(33)
#ИначеЕсли "Т.#Параметр(33)" = "Т.Ссылка"
И "#Параметр(32)" <> "Пользователи"
И "#Параметр(32)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(32)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(32)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(32),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = Т.#Параметр(33)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(33)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(33))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
И ЕСТЬNULL(Т.#Параметр(33), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
//// Проверка значения поля группы параметров 16.
#Если "#Параметр(34)" = "" И "#Параметр(35)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(34)" = "Условие" Или "#Параметр(34)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
И ( #Параметр(35) )
#ИначеЕсли "#Параметр(34)" = "ПравоЧтения" Или "#Параметр(34)" = "ПравоИзменения" #Тогда
И Т.#Параметр(35) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(35))
#Если Не "#Параметр(34)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(34)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(34)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(35)
#Если Не "#Параметр(34)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Группа параметров отключена.
#ИначеЕсли "#Параметр(34)" = "НастройкиПрав" #Тогда
И
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(35)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = Т.#Параметр(35)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(34),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(34)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(34)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(34)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(34),") #Тогда
И
(
ЕСТЬNULL(Т.#Параметр(35), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(34),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(34),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(35)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(34),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.#Параметр(35)
#ИначеЕсли "Т.#Параметр(35)" = "Т.Ссылка"
И "#Параметр(34)" <> "Пользователи"
И "#Параметр(34)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(34)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(34)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(34),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = Т.#Параметр(35)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(35)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(35))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
И ЕСТЬNULL(Т.#Параметр(35), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
)
)
#КонецЕсли
#КонецЕсли // Информационная база заблокирована для обновления.ПоЗначениямИНаборамРасширенный// ПоЗначениямИНаборамРасширенный(Таблица, -, Модификатор, ПрисоединяемыеТаблицы, О, В1,П1,О1, В2,П2,О2,..., В(n), П(n), О(n)).
// № параметра: 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,...,3+n*3,4+n*3,5+n*3.
// Читается так: "ограничение доступа по значениям и наборам расширенный".
// Параметры:
// Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг".
// Модификатор - изменяет шаблон.
// 1-й модификатор - строка "НеОграничиватьДоступКГруппам" указывает
// безусловно выбирать группы иерархического справочника.
// 2-й модификатор - строка "РасширенноеИЛИ" указывает для ограничений,
// например, "ПоОрганизациям или ПоУчетнымЗаписям" делать расширенную
// проверку, при которой вариант настройки вида доступа в группах доступа
// "Все разрешены, без запрещенных" считается, как "Вид доступа не используется".
// Если этого модификатора нет, тогда результат проверки Истина, что приводит
// к итоговому результату Истина, если "Все разрешены, без запрещенных"
// хотя бы по одному из видов доступа (либо ПоОрганизациям, либо ПоУчетнымЗаписям).
// Модификатор имеет смысл только при проверке наборов значений доступа.
// Можно использовать комбинации модификаторов: "НеОграничиватьДоступКГруппам",
// "РасширенноеИЛИ", "НеОграничиватьДоступКГруппам,РасширенноеИЛИ".
// Других модификаторов в этой версии шаблона не предусмотрено.
// ПрисоединяемыеТаблицы - текст присоедиения дополнительных таблиц на языке запросов, например,
// "ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет.ОплатаПоставщикам КАК Т1
// ПО Т.Ссылка = Т1.Ссылка".
// Присоединение позволяет указать поля таблицы ОплатаПоставщикам, как поля основной таблицы
// для проверки их значений, как значений основной таблицы.
// Следует помнить, что при размножении строк в результате соединения, достаточно чтобы
// всего одна строка прошла условия проверки, т.е. результаты проверки строк объединяются по "ИЛИ".
// О - Начальные скобки "(".
// В(n) - Вид доступа - имя вида доступа, например, "Организации". Для полей составного типа, с целью повышения
// производительности, лучше указать несколько имен, например, "Организации,ГруппыФизическихЛиц",
// чем использовать несколько блоков параметров, с одним и тем же именем поля.
// Специальные виды доступа "Объект", "Условие", "НастройкиПрав", "ПравоЧтения", "ПравоИзменения",
// "ПравоЧтенияПоИдентификатору", "ПравоИзмененияПоИдентификатору" можно использовать только отдельно.
// Когда В(n) = "Условие" (или ""), Тогда П(n) содержит строку условия на языке запросов, например
// "Т.Автор = &АвторизованныйПользователь",
// "ТИПЗНАЧЕНИЯ(Т.Владелец) = ТИП(Справочник.Организации)", где Т - псевдоним текущей таблицы.
// Когда В(n) = "ПравоЧтения" Или "ПравоИзменения",
// выполняется проверка наличия права на таблицу значения Т.П(n).
// Когда В(n) = "ПравоЧтенияПоИдентификатору" или "ПравоИзмененияПоИдентификатору",
// выполняется проверка наличия права на таблицу по идентификатору в значении Т.П(n).
// Когда В(n) = "Объект" (или " "), то
// когда есть запись зависимости прав в регистре сведений ЗависимостиПравДоступа тогда
// выполняется проверка права чтения Т.П(n) и наборов значений доступа
// в регистре сведений НаборыЗначенийДоступа, считываемых по ссылке Т.П(n) для права чтения;
// иначе используется стандартное правило:
// когда Право = "Чтение" тогда выполняется проверка права чтения Т.П(n) и наборов значений доступа
// в регистре сведений НаборыЗначенийДоступа, считываемых по ссылке Т.П(n) для права чтения;
// когда Право = "Изменение" тогда выполняется проверка права изменения Т.П(n)
// и наборов значений доступа, считываемых по ссылке Т.П(n) для права изменения.
// П(n) - Поле проверяемого значения с псевдонимом, например "Т.Организация",
// кроме случая В(n) = "Условие" (или "").
// О(n) - Логические операции "И", "ИЛИ" в сочетании с скобками "(", ")".
// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но
// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального.
// Шаблон имеет структуру:
// <Соединение по таблице1> <Соединение по таблице2> ... <Соединение по таблице(m)>
// <Общая часть условий> <Условие по группе параметров 1> И/ИЛИ <Условие по группе параметров 1> И/ИЛИ ... <Условие по группе параметров(n)>
// Пример:
// ПоЗначениямИНаборамРасширенный("ЖурналДокументов.СкладскиеДокументы", "", "",
// "",
// "",
// "Объект","Т.Ссылка","И",
// "Объект","Т.ОсновнойДокумент","", "","","", ...)
#Если &ОграничениеДоступаНаУровнеЗаписейИспользуется = "" #Тогда // Информационная база заблокирована для обновления.
ГДЕ ЛОЖЬ
#ИначеЕсли Не СтрСодержит(&ВерсииШаблоновОграниченияДоступа, ",ПоЗначениямИНаборамРасширенный18,") #Тогда
Ошибка: Требуется обновить шаблон на актуальную версию, поставляемую в роли ИзменениеУчастниковГруппДоступа по причине: Используется устаревшая версия 18 шаблона ограничения доступа ПоЗначениямИНаборамРасширенный. Объект: #ИмяТекущейТаблицы, Право: #ИмяТекущегоПраваДоступа.
#Иначе
// Проверка правильности параметра Право.
#Если Не ("#Параметр(2)" = "Чтение" Или "#Параметр(2)" = "Добавление" Или
"#Параметр(2)" = "Изменение" Или "#Параметр(2)" = "Удаление" Или "#Параметр(2)" = "")
Или #ИмяТекущегоПраваДоступа <> "Чтение" И "#Параметр(2)" = "Чтение"
Или #ИмяТекущегоПраваДоступа = "Чтение" И "#Параметр(2)" <> "Чтение" И "#Параметр(2)" <> "" #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверноеПраво: #Параметр(2)
#КонецЕсли
// Проверка правильности параметра ИмяТаблицы.
#Если "#Параметр(1)" <> #ИмяТекущейТаблицы #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверноеИмяТекущейТаблицы: "#Параметр(1)"
#КонецЕсли
// Проверка правильности параметра Модификатор.
#Если Не ( "#Параметр(3)" = "НеОграничиватьДоступКГруппам"
Или "#Параметр(3)" = "РасширенноеИЛИ"
Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ"
Или "#Параметр(3)" = "") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйМодификатор: #Параметр(3)
#КонецЕсли
// Общая проверка использования ограничений доступа на уровне записей и
// проверка использования хотя бы одного ограничения из указанных видов доступа.
#Если Не
( Истина
И ("#Параметр(6)" = "" И "#Параметр(7)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(6),"))
И ("#Параметр(9)" = "" И "#Параметр(10)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(9),"))
И ("#Параметр(12)" = "" И "#Параметр(13)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(12),"))
И ("#Параметр(15)" = "" И "#Параметр(16)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(15),"))
И ("#Параметр(18)" = "" И "#Параметр(19)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(18),"))
И ("#Параметр(21)" = "" И "#Параметр(22)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(21),"))
И ("#Параметр(24)" = "" И "#Параметр(25)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(24),"))
И ("#Параметр(27)" = "" И "#Параметр(28)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(27),"))
И ("#Параметр(30)" = "" И "#Параметр(31)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(30),"))
И ("#Параметр(33)" = "" И "#Параметр(34)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(33),"))
И ("#Параметр(36)" = "" И "#Параметр(37)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(36),"))
И ("#Параметр(39)" = "" И "#Параметр(40)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(39),"))
И ("#Параметр(42)" = "" И "#Параметр(43)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(42),"))
И ("#Параметр(45)" = "" И "#Параметр(46)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(45),"))
И ("#Параметр(48)" = "" И "#Параметр(49)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(48),"))
И ("#Параметр(51)" = "" И "#Параметр(52)" = ""
Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(51),"))
) #Тогда
Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов).
// Присоединяемые таблицы к проверяемой строке текущей таблицы "Т".
#Параметр(4)
ГДЕ
ИСТИНА В
( // Проверка права пользователя на текущую таблицу в целом.
// Права на таблицы формируются по составу ролей профиля группы доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ
#Если СтрСодержит(&ТаблицыРасширенийСОграничениемДоступа, "|#Параметр(1);") #Тогда
Справочник.ИдентификаторыОбъектовРасширений КАК СвойстваТекущейТаблицы
#Иначе
Справочник.ИдентификаторыОбъектовМетаданных КАК СвойстваТекущейТаблицы
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа
ПО
СвойстваТекущейТаблицы.ПолноеИмя = "#Параметр(1)"
И ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ
РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа
ГДЕ
ТаблицыГруппДоступа.Таблица = СвойстваТекущейТаблицы.Ссылка
И ТаблицыГруппДоступа.ГруппаДоступа = ГруппыДоступа.Ссылка
#Если #ИмяТекущегоПраваДоступа = "Изменение" #Тогда
И ТаблицыГруппДоступа.ПравоИзменение
#ИначеЕсли #ИмяТекущегоПраваДоступа = "Добавление" #Тогда
И ТаблицыГруппДоступа.ПравоДобавление
#КонецЕсли
)
И ГруппыДоступа.Ссылка В
(
ВЫБРАТЬ
ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа
ИЗ
Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = ГруппыДоступаПользователи.Пользователь
)
ГДЕ
// Безусловная выборка групп в иерархическом объекте метаданных (если нужно).
#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
Т.ЭтоГруппа ИЛИ
#КонецЕсли
( // Поиск значений заданных полей в разрешенных значениях групп доступа (пользователей).
#Параметр(5) // [([(][(]...] 0-n открывающихся скобок.
//// Проверка значения поля группы параметров 1.
#Если &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(6)" = "Условие" Или "#Параметр(6)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(7) )
#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" Или "#Параметр(6)" = "ПравоИзменения" #Тогда
#Параметр(7) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(7))
#Если Не "#Параметр(6)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(6)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(6)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(7)
#Если Не "#Параметр(6)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(6)" = "Объект" Или "#Параметр(6)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(7))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(7))
)
)
#КонецЕсли
)
)
#Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(7))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(7))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(7)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(7)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(7)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(7))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(7)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(7)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(7))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(7)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(7)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(6)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(7)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(7)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(6),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(6)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(6)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(6)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(6),") #Тогда
(
ЕСТЬNULL(#Параметр(7), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(6),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(6),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(7)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(6),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(7)
#ИначеЕсли "#Параметр(7)" = "Т.Ссылка"
И "#Параметр(6)" <> "Пользователи"
И "#Параметр(6)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(6)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(6)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(6),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(7)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(7)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(7))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(7), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(8) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 2.
#Если "#Параметр(9)" = "" И "#Параметр(10)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(9)" = "Условие" Или "#Параметр(9)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(10) )
#ИначеЕсли "#Параметр(9)" = "ПравоЧтения" Или "#Параметр(9)" = "ПравоИзменения" #Тогда
#Параметр(10) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(10))
#Если Не "#Параметр(9)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(9)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(9)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(10)
#Если Не "#Параметр(9)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(9)" = "Объект" Или "#Параметр(9)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(10))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(10))
)
)
#КонецЕсли
)
)
#Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(10))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(10))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(10)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(10)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(10)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(10))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(10)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(10)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(10))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(10)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(10)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(9)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(10)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(10)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(9),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(9)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(9)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(9)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(9),") #Тогда
(
ЕСТЬNULL(#Параметр(10), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(9),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(9),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(10)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(9),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(10)
#ИначеЕсли "#Параметр(10)" = "Т.Ссылка"
И "#Параметр(9)" <> "Пользователи"
И "#Параметр(9)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(9)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(9)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(9),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(10)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(10)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(10))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(10), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(11) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 3.
#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(12)" = "Условие" Или "#Параметр(12)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(13) )
#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" Или "#Параметр(12)" = "ПравоИзменения" #Тогда
#Параметр(13) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(13))
#Если Не "#Параметр(12)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(12)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(12)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(13)
#Если Не "#Параметр(12)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(12)" = "Объект" Или "#Параметр(12)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(13))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(13))
)
)
#КонецЕсли
)
)
#Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(13))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(13))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(13)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(13)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(13)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(13))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(13)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(13)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(13))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(13)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(13)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(12)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(13)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(13)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(12),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(12)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(12)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(12)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(12),") #Тогда
(
ЕСТЬNULL(#Параметр(13), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(12),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(12),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(13)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(12),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(13)
#ИначеЕсли "#Параметр(13)" = "Т.Ссылка"
И "#Параметр(12)" <> "Пользователи"
И "#Параметр(12)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(12)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(12)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(12),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(13)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(13)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(13))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(13), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(14) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 4.
#Если "#Параметр(15)" = "" И "#Параметр(16)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(15)" = "Условие" Или "#Параметр(15)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(16) )
#ИначеЕсли "#Параметр(15)" = "ПравоЧтения" Или "#Параметр(15)" = "ПравоИзменения" #Тогда
#Параметр(16) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(16))
#Если Не "#Параметр(15)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(15)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(15)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(16)
#Если Не "#Параметр(15)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(15)" = "Объект" Или "#Параметр(15)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(16))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(16))
)
)
#КонецЕсли
)
)
#Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(16))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(16))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(16)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(16)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(16)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(16))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(16)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(16)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(16))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(16)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(16)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(15)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(16)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(16)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(15),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(15)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(15)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(15)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(15),") #Тогда
(
ЕСТЬNULL(#Параметр(16), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(15),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(15),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(16)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(15),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(16)
#ИначеЕсли "#Параметр(16)" = "Т.Ссылка"
И "#Параметр(15)" <> "Пользователи"
И "#Параметр(15)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(15)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(15)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(15),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(16)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(16)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(16))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(16), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(17) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 5.
#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(18)" = "Условие" Или "#Параметр(18)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(19) )
#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" Или "#Параметр(18)" = "ПравоИзменения" #Тогда
#Параметр(19) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(19))
#Если Не "#Параметр(18)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(18)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(18)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(19)
#Если Не "#Параметр(18)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(18)" = "Объект" Или "#Параметр(18)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(19))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(19))
)
)
#КонецЕсли
)
)
#Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(19))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(19))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(19)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(19)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(19)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(19))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(19)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(19)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(19))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(19)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(19)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(18)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(19)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(19)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(18),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(18)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(18)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(18)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(18),") #Тогда
(
ЕСТЬNULL(#Параметр(19), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(18),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(18),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(19)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(18),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(19)
#ИначеЕсли "#Параметр(19)" = "Т.Ссылка"
И "#Параметр(18)" <> "Пользователи"
И "#Параметр(18)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(18)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(18)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(18),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(19)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(19)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(19))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(19), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(20) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 6.
#Если "#Параметр(21)" = "" И "#Параметр(22)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(21)" = "Условие" Или "#Параметр(21)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(22) )
#ИначеЕсли "#Параметр(21)" = "ПравоЧтения" Или "#Параметр(21)" = "ПравоИзменения" #Тогда
#Параметр(22) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(22))
#Если Не "#Параметр(21)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(21)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(21)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(22)
#Если Не "#Параметр(21)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(21)" = "Объект" Или "#Параметр(21)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(22))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(22))
)
)
#КонецЕсли
)
)
#Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(22))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(22))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(22)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(22)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(22)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(22))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(22)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(22)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(22))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(22)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(22)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(21)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(22)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(22)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(21),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(21)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(21)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(21)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(21),") #Тогда
(
ЕСТЬNULL(#Параметр(22), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(21),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(21),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(22)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(21),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(22)
#ИначеЕсли "#Параметр(22)" = "Т.Ссылка"
И "#Параметр(21)" <> "Пользователи"
И "#Параметр(21)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(21)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(21)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(21),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(22)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(22)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(22))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(22), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(23) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 7.
#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(24)" = "Условие" Или "#Параметр(24)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(25) )
#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" Или "#Параметр(24)" = "ПравоИзменения" #Тогда
#Параметр(25) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(25))
#Если Не "#Параметр(24)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(24)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(24)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(25)
#Если Не "#Параметр(24)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(24)" = "Объект" Или "#Параметр(24)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(25))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(25))
)
)
#КонецЕсли
)
)
#Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(25))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(25))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(25)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(25)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(25)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(25))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(25)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(25)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(25))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(25)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(25)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(24)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(25)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(25)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(24),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(24)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(24)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(24)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(24),") #Тогда
(
ЕСТЬNULL(#Параметр(25), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(24),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(24),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(25)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(24),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(25)
#ИначеЕсли "#Параметр(25)" = "Т.Ссылка"
И "#Параметр(24)" <> "Пользователи"
И "#Параметр(24)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(24)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(24)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(24),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(25)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(25)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(25))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(25), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(26) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 8.
#Если "#Параметр(27)" = "" И "#Параметр(28)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(27)" = "Условие" Или "#Параметр(27)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(28) )
#ИначеЕсли "#Параметр(27)" = "ПравоЧтения" Или "#Параметр(27)" = "ПравоИзменения" #Тогда
#Параметр(28) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(28))
#Если Не "#Параметр(27)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(27)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(27)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(28)
#Если Не "#Параметр(27)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(27)" = "Объект" Или "#Параметр(27)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(28))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(28))
)
)
#КонецЕсли
)
)
#Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(28))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(28))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(28)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(28)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(28)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(28))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(28)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(28)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(28))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(28)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(28)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(27)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(28)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(28)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(27),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(27)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(27)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(27)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(27),") #Тогда
(
ЕСТЬNULL(#Параметр(28), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(27),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(27),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(28)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(27),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(28)
#ИначеЕсли "#Параметр(28)" = "Т.Ссылка"
И "#Параметр(27)" <> "Пользователи"
И "#Параметр(27)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(27)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(27)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(27),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(28)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(28)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(28))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(28), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(29) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 9.
#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(30)" = "Условие" Или "#Параметр(30)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(31) )
#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" Или "#Параметр(30)" = "ПравоИзменения" #Тогда
#Параметр(31) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(31))
#Если Не "#Параметр(30)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(30)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(30)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(31)
#Если Не "#Параметр(30)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(30)" = "Объект" Или "#Параметр(30)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(31))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(31))
)
)
#КонецЕсли
)
)
#Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(31))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(31))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(31)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(31)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(31)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(31))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(31)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(31)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(31))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(31)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(31)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(30)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(31)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(31)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(30),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(30)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(30)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(30)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(30),") #Тогда
(
ЕСТЬNULL(#Параметр(31), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(30),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(30),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(31)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(30),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(31)
#ИначеЕсли "#Параметр(31)" = "Т.Ссылка"
И "#Параметр(30)" <> "Пользователи"
И "#Параметр(30)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(30)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(30)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(30),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(31)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(31)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(31))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(31), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(32) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 10.
#Если "#Параметр(33)" = "" И "#Параметр(34)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(33)" = "Условие" Или "#Параметр(33)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(34) )
#ИначеЕсли "#Параметр(33)" = "ПравоЧтения" Или "#Параметр(33)" = "ПравоИзменения" #Тогда
#Параметр(34) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(34))
#Если Не "#Параметр(33)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(33)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(33)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(34)
#Если Не "#Параметр(33)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(33)" = "Объект" Или "#Параметр(33)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(34))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(34))
)
)
#КонецЕсли
)
)
#Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(34))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(34))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(34)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(34)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(34)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(34))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(34)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(34)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(34))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(34)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(34)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(33)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(34)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(34)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(33),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(33)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(33)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(33)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(33),") #Тогда
(
ЕСТЬNULL(#Параметр(34), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(33),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(33),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(34)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(33),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(34)
#ИначеЕсли "#Параметр(34)" = "Т.Ссылка"
И "#Параметр(33)" <> "Пользователи"
И "#Параметр(33)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(33)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(33)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(33),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(34)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(34)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(34))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(34), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(35) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 11.
#Если "#Параметр(36)" = "" И "#Параметр(37)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(36)" = "Условие" Или "#Параметр(36)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(37) )
#ИначеЕсли "#Параметр(36)" = "ПравоЧтения" Или "#Параметр(36)" = "ПравоИзменения" #Тогда
#Параметр(37) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(37))
#Если Не "#Параметр(36)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(36)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(36)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(37)
#Если Не "#Параметр(36)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(36)" = "Объект" Или "#Параметр(36)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(37))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(37))
)
)
#КонецЕсли
)
)
#Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(37))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(37))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(37)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(37)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(37)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(37))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(37)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(37)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(37))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(37)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(37)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(36)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(37)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(37)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(36),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(36)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(36)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(36)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(36),") #Тогда
(
ЕСТЬNULL(#Параметр(37), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(36),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(36),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(37)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(36),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(37)
#ИначеЕсли "#Параметр(37)" = "Т.Ссылка"
И "#Параметр(36)" <> "Пользователи"
И "#Параметр(36)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(36)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(36)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(36),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(37)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(37)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(37))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(37), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(38) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 12.
#Если "#Параметр(39)" = "" И "#Параметр(40)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(39)" = "Условие" Или "#Параметр(39)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(40) )
#ИначеЕсли "#Параметр(39)" = "ПравоЧтения" Или "#Параметр(39)" = "ПравоИзменения" #Тогда
#Параметр(40) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(40))
#Если Не "#Параметр(39)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(39)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(39)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(40)
#Если Не "#Параметр(39)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(39)" = "Объект" Или "#Параметр(39)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(40))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(40))
)
)
#КонецЕсли
)
)
#Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(40))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(40))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(40)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(40)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(40)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(40))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(40)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(40)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(40))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(40)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(40)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(39)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(40)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(40)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(39),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(39)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(39)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(39)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(39),") #Тогда
(
ЕСТЬNULL(#Параметр(40), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(39),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(39),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(40)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(39),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(40)
#ИначеЕсли "#Параметр(40)" = "Т.Ссылка"
И "#Параметр(39)" <> "Пользователи"
И "#Параметр(39)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(39)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(39)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(39),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(40)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(40)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(40))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(40), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(41) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 13.
#Если "#Параметр(42)" = "" И "#Параметр(43)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(42)" = "Условие" Или "#Параметр(42)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(43) )
#ИначеЕсли "#Параметр(42)" = "ПравоЧтения" Или "#Параметр(42)" = "ПравоИзменения" #Тогда
#Параметр(43) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(43))
#Если Не "#Параметр(42)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(42)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(42)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(43)
#Если Не "#Параметр(42)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(42)" = "Объект" Или "#Параметр(42)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(43))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(43))
)
)
#КонецЕсли
)
)
#Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(43))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(43))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(43)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(43)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(43)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(43))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(43)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(43)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(43))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(43)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(43)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(42)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(43)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(43)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(42),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(42)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(42)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(42)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(42),") #Тогда
(
ЕСТЬNULL(#Параметр(43), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(42),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(42),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(43)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(42),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(43)
#ИначеЕсли "#Параметр(43)" = "Т.Ссылка"
И "#Параметр(42)" <> "Пользователи"
И "#Параметр(42)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(42)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(42)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(42),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(43)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(43)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(43))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(43), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(44) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 14.
#Если "#Параметр(45)" = "" И "#Параметр(46)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(45)" = "Условие" Или "#Параметр(45)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(46) )
#ИначеЕсли "#Параметр(45)" = "ПравоЧтения" Или "#Параметр(45)" = "ПравоИзменения" #Тогда
#Параметр(46) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(46))
#Если Не "#Параметр(45)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(45)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(45)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(46)
#Если Не "#Параметр(45)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(45)" = "Объект" Или "#Параметр(45)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(46))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(46))
)
)
#КонецЕсли
)
)
#Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(46))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(46))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(46)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(46)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(46)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(46))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(46)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(46)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(46))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(46)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(46)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(45)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(46)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(46)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(45),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(45)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(45)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(45)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(45),") #Тогда
(
ЕСТЬNULL(#Параметр(46), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(45),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(45),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(46)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(45),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(46)
#ИначеЕсли "#Параметр(46)" = "Т.Ссылка"
И "#Параметр(45)" <> "Пользователи"
И "#Параметр(45)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(45)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(45)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(45),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(46)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(46)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(46))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(46), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(47) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 15.
#Если "#Параметр(48)" = "" И "#Параметр(49)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(48)" = "Условие" Или "#Параметр(48)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(49) )
#ИначеЕсли "#Параметр(48)" = "ПравоЧтения" Или "#Параметр(48)" = "ПравоИзменения" #Тогда
#Параметр(49) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(49))
#Если Не "#Параметр(48)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(48)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(48)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(49)
#Если Не "#Параметр(48)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(48)" = "Объект" Или "#Параметр(48)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(49))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(49))
)
)
#КонецЕсли
)
)
#Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(49))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(49))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(49)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(49)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(49)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(49))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(49)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(49)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(49))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(49)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(49)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(48)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(49)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(49)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(48),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(48)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(48)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(48)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(48),") #Тогда
(
ЕСТЬNULL(#Параметр(49), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(48),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(48),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(49)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(48),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(49)
#ИначеЕсли "#Параметр(49)" = "Т.Ссылка"
И "#Параметр(48)" <> "Пользователи"
И "#Параметр(48)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(48)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(48)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(48),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(49)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(49)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(49))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(49), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(50) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 16.
#Если "#Параметр(51)" = "" И "#Параметр(52)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(51)" = "Условие" Или "#Параметр(51)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(52) )
#ИначеЕсли "#Параметр(51)" = "ПравоЧтения" Или "#Параметр(51)" = "ПравоИзменения" #Тогда
#Параметр(52) <> НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(52))
#Если Не "#Параметр(51)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(51)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(51)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(52)
#Если Не "#Параметр(51)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(51)" = "Объект" Или "#Параметр(51)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(52))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(52))
)
)
#КонецЕсли
)
)
#Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(52))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(52))
И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(52)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(52)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(52)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(52))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(52)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(52)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(52))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(52)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(52)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(51)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(52)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(52)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(51),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(51)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(51)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(51)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все"
И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(51),") #Тогда
(
ЕСТЬNULL(#Параметр(52), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(51),", ",Пользователи,"))
Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(51),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(52)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(51),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(52)
#ИначеЕсли "#Параметр(52)" = "Т.Ссылка"
И "#Параметр(51)" <> "Пользователи"
И "#Параметр(51)" <> "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(51)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(51)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(51),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(52)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(52)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(52))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(52), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(53) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
)
)
#КонецЕсли
#КонецЕсли // Информационная база заблокирована для обновления.