Files
SSL/SSL/src/Roles/ЧтениеЗаданий/Rights.rights
T
2020-03-12 22:50:00 +03:00

10557 lines
761 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="UTF-8"?>
<Rights xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://v8.1c.ru/8.2/roles" xsi:type="Rights">
<setForNewObjects>false</setForNewObjects>
<setForAttributesByDefault>true</setForAttributesByDefault>
<independentRightsOfChildObjects>false</independentRightsOfChildObjects>
<object>
<name>Report.ПросроченныеЗадачи</name>
<right>
<name>Use</name>
<value>true</value>
</right>
<right>
<name>View</name>
<value>true</value>
</right>
</object>
<object>
<name>InformationRegister.ПроцессыДляЗапуска</name>
<right>
<name>Read</name>
<value>true</value>
</right>
<right>
<name>View</name>
<value>true</value>
</right>
</object>
<object>
<name>Task.ЗадачаИсполнителя.Command.Выполнено</name>
<right>
<name>View</name>
<value>true</value>
</right>
</object>
<object>
<name>Report.Задания</name>
<right>
<name>Use</name>
<value>true</value>
</right>
<right>
<name>View</name>
<value>true</value>
</right>
</object>
<object>
<name>Report.ЗадачиИстекающиеНаДату</name>
<right>
<name>Use</name>
<value>true</value>
</right>
<right>
<name>View</name>
<value>true</value>
</right>
</object>
<object>
<name>Task.ЗадачаИсполнителя</name>
<right>
<name>Read</name>
<value>true</value>
<restrictionByCondition>
<condition>#Если &amp;ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
#ДляОбъекта("")
#Иначе
#ПоЗначениямИНаборамРасширенный( "Задача.ЗадачаИсполнителя", "", "",
"",
"",
"Объект","Т.БизнесПроцесс","ИЛИ",
"Пользователи","Т.Автор","ИЛИ",
"Пользователи","Т.Исполнитель","ИЛИ",
"Пользователи","Т.ГруппаИсполнителейЗадач","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","")
#КонецЕсли</condition>
</restrictionByCondition>
</right>
<right>
<name>View</name>
<value>true</value>
</right>
<right>
<name>InputByString</name>
<value>true</value>
</right>
</object>
<object>
<name>CommonCommand.ЗадачиПоБизнесПроцессу</name>
<right>
<name>View</name>
<value>true</value>
</right>
</object>
<object>
<name>Task.ЗадачаИсполнителя.Command.ВсеЗадачи</name>
<right>
<name>View</name>
<value>true</value>
</right>
</object>
<object>
<name>Task.ЗадачаИсполнителя.Command.МоиЗадачи</name>
<right>
<name>View</name>
<value>true</value>
</right>
</object>
<object>
<name>Report.БизнесПроцессы</name>
<right>
<name>Use</name>
<value>true</value>
</right>
<right>
<name>View</name>
<value>true</value>
</right>
</object>
<object>
<name>BusinessProcess.Задание</name>
<right>
<name>Read</name>
<value>true</value>
<restrictionByCondition>
<condition>#Если &amp;ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
#ДляОбъекта("")
#Иначе
#ПоЗначениямИНаборамРасширенный( "БизнесПроцесс.Задание", "", "",
"",
"",
"Пользователи","Т.Автор","ИЛИ",
"Пользователи","Т.ГруппаИсполнителейЗадач","ИЛИ",
"Пользователи","Т.ГруппаИсполнителейЗадачПроверяющий","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","")
#КонецЕсли</condition>
</restrictionByCondition>
</right>
<right>
<name>View</name>
<value>true</value>
</right>
<right>
<name>InputByString</name>
<value>true</value>
</right>
</object>
<object>
<name>Task.ЗадачаИсполнителя.Command.Перенаправить</name>
<right>
<name>View</name>
<value>true</value>
</right>
</object>
<object>
<name>Report.Задачи</name>
<right>
<name>Use</name>
<value>true</value>
</right>
<right>
<name>View</name>
<value>true</value>
</right>
</object>
<restrictionTemplate>
<name>ДляОбъекта(ПолеОбъекта)</name>
<condition>// ДляОбъекта(ПолеОбъекта = "")
// Шаблон используется для ограничения элементов справочников, документов и
// других списков объектов по полю Ссылка, а также элементов зависимых списков
// объектов и записей регистров через поле объекта-владельца.
//
// Параметры:
// ПолеОбъекта - имя поля, содержащего ссылку на объект, от которого зависит элемент списка.
// Значение "" (по умолчанию) то же, что имя поля "Ссылка".
//
#Если &amp;СпискиСОтключеннымОграничениемЧтения = "Неопределено" #Тогда
// Информационная база заблокирована для обновления.
ГДЕ ЛОЖЬ
#ИначеЕсли Не СтрСодержит(&amp;ВерсииШаблоновОграниченияДоступа, ",ДляРегистра7,") #Тогда
Ошибка: Требуется обновить шаблон на актуальную версию, поставляемую в роли ИзменениеУчастниковГруппДоступа по причине: Используется устаревшая версия 7 шаблона ограничения доступа ДляРегистра. Объект: #ИмяТекущейТаблицы, Право: #ИмяТекущегоПраваДоступа.
#ИначеЕсли &amp;СпискиСОтключеннымОграничениемЧтения = "Все" #Тогда
// У пользователя отключены все виды доступа или
// ограничение на уровне записей не используется.
ГДЕ ИСТИНА
#ИначеЕсли СтрСодержит(&amp;СпискиСОтключеннымОграничениемЧтения, #ИмяТекущейТаблицы + ";") #Тогда
// У пользователя отключено ограничение для текущей таблицы.
ГДЕ ИСТИНА
#ИначеЕсли СтрСодержит(&amp;ВерсииШаблоновОграниченияДоступа, ",ТребуетсяПерезапуститьСеанс,") #Тогда
Ошибка: Версия программы обновлена, требуется перезапустить сеанс. Объект: #ИмяТекущейТаблицы, Право: #ИмяТекущегоПраваДоступа.
#ИначеЕсли #ИмяТекущегоПраваДоступа &lt;&gt; "Чтение" #Тогда
// Проверка прав Добавление, Изменение, Удаление выполняется ПередЗаписью / ПриЗаписи.
ГДЕ ИСТИНА
#ИначеЕсли Не СтрСодержит(&amp;СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;")
И Не СтрСодержит(&amp;СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") #Тогда
Ошибка: Требуется актуализировать ограничение доступа по причине: Не удалось определить вариант ограничения доступа в параметрах сеанса для шаблона ДляОбъекта со значением параметра "#ПолеОбъекта". Объект: #ИмяТекущейТаблицы, Право: #ИмяТекущегоПраваДоступа.
#Иначе
ТекущаяТаблица ГДЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.КлючиДоступаКОбъектам КАК КлючиДоступаКОбъектам
#Если СтрСодержит(&amp;СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") #Тогда
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаНаборовГруппДоступа КАК КлючиДоступаНаборовГруппДоступа
ПО
#Если &amp;ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
КлючиДоступаНаборовГруппДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаПользователей
#Иначе
КлючиДоступаНаборовГруппДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаВнешнихПользователей
#КонецЕсли
И КлючиДоступаНаборовГруппДоступа.НаборГруппДоступа = &amp;РазрешенныйНаборГруппДоступа
#КонецЕсли
#Если СтрСодержит(&amp;СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;*") #Тогда
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаНаборовГруппДоступа КАК КлючиДоступаРазрешенногоНабораГруппДоступа
ПО
#Если &amp;ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
КлючиДоступаРазрешенногоНабораГруппДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаПользователей
#Иначе
КлючиДоступаРазрешенногоНабораГруппДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаВнешнихПользователей
#КонецЕсли
И КлючиДоступаРазрешенногоНабораГруппДоступа.НаборГруппДоступа = &amp;РазрешенныйПустойНаборГруппДоступа
#КонецЕсли
#Если СтрСодержит(&amp;СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") #Тогда
#Если &amp;ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаПользователей КАК КлючиДоступаПользователей
ПО
КлючиДоступаПользователей.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаПользователей
И КлючиДоступаПользователей.Пользователь = &amp;РазрешенныйПользователь
#Иначе
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаВнешнихПользователей КАК КлючиДоступаПользователей
ПО
КлючиДоступаПользователей.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаВнешнихПользователей
И КлючиДоступаПользователей.ВнешнийПользователь = &amp;РазрешенныйПользователь
#КонецЕсли
#КонецЕсли
#Если СтрСодержит(&amp;СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;+") #Тогда
#Если &amp;ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаПользователей КАК КлючиДоступаНаборовГруппПользователей
ПО
КлючиДоступаНаборовГруппПользователей.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаПользователей
И КлючиДоступаНаборовГруппПользователей.Пользователь = &amp;РазрешенныйНаборГруппПользователей
#Иначе
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаВнешнихПользователей КАК КлючиДоступаНаборовГруппПользователей
ПО
КлючиДоступаНаборовГруппПользователей.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаВнешнихПользователей
И КлючиДоступаНаборовГруппПользователей.ВнешнийПользователь = &amp;РазрешенныйНаборГруппПользователей
#КонецЕсли
#КонецЕсли
ГДЕ
#Если "#ПолеОбъекта" = "" #Тогда
КлючиДоступаКОбъектам.Объект = ТекущаяТаблица.Ссылка
#Иначе
КлючиДоступаКОбъектам.Объект = ТекущаяТаблица.#ПолеОбъекта
#КонецЕсли
И (
#Если СтрСодержит(&amp;СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") #Тогда
Не КлючиДоступаНаборовГруппДоступа.КлючДоступа Есть NULL
#Иначе
Ложь
#КонецЕсли
#Если СтрСодержит(&amp;СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;*") #Тогда
Или Не КлючиДоступаРазрешенногоНабораГруппДоступа.КлючДоступа Есть NULL
#КонецЕсли
#Если СтрСодержит(&amp;СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") #Тогда
Или Не КлючиДоступаПользователей.КлючДоступа Есть NULL
#КонецЕсли
#Если СтрСодержит(&amp;СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;+") #Тогда
Или Не КлючиДоступаНаборовГруппПользователей.КлючДоступа Есть NULL
#КонецЕсли
)
)
#Если Не СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, #ИмяТекущейТаблицы + ":Пропустить;")
И ( СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";УточнитьДляВсех;")
Или СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, #ИмяТекущейТаблицы + ":Уточнить;") ) #Тогда
#Если Не СтрСодержит(&amp;СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") #Тогда
И ИСТИНА В (ИСТИНА
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";31;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";30;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";29;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";28;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";27;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";26;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";25;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";24;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";23;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";22;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";21;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";20;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";19;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";18;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";17;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";16;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";15;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";14;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";13;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";12;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";11;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";10;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";09;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";08;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";07;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";06;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";05;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";04;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";03;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";02;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";01;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";00;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
)
#Иначе
И ИСТИНА В (ИСТИНА
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";31^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";30^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";29^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";28^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";27^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";26^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";25^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";24^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";23^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";22^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";21^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";20^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";19^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";18^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";17^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";16^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";15^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";14^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";13^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";12^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";11^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";10^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";09^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";08^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";07^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";06^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";05^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";04^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";03^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";02^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";01^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
#Если СтрСодержит(&amp;ОбщиеПараметрыШаблоновОграниченияДоступа, ";00^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли
)
#КонецЕсли
#КонецЕсли
#КонецЕсли
</condition>
</restrictionTemplate>
<restrictionTemplate>
<name>ПоЗначениямИНаборамРасширенный</name>
<condition>// ПоЗначениямИНаборамРасширенный(Таблица, -, Модификатор, ПрисоединяемыеТаблицы, О, В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) содержит строку условия на языке запросов, например
// "Т.Автор = &amp;АвторизованныйПользователь",
// "ТИПЗНАЧЕНИЯ(Т.Владелец) = ТИП(Справочник.Организации)", где Т - псевдоним текущей таблицы.
// Когда В(n) = "ПравоЧтения" Или "ПравоИзменения",
// выполняется проверка наличия права на таблицу значения Т.П(n).
// Когда В(n) = "ПравоЧтенияПоИдентификатору" или "ПравоИзмененияПоИдентификатору",
// выполняется проверка наличия права на таблицу по идентификатору в значении Т.П(n).
// Когда В(n) = "Объект" (или " "), то
// когда есть запись зависимости прав в регистре сведений ЗависимостиПравДоступа тогда
// выполняется проверка права чтения Т.П(n) и наборов значений доступа
// в регистре сведений НаборыЗначенийДоступа, считываемых по ссылке Т.П(n) для права чтения;
// иначе используется стандартное правило:
// когда Право = "Чтение" тогда выполняется проверка права чтения Т.П(n) и наборов значений доступа
// в регистре сведений НаборыЗначенийДоступа, считываемых по ссылке Т.П(n) для права чтения;
// когда Право = "Изменение" тогда выполняется проверка права изменения Т.П(n)
// и наборов значений доступа, считываемых по ссылке Т.П(n) для права изменения.
// П(n) - Поле проверяемого значения с псевдонимом, например "Т.Организация",
// кроме случая В(n) = "Условие" (или "").
// О(n) - Логические операции "И", "ИЛИ" в сочетании с скобками "(", ")".
// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но
// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального.
// Шаблон имеет структуру:
// &lt;Соединение по таблице1&gt; &lt;Соединение по таблице2&gt; ... &lt;Соединение по таблице(m)&gt;
// &lt;Общая часть условий&gt; &lt;Условие по группе параметров 1&gt; И/ИЛИ &lt;Условие по группе параметров 1&gt; И/ИЛИ ... &lt;Условие по группе параметров(n)&gt;
// Пример:
// ПоЗначениямИНаборамРасширенный("ЖурналДокументов.СкладскиеДокументы", "", "",
// "",
// "",
// "Объект","Т.Ссылка","И",
// "Объект","Т.ОсновнойДокумент","", "","","", ...)
#Если &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется = "" #Тогда // Информационная база заблокирована для обновления.
ГДЕ ЛОЖЬ
#ИначеЕсли Не СтрСодержит(&amp;ВерсииШаблоновОграниченияДоступа, ",ПоЗначениямИНаборамРасширенный17,") #Тогда
Ошибка: Требуется обновить шаблон на актуальную версию, поставляемую в роли ИзменениеУчастниковГруппДоступа по причине: Используется устаревшая версия 17 шаблона ограничения доступа ПоЗначениямИНаборамРасширенный. Объект: #ИмяТекущейТаблицы, Право: #ИмяТекущегоПраваДоступа.
#Иначе
// Проверка правильности параметра Право.
#Если Не ("#Параметр(2)" = "Чтение" Или "#Параметр(2)" = "Добавление" Или
"#Параметр(2)" = "Изменение" Или "#Параметр(2)" = "Удаление" Или "#Параметр(2)" = "")
Или #ИмяТекущегоПраваДоступа &lt;&gt; "Чтение" И "#Параметр(2)" = "Чтение"
Или #ИмяТекущегоПраваДоступа = "Чтение" И "#Параметр(2)" &lt;&gt; "Чтение" И "#Параметр(2)" &lt;&gt; "" #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверноеПраво: #Параметр(2)
#КонецЕсли
// Проверка правильности параметра ИмяТаблицы.
#Если "#Параметр(1)" &lt;&gt; #ИмяТекущейТаблицы #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверноеИмяТекущейТаблицы: "#Параметр(1)"
#КонецЕсли
// Проверка правильности параметра Модификатор.
#Если Не ( "#Параметр(3)" = "НеОграничиватьДоступКГруппам"
Или "#Параметр(3)" = "РасширенноеИЛИ"
Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ"
Или "#Параметр(3)" = "") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйМодификатор: #Параметр(3)
#КонецЕсли
// Общая проверка использования ограничений доступа на уровне записей и
// проверка использования хотя бы одного ограничения из указанных видов доступа.
#Если Не
( Истина
И ("#Параметр(6)" = "" И "#Параметр(7)" = ""
Или Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(6),"))
И ("#Параметр(9)" = "" И "#Параметр(10)" = ""
Или Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(9),"))
И ("#Параметр(12)" = "" И "#Параметр(13)" = ""
Или Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(12),"))
И ("#Параметр(15)" = "" И "#Параметр(16)" = ""
Или Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(15),"))
И ("#Параметр(18)" = "" И "#Параметр(19)" = ""
Или Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(18),"))
И ("#Параметр(21)" = "" И "#Параметр(22)" = ""
Или Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(21),"))
И ("#Параметр(24)" = "" И "#Параметр(25)" = ""
Или Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(24),"))
И ("#Параметр(27)" = "" И "#Параметр(28)" = ""
Или Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(27),"))
И ("#Параметр(30)" = "" И "#Параметр(31)" = ""
Или Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(30),"))
И ("#Параметр(33)" = "" И "#Параметр(34)" = ""
Или Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(33),"))
И ("#Параметр(36)" = "" И "#Параметр(37)" = ""
Или Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(36),"))
И ("#Параметр(39)" = "" И "#Параметр(40)" = ""
Или Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(39),"))
И ("#Параметр(42)" = "" И "#Параметр(43)" = ""
Или Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(42),"))
И ("#Параметр(45)" = "" И "#Параметр(46)" = ""
Или Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(45),"))
И ("#Параметр(48)" = "" И "#Параметр(49)" = ""
Или Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(48),"))
И ("#Параметр(51)" = "" И "#Параметр(52)" = ""
Или Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется
И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(51),"))
) #Тогда
Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов).
// Присоединяемые таблицы к проверяемой строке текущей таблицы "Т".
#Параметр(4)
ГДЕ
ИСТИНА В
( // Проверка права пользователя на текущую таблицу в целом.
// Права на таблицы формируются по составу ролей профиля группы доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ
#Если СтрСодержит(&amp;ТаблицыРасширенийСОграничениемДоступа, "|#Параметр(1);") #Тогда
Справочник.ИдентификаторыОбъектовРасширений КАК СвойстваТекущейТаблицы
#Иначе
Справочник.ИдентификаторыОбъектовМетаданных КАК СвойстваТекущейТаблицы
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа
ПО
СвойстваТекущейТаблицы.ПолноеИмя = "#Параметр(1)"
И ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ
РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа
ГДЕ
ТаблицыГруппДоступа.Таблица = СвойстваТекущейТаблицы.Ссылка
И ТаблицыГруппДоступа.ГруппаДоступа = ГруппыДоступа.Ссылка
#Если #ИмяТекущегоПраваДоступа = "Изменение" #Тогда
И ТаблицыГруппДоступа.Изменение
#ИначеЕсли #ИмяТекущегоПраваДоступа = "Добавление" #Тогда
И ТаблицыГруппДоступа.Добавление
#КонецЕсли
)
И ГруппыДоступа.Ссылка В
(
ВЫБРАТЬ
ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа
ИЗ
Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = ГруппыДоступаПользователи.Пользователь
)
ГДЕ
// Безусловная выборка групп в иерархическом объекте метаданных (если нужно).
#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
Т.ЭтоГруппа ИЛИ
#КонецЕсли
( // Поиск значений заданных полей в разрешенных значениях групп доступа (пользователей).
#Параметр(5) // [([(][(]...] 0-n открывающихся скобок.
//// Проверка значения поля группы параметров 1.
#Если &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(6)" = "Условие" Или "#Параметр(6)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(7) )
#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" Или "#Параметр(6)" = "ПравоИзменения" #Тогда
#Параметр(7) &lt;&gt; НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(7))
#Если Не "#Параметр(6)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(6)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(6)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(7)
#Если Не "#Параметр(6)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(6)" = "Объект" Или "#Параметр(6)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(7))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.Изменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(7))
)
)
#КонецЕсли
)
)
#Если &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(7))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(7))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(7)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(7)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(7)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(7))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(7)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(7)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(7))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(7)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(7)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение &lt;&gt; ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Изменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(6)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(7)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(7)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&amp;ВсеВидыДоступаКромеСпециальных, ",#Параметр(6),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(6)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(6)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(6)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &amp;ВидыДоступаСОтключеннымИспользованием &lt;&gt; "Все"
И Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",#Параметр(6),") #Тогда
(
ЕСТЬNULL(#Параметр(7), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(6),", ",Пользователи,"))
Или (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(6),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(7)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&amp;ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(6),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(7)
#ИначеЕсли "#Параметр(7)" = "Т.Ссылка"
И "#Параметр(6)" &lt;&gt; "Пользователи"
И "#Параметр(6)" &lt;&gt; "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(6)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(6)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&amp;ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(6),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(7)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(7)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(7))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(7), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(8) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 2.
#Если "#Параметр(9)" = "" И "#Параметр(10)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(9)" = "Условие" Или "#Параметр(9)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(10) )
#ИначеЕсли "#Параметр(9)" = "ПравоЧтения" Или "#Параметр(9)" = "ПравоИзменения" #Тогда
#Параметр(10) &lt;&gt; НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(10))
#Если Не "#Параметр(9)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(9)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(9)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(10)
#Если Не "#Параметр(9)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(9)" = "Объект" Или "#Параметр(9)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(10))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.Изменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(10))
)
)
#КонецЕсли
)
)
#Если &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(10))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(10))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(10)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(10)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(10)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(10))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(10)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(10)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(10))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(10)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(10)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение &lt;&gt; ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Изменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(9)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(10)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(10)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&amp;ВсеВидыДоступаКромеСпециальных, ",#Параметр(9),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(9)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(9)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(9)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &amp;ВидыДоступаСОтключеннымИспользованием &lt;&gt; "Все"
И Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",#Параметр(9),") #Тогда
(
ЕСТЬNULL(#Параметр(10), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(9),", ",Пользователи,"))
Или (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(9),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(10)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&amp;ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(9),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(10)
#ИначеЕсли "#Параметр(10)" = "Т.Ссылка"
И "#Параметр(9)" &lt;&gt; "Пользователи"
И "#Параметр(9)" &lt;&gt; "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(9)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(9)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&amp;ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(9),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(10)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(10)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(10))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(10), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(11) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 3.
#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(12)" = "Условие" Или "#Параметр(12)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(13) )
#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" Или "#Параметр(12)" = "ПравоИзменения" #Тогда
#Параметр(13) &lt;&gt; НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(13))
#Если Не "#Параметр(12)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(12)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(12)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(13)
#Если Не "#Параметр(12)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(12)" = "Объект" Или "#Параметр(12)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(13))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.Изменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(13))
)
)
#КонецЕсли
)
)
#Если &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(13))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(13))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(13)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(13)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(13)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(13))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(13)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(13)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(13))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(13)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(13)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение &lt;&gt; ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Изменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(12)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(13)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(13)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&amp;ВсеВидыДоступаКромеСпециальных, ",#Параметр(12),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(12)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(12)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(12)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &amp;ВидыДоступаСОтключеннымИспользованием &lt;&gt; "Все"
И Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",#Параметр(12),") #Тогда
(
ЕСТЬNULL(#Параметр(13), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(12),", ",Пользователи,"))
Или (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(12),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(13)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&amp;ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(12),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(13)
#ИначеЕсли "#Параметр(13)" = "Т.Ссылка"
И "#Параметр(12)" &lt;&gt; "Пользователи"
И "#Параметр(12)" &lt;&gt; "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(12)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(12)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&amp;ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(12),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(13)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(13)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(13))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(13), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(14) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 4.
#Если "#Параметр(15)" = "" И "#Параметр(16)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(15)" = "Условие" Или "#Параметр(15)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(16) )
#ИначеЕсли "#Параметр(15)" = "ПравоЧтения" Или "#Параметр(15)" = "ПравоИзменения" #Тогда
#Параметр(16) &lt;&gt; НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(16))
#Если Не "#Параметр(15)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(15)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(15)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(16)
#Если Не "#Параметр(15)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(15)" = "Объект" Или "#Параметр(15)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(16))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.Изменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(16))
)
)
#КонецЕсли
)
)
#Если &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(16))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(16))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(16)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(16)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(16)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(16))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(16)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(16)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(16))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(16)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(16)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение &lt;&gt; ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Изменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(15)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(16)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(16)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&amp;ВсеВидыДоступаКромеСпециальных, ",#Параметр(15),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(15)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(15)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(15)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &amp;ВидыДоступаСОтключеннымИспользованием &lt;&gt; "Все"
И Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",#Параметр(15),") #Тогда
(
ЕСТЬNULL(#Параметр(16), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(15),", ",Пользователи,"))
Или (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(15),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(16)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&amp;ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(15),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(16)
#ИначеЕсли "#Параметр(16)" = "Т.Ссылка"
И "#Параметр(15)" &lt;&gt; "Пользователи"
И "#Параметр(15)" &lt;&gt; "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(15)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(15)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&amp;ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(15),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(16)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(16)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(16))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(16), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(17) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 5.
#Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(18)" = "Условие" Или "#Параметр(18)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(19) )
#ИначеЕсли "#Параметр(18)" = "ПравоЧтения" Или "#Параметр(18)" = "ПравоИзменения" #Тогда
#Параметр(19) &lt;&gt; НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(19))
#Если Не "#Параметр(18)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(18)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(18)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(19)
#Если Не "#Параметр(18)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(18)" = "Объект" Или "#Параметр(18)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(19))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.Изменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(19))
)
)
#КонецЕсли
)
)
#Если &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(19))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(19))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(19)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(19)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(19)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(19))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(19)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(19)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(19))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(19)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(19)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение &lt;&gt; ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Изменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(18)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(19)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(19)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&amp;ВсеВидыДоступаКромеСпециальных, ",#Параметр(18),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(18)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(18)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(18)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &amp;ВидыДоступаСОтключеннымИспользованием &lt;&gt; "Все"
И Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",#Параметр(18),") #Тогда
(
ЕСТЬNULL(#Параметр(19), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(18),", ",Пользователи,"))
Или (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(18),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(19)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&amp;ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(18),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(19)
#ИначеЕсли "#Параметр(19)" = "Т.Ссылка"
И "#Параметр(18)" &lt;&gt; "Пользователи"
И "#Параметр(18)" &lt;&gt; "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(18)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(18)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&amp;ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(18),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(19)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(19)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(19))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(19), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(20) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 6.
#Если "#Параметр(21)" = "" И "#Параметр(22)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(21)" = "Условие" Или "#Параметр(21)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(22) )
#ИначеЕсли "#Параметр(21)" = "ПравоЧтения" Или "#Параметр(21)" = "ПравоИзменения" #Тогда
#Параметр(22) &lt;&gt; НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(22))
#Если Не "#Параметр(21)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(21)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(21)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(22)
#Если Не "#Параметр(21)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(21)" = "Объект" Или "#Параметр(21)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(22))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.Изменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(22))
)
)
#КонецЕсли
)
)
#Если &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(22))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(22))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(22)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(22)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(22)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(22))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(22)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(22)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(22))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(22)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(22)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение &lt;&gt; ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Изменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(21)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(22)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(22)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&amp;ВсеВидыДоступаКромеСпециальных, ",#Параметр(21),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(21)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(21)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(21)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &amp;ВидыДоступаСОтключеннымИспользованием &lt;&gt; "Все"
И Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",#Параметр(21),") #Тогда
(
ЕСТЬNULL(#Параметр(22), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(21),", ",Пользователи,"))
Или (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(21),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(22)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&amp;ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(21),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(22)
#ИначеЕсли "#Параметр(22)" = "Т.Ссылка"
И "#Параметр(21)" &lt;&gt; "Пользователи"
И "#Параметр(21)" &lt;&gt; "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(21)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(21)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&amp;ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(21),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(22)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(22)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(22))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(22), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(23) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 7.
#Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(24)" = "Условие" Или "#Параметр(24)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(25) )
#ИначеЕсли "#Параметр(24)" = "ПравоЧтения" Или "#Параметр(24)" = "ПравоИзменения" #Тогда
#Параметр(25) &lt;&gt; НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(25))
#Если Не "#Параметр(24)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(24)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(24)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(25)
#Если Не "#Параметр(24)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(24)" = "Объект" Или "#Параметр(24)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(25))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.Изменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(25))
)
)
#КонецЕсли
)
)
#Если &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(25))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(25))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(25)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(25)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(25)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(25))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(25)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(25)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(25))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(25)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(25)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение &lt;&gt; ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Изменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(24)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(25)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(25)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&amp;ВсеВидыДоступаКромеСпециальных, ",#Параметр(24),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(24)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(24)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(24)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &amp;ВидыДоступаСОтключеннымИспользованием &lt;&gt; "Все"
И Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",#Параметр(24),") #Тогда
(
ЕСТЬNULL(#Параметр(25), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(24),", ",Пользователи,"))
Или (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(24),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(25)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&amp;ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(24),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(25)
#ИначеЕсли "#Параметр(25)" = "Т.Ссылка"
И "#Параметр(24)" &lt;&gt; "Пользователи"
И "#Параметр(24)" &lt;&gt; "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(24)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(24)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&amp;ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(24),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(25)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(25)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(25))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(25), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(26) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 8.
#Если "#Параметр(27)" = "" И "#Параметр(28)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(27)" = "Условие" Или "#Параметр(27)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(28) )
#ИначеЕсли "#Параметр(27)" = "ПравоЧтения" Или "#Параметр(27)" = "ПравоИзменения" #Тогда
#Параметр(28) &lt;&gt; НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(28))
#Если Не "#Параметр(27)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(27)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(27)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(28)
#Если Не "#Параметр(27)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(27)" = "Объект" Или "#Параметр(27)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(28))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.Изменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(28))
)
)
#КонецЕсли
)
)
#Если &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(28))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(28))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(28)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(28)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(28)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(28))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(28)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(28)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(28))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(28)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(28)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение &lt;&gt; ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Изменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(27)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(28)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(28)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&amp;ВсеВидыДоступаКромеСпециальных, ",#Параметр(27),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(27)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(27)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(27)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &amp;ВидыДоступаСОтключеннымИспользованием &lt;&gt; "Все"
И Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",#Параметр(27),") #Тогда
(
ЕСТЬNULL(#Параметр(28), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(27),", ",Пользователи,"))
Или (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(27),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(28)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&amp;ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(27),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(28)
#ИначеЕсли "#Параметр(28)" = "Т.Ссылка"
И "#Параметр(27)" &lt;&gt; "Пользователи"
И "#Параметр(27)" &lt;&gt; "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(27)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(27)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&amp;ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(27),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(28)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(28)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(28))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(28), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(29) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 9.
#Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(30)" = "Условие" Или "#Параметр(30)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(31) )
#ИначеЕсли "#Параметр(30)" = "ПравоЧтения" Или "#Параметр(30)" = "ПравоИзменения" #Тогда
#Параметр(31) &lt;&gt; НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(31))
#Если Не "#Параметр(30)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(30)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(30)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(31)
#Если Не "#Параметр(30)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(30)" = "Объект" Или "#Параметр(30)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(31))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.Изменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(31))
)
)
#КонецЕсли
)
)
#Если &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(31))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(31))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(31)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(31)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(31)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(31))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(31)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(31)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(31))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(31)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(31)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение &lt;&gt; ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Изменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(30)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(31)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(31)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&amp;ВсеВидыДоступаКромеСпециальных, ",#Параметр(30),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(30)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(30)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(30)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &amp;ВидыДоступаСОтключеннымИспользованием &lt;&gt; "Все"
И Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",#Параметр(30),") #Тогда
(
ЕСТЬNULL(#Параметр(31), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(30),", ",Пользователи,"))
Или (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(30),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(31)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&amp;ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(30),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(31)
#ИначеЕсли "#Параметр(31)" = "Т.Ссылка"
И "#Параметр(30)" &lt;&gt; "Пользователи"
И "#Параметр(30)" &lt;&gt; "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(30)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(30)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&amp;ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(30),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(31)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(31)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(31))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(31), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(32) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 10.
#Если "#Параметр(33)" = "" И "#Параметр(34)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(33)" = "Условие" Или "#Параметр(33)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(34) )
#ИначеЕсли "#Параметр(33)" = "ПравоЧтения" Или "#Параметр(33)" = "ПравоИзменения" #Тогда
#Параметр(34) &lt;&gt; НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(34))
#Если Не "#Параметр(33)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(33)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(33)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(34)
#Если Не "#Параметр(33)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(33)" = "Объект" Или "#Параметр(33)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(34))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.Изменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(34))
)
)
#КонецЕсли
)
)
#Если &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(34))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(34))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(34)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(34)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(34)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(34))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(34)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(34)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(34))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(34)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(34)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение &lt;&gt; ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Изменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(33)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(34)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(34)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&amp;ВсеВидыДоступаКромеСпециальных, ",#Параметр(33),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(33)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(33)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(33)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &amp;ВидыДоступаСОтключеннымИспользованием &lt;&gt; "Все"
И Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",#Параметр(33),") #Тогда
(
ЕСТЬNULL(#Параметр(34), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(33),", ",Пользователи,"))
Или (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(33),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(34)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&amp;ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(33),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(34)
#ИначеЕсли "#Параметр(34)" = "Т.Ссылка"
И "#Параметр(33)" &lt;&gt; "Пользователи"
И "#Параметр(33)" &lt;&gt; "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(33)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(33)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&amp;ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(33),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(34)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(34)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(34))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(34), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(35) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 11.
#Если "#Параметр(36)" = "" И "#Параметр(37)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(36)" = "Условие" Или "#Параметр(36)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(37) )
#ИначеЕсли "#Параметр(36)" = "ПравоЧтения" Или "#Параметр(36)" = "ПравоИзменения" #Тогда
#Параметр(37) &lt;&gt; НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(37))
#Если Не "#Параметр(36)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(36)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(36)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(37)
#Если Не "#Параметр(36)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(36)" = "Объект" Или "#Параметр(36)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(37))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.Изменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(37))
)
)
#КонецЕсли
)
)
#Если &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(37))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(37))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(37)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(37)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(37)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(37))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(37)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(37)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(37))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(37)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(37)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение &lt;&gt; ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Изменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(36)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(37)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(37)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&amp;ВсеВидыДоступаКромеСпециальных, ",#Параметр(36),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(36)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(36)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(36)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &amp;ВидыДоступаСОтключеннымИспользованием &lt;&gt; "Все"
И Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",#Параметр(36),") #Тогда
(
ЕСТЬNULL(#Параметр(37), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(36),", ",Пользователи,"))
Или (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(36),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(37)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&amp;ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(36),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(37)
#ИначеЕсли "#Параметр(37)" = "Т.Ссылка"
И "#Параметр(36)" &lt;&gt; "Пользователи"
И "#Параметр(36)" &lt;&gt; "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(36)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(36)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&amp;ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(36),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(37)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(37)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(37))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(37), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(38) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 12.
#Если "#Параметр(39)" = "" И "#Параметр(40)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(39)" = "Условие" Или "#Параметр(39)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(40) )
#ИначеЕсли "#Параметр(39)" = "ПравоЧтения" Или "#Параметр(39)" = "ПравоИзменения" #Тогда
#Параметр(40) &lt;&gt; НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(40))
#Если Не "#Параметр(39)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(39)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(39)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(40)
#Если Не "#Параметр(39)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(39)" = "Объект" Или "#Параметр(39)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(40))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.Изменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(40))
)
)
#КонецЕсли
)
)
#Если &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(40))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(40))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(40)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(40)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(40)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(40))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(40)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(40)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(40))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(40)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(40)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение &lt;&gt; ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Изменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(39)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(40)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(40)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&amp;ВсеВидыДоступаКромеСпециальных, ",#Параметр(39),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(39)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(39)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(39)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &amp;ВидыДоступаСОтключеннымИспользованием &lt;&gt; "Все"
И Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",#Параметр(39),") #Тогда
(
ЕСТЬNULL(#Параметр(40), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(39),", ",Пользователи,"))
Или (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(39),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(40)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&amp;ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(39),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(40)
#ИначеЕсли "#Параметр(40)" = "Т.Ссылка"
И "#Параметр(39)" &lt;&gt; "Пользователи"
И "#Параметр(39)" &lt;&gt; "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(39)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(39)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&amp;ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(39),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(40)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(40)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(40))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(40), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(41) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 13.
#Если "#Параметр(42)" = "" И "#Параметр(43)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(42)" = "Условие" Или "#Параметр(42)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(43) )
#ИначеЕсли "#Параметр(42)" = "ПравоЧтения" Или "#Параметр(42)" = "ПравоИзменения" #Тогда
#Параметр(43) &lt;&gt; НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(43))
#Если Не "#Параметр(42)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(42)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(42)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(43)
#Если Не "#Параметр(42)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(42)" = "Объект" Или "#Параметр(42)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(43))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.Изменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(43))
)
)
#КонецЕсли
)
)
#Если &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(43))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(43))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(43)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(43)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(43)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(43))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(43)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(43)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(43))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(43)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(43)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение &lt;&gt; ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Изменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(42)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(43)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(43)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&amp;ВсеВидыДоступаКромеСпециальных, ",#Параметр(42),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(42)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(42)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(42)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &amp;ВидыДоступаСОтключеннымИспользованием &lt;&gt; "Все"
И Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",#Параметр(42),") #Тогда
(
ЕСТЬNULL(#Параметр(43), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(42),", ",Пользователи,"))
Или (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(42),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(43)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&amp;ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(42),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(43)
#ИначеЕсли "#Параметр(43)" = "Т.Ссылка"
И "#Параметр(42)" &lt;&gt; "Пользователи"
И "#Параметр(42)" &lt;&gt; "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(42)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(42)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&amp;ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(42),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(43)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(43)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(43))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(43), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(44) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 14.
#Если "#Параметр(45)" = "" И "#Параметр(46)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(45)" = "Условие" Или "#Параметр(45)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(46) )
#ИначеЕсли "#Параметр(45)" = "ПравоЧтения" Или "#Параметр(45)" = "ПравоИзменения" #Тогда
#Параметр(46) &lt;&gt; НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(46))
#Если Не "#Параметр(45)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(45)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(45)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(46)
#Если Не "#Параметр(45)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(45)" = "Объект" Или "#Параметр(45)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(46))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.Изменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(46))
)
)
#КонецЕсли
)
)
#Если &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(46))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(46))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(46)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(46)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(46)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(46))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(46)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(46)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(46))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(46)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(46)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение &lt;&gt; ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Изменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(45)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(46)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(46)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&amp;ВсеВидыДоступаКромеСпециальных, ",#Параметр(45),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(45)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(45)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(45)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &amp;ВидыДоступаСОтключеннымИспользованием &lt;&gt; "Все"
И Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",#Параметр(45),") #Тогда
(
ЕСТЬNULL(#Параметр(46), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(45),", ",Пользователи,"))
Или (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(45),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(46)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&amp;ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(45),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(46)
#ИначеЕсли "#Параметр(46)" = "Т.Ссылка"
И "#Параметр(45)" &lt;&gt; "Пользователи"
И "#Параметр(45)" &lt;&gt; "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(45)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(45)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&amp;ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(45),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(46)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(46)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(46))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(46), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(47) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 15.
#Если "#Параметр(48)" = "" И "#Параметр(49)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(48)" = "Условие" Или "#Параметр(48)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(49) )
#ИначеЕсли "#Параметр(48)" = "ПравоЧтения" Или "#Параметр(48)" = "ПравоИзменения" #Тогда
#Параметр(49) &lt;&gt; НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(49))
#Если Не "#Параметр(48)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(48)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(48)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(49)
#Если Не "#Параметр(48)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(48)" = "Объект" Или "#Параметр(48)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(49))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.Изменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(49))
)
)
#КонецЕсли
)
)
#Если &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(49))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(49))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(49)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(49)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(49)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(49))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(49)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(49)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(49))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(49)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(49)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение &lt;&gt; ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Изменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(48)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(49)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(49)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&amp;ВсеВидыДоступаКромеСпециальных, ",#Параметр(48),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(48)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(48)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(48)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &amp;ВидыДоступаСОтключеннымИспользованием &lt;&gt; "Все"
И Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",#Параметр(48),") #Тогда
(
ЕСТЬNULL(#Параметр(49), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(48),", ",Пользователи,"))
Или (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(48),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(49)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&amp;ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(48),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(49)
#ИначеЕсли "#Параметр(49)" = "Т.Ссылка"
И "#Параметр(48)" &lt;&gt; "Пользователи"
И "#Параметр(48)" &lt;&gt; "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(48)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(48)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&amp;ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(48),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(49)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(49)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(49))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(49), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(50) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
//// Проверка значения поля группы параметров 16.
#Если "#Параметр(51)" = "" И "#Параметр(52)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(51)" = "Условие" Или "#Параметр(51)" = "") #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(52) )
#ИначеЕсли "#Параметр(51)" = "ПравоЧтения" Или "#Параметр(51)" = "ПравоИзменения" #Тогда
#Параметр(52) &lt;&gt; НЕОПРЕДЕЛЕНО
И ИСТИНА В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(52))
#Если Не "#Параметр(51)" = "ПравоЧтения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(51)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(51)" = "ПравоИзмененияПоИдентификатору" #Тогда
ИСТИНА В
( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(52)
#Если Не "#Параметр(51)" = "ПравоЧтенияПоИдентификатору" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли "#Параметр(51)" = "Объект" Или "#Параметр(51)" = " " #Тогда
(
// Проверка права объекта ведущей таблицы (зависимость по правам)
(
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта
ГДЕ
ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(52))
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Проверка ведущего права для права Чтение
// Право Чтение может зависеть только от права Чтение
#Иначе
// Проверка ведущего права для права Изменение
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И НЕ
( ТаблицыГруппДоступаПроверкаПраваОбъекта.Изменение = ЛОЖЬ
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(52))
)
)
#КонецЕсли
)
)
#Если &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
// Проверка ограничения права объекта ведущей таблицы
И
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ВЫБОР КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(52))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ИЛИ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы
ГДЕ
ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(52))
И Идентификаторы.ЗначениеПустойСсылки В (&amp;ТипыВладельцевНастроекПрав)
)
ТОГДА
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(52)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(52)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
ИНАЧЕ
#КонецЕсли
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
НЕ
(
ИСТИНА В // Не все проверки отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(52)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(52))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(52)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
) И НЕ
#Иначе
(
#КонецЕсли
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов
ГДЕ
НомераНаборов.Объект = #Параметр(52)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
И НомераНаборов.Чтение = ИСТИНА
#Иначе
// Право Изменение может зависеть от ведущих прав Чтение, Изменение
И ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа
ГДЕ
ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка
И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(52))
)
ТОГДА НомераНаборов.Чтение
ИНАЧЕ НомераНаборов.Изменение
КОНЕЦ
#КонецЕсли
И
#Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда
ИСТИНА В // Не все проверки текущего набора отключены.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(52)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА
)
)
И
#КонецЕсли
НЕ ЛОЖЬ В // Все проверки успешны.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа.
ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений
ГДЕ
НаборыЗначений.Объект = #Параметр(52)
И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора
И НЕ
ВЫБОР
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
#Если НЕ &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
КОГДА НаборыЗначений.ЗначениеБезГрупп
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
КОГДА НаборыЗначений.СтандартноеЗначение
#Иначе
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
)
#КонецЕсли
#Если &amp;ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда
ТОГДА
ИСТИНА
#Иначе
ТОГДА
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ВЫБОР
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
КОГДА
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
И НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок
ГДЕ
ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ТипыСсылок.ЗначениеПустойСсылки В (&amp;ТипыЗначенийДоступаСГруппами)
)
ТОГДА
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#КонецЕсли
#Если Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОГДА
ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
ТОГДА
ИСТИНА
#КонецЕсли
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
ИНАЧЕ
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
#Если Не #ИмяТекущегоПраваДоступа = "Чтение"
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,")
Или Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
// Проверка заведомого ложного или истинного однострочного набора значений.
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
ТОГДА ИСТИНА
КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
ТОГДА ЛОЖЬ
// Проверка права доступа пользователя к таблице ЗначенияДоступа.
КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
// Право Чтение может зависеть только от права Чтение
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
)
#Иначе
ТОГДА ИСТИНА В
( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект
ГДЕ
ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа
И НЕ(НаборыЗначений.Уточнение &lt;&gt; ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Изменение = ЛОЖЬ)
)
#КонецЕсли
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
ИНАЧЕ
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
И НастройкиПрав.Таблица = ВЫБОР
КОГДА НаборыЗначений.Уточнение В (&amp;ИдентификаторыТаблицСОтдельнымиНастройкамиПрав)
ТОГДА НаборыЗначений.Уточнение
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#Иначе
ИНАЧЕ
ЛОЖЬ
#КонецЕсли
КОНЕЦ
) // НЕ ЛОЖЬ В
)
)
#Если Не &amp;ТипыВладельцевНастроекПрав = "" #Тогда
КОНЕЦ
#КонецЕсли
#КонецЕсли
)
#ИначеЕсли Не &amp;ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(51)" = "НастройкиПрав" #Тогда
(
ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(52)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньРазрешенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено.
(
ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ
ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
ПО
НаследованиеНастроек.Объект = #Параметр(52)
И НастройкиПрав.Объект = НаследованиеНастроек.Родитель
#Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияЧтения
#Иначе
#Если СтрСодержит(&amp;ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда
И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка
#Иначе
И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)
#КонецЕсли
И НаследованиеНастроек.УровеньИспользования &lt; НастройкиПрав.УровеньЗапрещенияИзменения
#КонецЕсли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
ПО
СоставыГруппПользователей.Пользователь = &amp;АвторизованныйПользователь
И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
)
)
#ИначеЕсли Не СтрСодержит(&amp;ВсеВидыДоступаКромеСпециальных, ",#Параметр(51),") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
#Если СтрСодержит("#Параметр(51)", ",") #Тогда
НеверныйВидДоступа: "#Параметр(51)" - "Список имен видов доступа не найден"
#Иначе
НеверныйВидДоступа: "#Параметр(51)" - "Имя вида доступа не найдено"
#КонецЕсли
#ИначеЕсли &amp;ВидыДоступаСОтключеннымИспользованием &lt;&gt; "Все"
И Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",#Параметр(51),") #Тогда
(
ЕСТЬNULL(#Параметр(52), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
И
#Если (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(51),", ",Пользователи,"))
Или (Не СтрСодержит(&amp;ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(51),", ",ВнешниеПользователи,")) #Тогда
НЕ
(
НЕ ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа
ГДЕ
ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(52)
И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &amp;АвторизованныйПользователь
)
И НЕ
#Иначе
(
#КонецЕсли
ВЫБОР
КОГДА ИСТИНА В
(
#Если СтрСодержит(&amp;ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(51),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = #Параметр(52)
#ИначеЕсли "#Параметр(52)" = "Т.Ссылка"
И "#Параметр(51)" &lt;&gt; "Пользователи"
И "#Параметр(51)" &lt;&gt; "ВнешниеПользователи" #Тогда
#Если СтрСодержит("#Параметр(51)", ",") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйВидДоступа: "#Параметр(51)" - "При проверке таблицы значения доступа можно указывать только один вид доступа"
#ИначеЕсли СтрСодержит(&amp;ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(51),") #Тогда
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#Иначе // Значения доступа, для которых можно указать несколько групп значений доступа.
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
И ГруппыЗначений.Ссылка = #Параметр(52)
#КонецЕсли
#Иначе
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
ПО
Значения.ГруппаДоступа = ГруппыДоступа.Ссылка
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа
И ГруппыЗначений.ЗначениеДоступа = #Параметр(52)
#КонецЕсли
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
=
ВЫБОР
КОГДА ИСТИНА В
(
ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию
ГДЕ
ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка
И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(52))
И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ
)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
)
)
#Иначе
ЕСТЬNULL(#Параметр(52), НЕОПРЕДЕЛЕНО) &lt;&gt; НЕОПРЕДЕЛЕНО
#КонецЕсли
#Параметр(53) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.
)
)
#КонецЕсли
#КонецЕсли // Информационная база заблокирована для обновления.
</condition>
</restrictionTemplate>
</Rights>