false true false InformationRegister.ПроцессыДляЗапуска Read true Update true View true Edit true TotalsControl true Task.ЗадачаИсполнителя.Command.Выполнено View true Report.Задания Use true View true Task.ЗадачаИсполнителя Read true #Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда #ДляОбъекта("БизнесПроцесс") #Иначе #ПоЗначениямИНаборамРасширенный( "Задача.ЗадачаИсполнителя", "", "", "", "", "Объект","Т.БизнесПроцесс","ИЛИ", "Пользователи","Т.Автор","ИЛИ", "Пользователи","Т.Исполнитель","ИЛИ", "Пользователи","Т.ГруппаИсполнителейЗадач","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","") #КонецЕсли View true InputByString true Task.ЗадачаИсполнителя.Command.ВсеЗадачи View true InformationRegister.ДанныеБизнесПроцессов Read true #Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда #ДляОбъекта("Владелец") #Иначе #ПоЗначениямИНаборамРасширенный( "РегистрСведений.ДанныеБизнесПроцессов", "", "", "", "", "Объект","Т.Владелец","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","") #КонецЕсли View true Configuration.БиблиотекаСтандартныхПодсистем MainWindowModeNormal true MainWindowModeWorkplace true MainWindowModeEmbeddedWorkplace true MainWindowModeFullscreenWorkplace true MainWindowModeKiosk true AnalyticsSystemClient true Task.ЗадачаИсполнителя.Command.МоиЗадачи View true Report.БизнесПроцессы Use true View true BusinessProcess.Задание Read true #Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда #ДляОбъекта("") #Иначе #ПоЗначениямИНаборамРасширенный( "БизнесПроцесс.Задание", "", "", "", "", "Пользователи","Т.Автор","ИЛИ", "Пользователи","Т.ГруппаИсполнителейЗадач","ИЛИ", "Пользователи","Т.ГруппаИсполнителейЗадачПроверяющий","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","") #КонецЕсли Insert true #Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда #ДляОбъекта("") #Иначе #ПоЗначениям( "БизнесПроцесс.Задание", "", "", "Пользователи","Автор", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","") #КонецЕсли Update true #Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда #ДляОбъекта("") #Иначе #ПоЗначениям( "БизнесПроцесс.Задание", "", "", "Пользователи","Автор", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","") #КонецЕсли View true InteractiveInsert true Edit true InteractiveSetDeletionMark true InteractiveClearDeletionMark true InputByString true InteractiveActivate true Start true InteractiveStart true Task.ЗадачаИсполнителя.Command.Перенаправить View true InformationRegister.ДанныеБизнесПроцессов.Command.МоиБизнесПроцессы View true ДляОбъекта(ПолеОбъекта) // ДляОбъекта(ПолеОбъекта = "") // Шаблон используется для ограничения элементов справочников, документов и // других списков объектов по полю Ссылка, а также элементов зависимых списков // объектов и записей регистров через поле объекта-владельца. // // Параметры: // ПолеОбъекта - имя поля, содержащего ссылку на объект, от которого зависит элемент списка. // Значение "" (по умолчанию) то же, что имя поля "Ссылка". // #Если &СпискиСОтключеннымОграничениемЧтения = "Неопределено" #Тогда // Информационная база заблокирована для обновления. ГДЕ ЛОЖЬ #ИначеЕсли Не СтрСодержит(&ВерсииШаблоновОграниченияДоступа, ",ДляОбъекта9,") #Тогда Ошибка: Требуется обновить шаблон на актуальную версию, поставляемую в роли ИзменениеУчастниковГруппДоступа по причине: Используется устаревшая версия 9 шаблона ограничения доступа ДляОбъекта. Объект: #ИмяТекущейТаблицы, Право: #ИмяТекущегоПраваДоступа. #ИначеЕсли &СпискиСОтключеннымОграничениемЧтения = "Все" #Тогда // У пользователя отключены все виды доступа или // ограничение на уровне записей не используется. ГДЕ ИСТИНА #ИначеЕсли СтрСодержит(&СпискиСОтключеннымОграничениемЧтения, #ИмяТекущейТаблицы + ";") #Тогда // У пользователя отключено ограничение для текущей таблицы. ГДЕ ИСТИНА #ИначеЕсли СтрСодержит(&ВерсииШаблоновОграниченияДоступа, ",ТребуетсяПерезапуститьСеанс,") #Тогда Ошибка: Версия программы обновлена, требуется перезапустить сеанс. Объект: #ИмяТекущейТаблицы, Право: #ИмяТекущегоПраваДоступа. #ИначеЕсли #ИмяТекущегоПраваДоступа <> "Чтение" #Тогда // Проверка прав Добавление, Изменение, Удаление выполняется ПередЗаписью / ПриЗаписи. ГДЕ ИСТИНА #ИначеЕсли СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ";0") #Тогда ГДЕ ЛОЖЬ #ИначеЕсли СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ";1") #Тогда Ошибка: Внешние пользователи отключены. #ИначеЕсли Не СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") И Не СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") #Тогда Ошибка: Требуется актуализировать ограничение доступа по причине: Не удалось определить вариант ограничения доступа в параметрах сеанса для шаблона ДляОбъекта со значением параметра "#ПолеОбъекта". Объект: #ИмяТекущейТаблицы, Право: #ИмяТекущегоПраваДоступа. #Иначе ТекущаяТаблица ГДЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.КлючиДоступаКОбъектам КАК КлючиДоступаКОбъектам #Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") #Тогда ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаНаборовГруппДоступа КАК КлючиДоступаНаборовГруппДоступа ПО #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда КлючиДоступаНаборовГруппДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаПользователей #Иначе КлючиДоступаНаборовГруппДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаВнешнихПользователей #КонецЕсли И КлючиДоступаНаборовГруппДоступа.НаборГруппДоступа = &РазрешенныйНаборГруппДоступа #КонецЕсли #Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;*") #Тогда ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаНаборовГруппДоступа КАК КлючиДоступаРазрешенногоНабораГруппДоступа ПО #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда КлючиДоступаРазрешенногоНабораГруппДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаПользователей #Иначе КлючиДоступаРазрешенногоНабораГруппДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаВнешнихПользователей #КонецЕсли И КлючиДоступаРазрешенногоНабораГруппДоступа.НаборГруппДоступа = &РазрешенныйПустойНаборГруппДоступа #КонецЕсли #Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") #Тогда #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаПользователей КАК КлючиДоступаПользователей ПО КлючиДоступаПользователей.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаПользователей И КлючиДоступаПользователей.Пользователь = &РазрешенныйПользователь #Иначе ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаВнешнихПользователей КАК КлючиДоступаПользователей ПО КлючиДоступаПользователей.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаВнешнихПользователей И КлючиДоступаПользователей.ВнешнийПользователь = &РазрешенныйПользователь #КонецЕсли #КонецЕсли #Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;+") #Тогда #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаПользователей КАК КлючиДоступаНаборовГруппПользователей ПО КлючиДоступаНаборовГруппПользователей.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаПользователей И КлючиДоступаНаборовГруппПользователей.Пользователь = &РазрешенныйНаборГруппПользователей #Иначе ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаВнешнихПользователей КАК КлючиДоступаНаборовГруппПользователей ПО КлючиДоступаНаборовГруппПользователей.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаВнешнихПользователей И КлючиДоступаНаборовГруппПользователей.ВнешнийПользователь = &РазрешенныйНаборГруппПользователей #КонецЕсли #КонецЕсли ГДЕ #Если "#ПолеОбъекта" = "" Или СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;;-") Или СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;*;-") Или СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;;-") Или СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;+;-") #Тогда КлючиДоступаКОбъектам.Объект = ТекущаяТаблица.Ссылка #Иначе КлючиДоступаКОбъектам.Объект = ТекущаяТаблица.#ПолеОбъекта #КонецЕсли И ( #Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") #Тогда НЕ КлючиДоступаНаборовГруппДоступа.КлючДоступа ЕСТЬ NULL #Иначе ЛОЖЬ #КонецЕсли #Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;*") #Тогда ИЛИ НЕ КлючиДоступаРазрешенногоНабораГруппДоступа.КлючДоступа ЕСТЬ NULL #КонецЕсли #Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") #Тогда ИЛИ НЕ КлючиДоступаПользователей.КлючДоступа ЕСТЬ NULL #КонецЕсли #Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;+") #Тогда ИЛИ НЕ КлючиДоступаНаборовГруппПользователей.КлючДоступа ЕСТЬ NULL #КонецЕсли ) ) #Если Не СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, #ИмяТекущейТаблицы + ":Пропустить;") И ( СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";УточнитьДляВсех;") Или СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, #ИмяТекущейТаблицы + ":Уточнить;") ) #Тогда #Если Не СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") #Тогда И ИСТИНА В (ИСТИНА #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";31;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";30;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";29;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";28;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";27;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";26;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";25;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";24;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";23;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";22;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";21;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";20;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";19;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";18;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";17;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";16;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";15;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";14;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";13;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";12;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";11;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";10;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";09;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";08;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";07;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";06;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";05;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";04;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";03;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";02;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";01;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";00;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли ) #Иначе И ИСТИНА В (ИСТИНА #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";31^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";30^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";29^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";28^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";27^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";26^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";25^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";24^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";23^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";22^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";21^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";20^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";19^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";18^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";17^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";16^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";15^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";14^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";13^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";12^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";11^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";10^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";09^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";08^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";07^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";06^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";05^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";04^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";03^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";02^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";01^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли #Если СтрСодержит(&ОбщиеПараметрыШаблоновОграниченияДоступа, ";00^;") #Тогда ,ИСТИНА #Иначе ,ЛОЖЬ #КонецЕсли ) #КонецЕсли #КонецЕсли #КонецЕсли ПоЗначениям // ПоЗначениям(Таблица, -, Модификатор, В1,П1, В2,П2, ..., В(n), П(n)). // № параметра: 1, 2, 3, 4, 5, 6, 7, ..., 2+n*2,3+n*2. // Читается так: "ограничение доступа по значениям". // Параметры: // Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". // Модификатор - изменяет шаблон. // 1-й модификатор - строка "НеОграничиватьДоступКГруппам" указывает // безусловно выбирать группы иерархического справочника. // Других модификаторов в этой версии шаблона не предусмотрено. // В(n) - Вид доступа - имя вида доступа, например, "Организации". Для полей составного типа, с целью повышения // производительности, лучше указать несколько имен, например, "Организации,ГруппыФизическихЛиц", // чем использовать несколько блоков параметров, с одним и тем же именем поля. // Специальные виды доступа "Условие", "НастройкиПрав", "ПравоЧтения", "ПравоИзменения", // "ПравоЧтенияПоИдентификатору", "ПравоИзмененияПоИдентификатору" можно использовать только отдельно. // Когда В(n) = "Условие" (или ""), тогда П(n) содержит строку условия на языке запросов, например // "Т.Автор = &АвторизованныйПользователь", // "ТИПЗНАЧЕНИЯ(Т.Владелец) = ТИП(Справочник.Организации)", где Т - псевдоним текущей таблицы. // Когда В(n) = "ПравоЧтения" Или "ПравоИзменения", // выполняется проверка наличия права на таблицу значения Т.П(n). // Когда В(n) = "ПравоЧтенияПоИдентификатору" или "ПравоИзмененияПоИдентификатору", // выполняется проверка наличия права на таблицу по идентификатору в значении Т.П(n). // П(n) - Поле проверяемого значения, кроме случая В(n) = "Условие" (или ""). // Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но // необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. // Шаблон имеет структуру: // <Общая часть условий> <Условие по группе параметров 1> И <Условие по группе параметров 2> И ... <Условие по группе параметров(n)> // Пример: // ПоЗначениям("Документ.ПоступлениеТоваровИУслуг", "", "", // "Организации","Организация", // "Поставщики","Контрагент", "","", ...) #Если &ОграничениеДоступаНаУровнеЗаписейИспользуется = "" #Тогда // Информационная база заблокирована для обновления. ГДЕ ЛОЖЬ #ИначеЕсли Не СтрСодержит(&ВерсииШаблоновОграниченияДоступа, ",ПоЗначениям18,") #Тогда Ошибка: Требуется обновить шаблон на актуальную версию, поставляемую в роли ИзменениеУчастниковГруппДоступа по причине: Используется устаревшая версия 18 шаблона ограничения доступа ПоЗначениям. Объект: #ИмяТекущейТаблицы, Право: #ИмяТекущегоПраваДоступа. #Иначе // Проверка правильности параметра Право. #Если Не ("#Параметр(2)" = "Чтение" Или "#Параметр(2)" = "Добавление" Или "#Параметр(2)" = "Изменение" Или "#Параметр(2)" = "Удаление" Или "#Параметр(2)" = "") Или #ИмяТекущегоПраваДоступа <> "Чтение" И "#Параметр(2)" = "Чтение" Или #ИмяТекущегоПраваДоступа = "Чтение" И "#Параметр(2)" <> "Чтение" И "#Параметр(2)" <> "" #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверноеПраво: #Параметр(2) #КонецЕсли // Проверка правильности параметра ИмяТаблицы. #Если "#Параметр(1)" <> #ИмяТекущейТаблицы #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверноеИмяТекущейТаблицы: "#Параметр(1)" #КонецЕсли // Проверка правильности параметра Модификатор. #Если Не ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" Или "#Параметр(3)" = "") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйМодификатор: #Параметр(3) #КонецЕсли // Общая проверка использования ограничений доступа на уровне записей и // проверка использования хотя бы одного ограничения из указанных видов доступа. #Если Не ( Истина И ("#Параметр(4)" = "" И "#Параметр(5)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(4),")) И ("#Параметр(6)" = "" И "#Параметр(7)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(6),")) И ("#Параметр(8)" = "" И "#Параметр(9)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(8),")) И ("#Параметр(10)" = "" И "#Параметр(11)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(10),")) И ("#Параметр(12)" = "" И "#Параметр(13)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(12),")) И ("#Параметр(14)" = "" И "#Параметр(15)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(14),")) И ("#Параметр(16)" = "" И "#Параметр(17)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(16),")) И ("#Параметр(18)" = "" И "#Параметр(19)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(18),")) И ("#Параметр(20)" = "" И "#Параметр(21)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(20),")) И ("#Параметр(22)" = "" И "#Параметр(23)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(22),")) И ("#Параметр(24)" = "" И "#Параметр(25)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(24),")) И ("#Параметр(26)" = "" И "#Параметр(27)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(26),")) И ("#Параметр(28)" = "" И "#Параметр(29)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(28),")) И ("#Параметр(30)" = "" И "#Параметр(31)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(30),")) И ("#Параметр(32)" = "" И "#Параметр(33)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(32),")) И ("#Параметр(34)" = "" И "#Параметр(35)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(34),")) ) #Тогда Т ГДЕ // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). ИСТИНА В ( // Проверка права пользователя на текущую таблицу в целом. // Права на таблицы формируются по составу ролей профиля группы доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ #Если СтрСодержит(&ТаблицыРасширенийСОграничениемДоступа, "|#Параметр(1);") #Тогда Справочник.ИдентификаторыОбъектовРасширений КАК СвойстваТекущейТаблицы #Иначе Справочник.ИдентификаторыОбъектовМетаданных КАК СвойстваТекущейТаблицы #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа ПО СвойстваТекущейТаблицы.ПолноеИмя = "#Параметр(1)" И ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа ГДЕ ТаблицыГруппДоступа.Таблица = СвойстваТекущейТаблицы.Ссылка И ТаблицыГруппДоступа.ГруппаДоступа = ГруппыДоступа.Ссылка #Если #ИмяТекущегоПраваДоступа = "Изменение" #Тогда И ТаблицыГруппДоступа.ПравоИзменение #ИначеЕсли #ИмяТекущегоПраваДоступа = "Добавление" #Тогда И ТаблицыГруппДоступа.ПравоДобавление #КонецЕсли ) И ГруппыДоступа.Ссылка В ( ВЫБРАТЬ ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа ИЗ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = ГруппыДоступаПользователи.Пользователь ) ГДЕ // Безусловная выборка групп в иерархическом объекте метаданных (если нужно). #Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда Т.ЭтоГруппа ИЛИ #КонецЕсли ( // Поиск значений заданных полей в разрешенных значениях групп доступа (пользователей). //// Проверка значения поля группы параметров 1. #Если &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(4)" = "Условие" Или "#Параметр(4)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. ( #Параметр(5) ) #ИначеЕсли "#Параметр(4)" = "ПравоЧтения" Или "#Параметр(4)" = "ПравоИзменения" #Тогда Т.#Параметр(5) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(5)) #Если Не "#Параметр(4)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(4)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(4)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(5) #Если Не "#Параметр(4)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда ИСТИНА // Группа параметров отключена. #ИначеЕсли "#Параметр(4)" = "НастройкиПрав" #Тогда ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(5) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(5) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(4),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(4)", ",") #Тогда НеверныйВидДоступа: "#Параметр(4)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(4)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(4),") #Тогда ( ЕСТЬNULL(Т.#Параметр(5), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(4),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(4),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(5) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(4),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.#Параметр(5) #ИначеЕсли "Т.#Параметр(5)" = "Т.Ссылка" И "#Параметр(4)" <> "Пользователи" И "#Параметр(4)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(4)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(4)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(4),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = Т.#Параметр(5) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(5) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(5)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе ЕСТЬNULL(Т.#Параметр(5), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли //// Проверка значения поля группы параметров 2. #Если "#Параметр(6)" = "" И "#Параметр(7)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(6)" = "Условие" Или "#Параметр(6)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. И ( #Параметр(7) ) #ИначеЕсли "#Параметр(6)" = "ПравоЧтения" Или "#Параметр(6)" = "ПравоИзменения" #Тогда И Т.#Параметр(7) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(7)) #Если Не "#Параметр(6)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(6)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(6)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(7) #Если Не "#Параметр(6)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Группа параметров отключена. #ИначеЕсли "#Параметр(6)" = "НастройкиПрав" #Тогда И ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(7) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(7) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(6),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(6)", ",") #Тогда НеверныйВидДоступа: "#Параметр(6)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(6)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(6),") #Тогда И ( ЕСТЬNULL(Т.#Параметр(7), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(6),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(6),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(7) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(6),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.#Параметр(7) #ИначеЕсли "Т.#Параметр(7)" = "Т.Ссылка" И "#Параметр(6)" <> "Пользователи" И "#Параметр(6)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(6)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(6)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(6),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = Т.#Параметр(7) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(7) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(7)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе И ЕСТЬNULL(Т.#Параметр(7), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли //// Проверка значения поля группы параметров 3. #Если "#Параметр(8)" = "" И "#Параметр(9)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(8)" = "Условие" Или "#Параметр(8)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. И ( #Параметр(9) ) #ИначеЕсли "#Параметр(8)" = "ПравоЧтения" Или "#Параметр(8)" = "ПравоИзменения" #Тогда И Т.#Параметр(9) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(9)) #Если Не "#Параметр(8)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(8)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(8)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(9) #Если Не "#Параметр(8)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Группа параметров отключена. #ИначеЕсли "#Параметр(8)" = "НастройкиПрав" #Тогда И ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(9) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(9) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(8),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(8)", ",") #Тогда НеверныйВидДоступа: "#Параметр(8)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(8)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(8),") #Тогда И ( ЕСТЬNULL(Т.#Параметр(9), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(8),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(8),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(9) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(8),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.#Параметр(9) #ИначеЕсли "Т.#Параметр(9)" = "Т.Ссылка" И "#Параметр(8)" <> "Пользователи" И "#Параметр(8)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(8)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(8)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(8),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = Т.#Параметр(9) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(9) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(9)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе И ЕСТЬNULL(Т.#Параметр(9), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли //// Проверка значения поля группы параметров 4. #Если "#Параметр(10)" = "" И "#Параметр(11)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(10)" = "Условие" Или "#Параметр(10)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. И ( #Параметр(11) ) #ИначеЕсли "#Параметр(10)" = "ПравоЧтения" Или "#Параметр(10)" = "ПравоИзменения" #Тогда И Т.#Параметр(11) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(11)) #Если Не "#Параметр(10)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(10)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(10)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(11) #Если Не "#Параметр(10)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Группа параметров отключена. #ИначеЕсли "#Параметр(10)" = "НастройкиПрав" #Тогда И ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(11) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(11) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(10),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(10)", ",") #Тогда НеверныйВидДоступа: "#Параметр(10)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(10)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(10),") #Тогда И ( ЕСТЬNULL(Т.#Параметр(11), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(10),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(10),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(11) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(10),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.#Параметр(11) #ИначеЕсли "Т.#Параметр(11)" = "Т.Ссылка" И "#Параметр(10)" <> "Пользователи" И "#Параметр(10)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(10)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(10)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(10),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = Т.#Параметр(11) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(11) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(11)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе И ЕСТЬNULL(Т.#Параметр(11), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли //// Проверка значения поля группы параметров 5. #Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(12)" = "Условие" Или "#Параметр(12)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. И ( #Параметр(13) ) #ИначеЕсли "#Параметр(12)" = "ПравоЧтения" Или "#Параметр(12)" = "ПравоИзменения" #Тогда И Т.#Параметр(13) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(13)) #Если Не "#Параметр(12)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(12)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(12)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(13) #Если Не "#Параметр(12)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Группа параметров отключена. #ИначеЕсли "#Параметр(12)" = "НастройкиПрав" #Тогда И ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(13) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(13) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(12),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(12)", ",") #Тогда НеверныйВидДоступа: "#Параметр(12)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(12)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(12),") #Тогда И ( ЕСТЬNULL(Т.#Параметр(13), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(12),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(12),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(13) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(12),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.#Параметр(13) #ИначеЕсли "Т.#Параметр(13)" = "Т.Ссылка" И "#Параметр(12)" <> "Пользователи" И "#Параметр(12)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(12)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(12)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(12),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = Т.#Параметр(13) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(13) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(13)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе И ЕСТЬNULL(Т.#Параметр(13), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли //// Проверка значения поля группы параметров 6. #Если "#Параметр(14)" = "" И "#Параметр(15)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(14)" = "Условие" Или "#Параметр(14)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. И ( #Параметр(15) ) #ИначеЕсли "#Параметр(14)" = "ПравоЧтения" Или "#Параметр(14)" = "ПравоИзменения" #Тогда И Т.#Параметр(15) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(15)) #Если Не "#Параметр(14)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(14)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(14)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(15) #Если Не "#Параметр(14)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Группа параметров отключена. #ИначеЕсли "#Параметр(14)" = "НастройкиПрав" #Тогда И ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(15) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(15) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(14),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(14)", ",") #Тогда НеверныйВидДоступа: "#Параметр(14)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(14)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(14),") #Тогда И ( ЕСТЬNULL(Т.#Параметр(15), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(14),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(14),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(15) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(14),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.#Параметр(15) #ИначеЕсли "Т.#Параметр(15)" = "Т.Ссылка" И "#Параметр(14)" <> "Пользователи" И "#Параметр(14)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(14)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(14)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(14),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = Т.#Параметр(15) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(15) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(15)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе И ЕСТЬNULL(Т.#Параметр(15), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли //// Проверка значения поля группы параметров 7. #Если "#Параметр(16)" = "" И "#Параметр(17)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(16)" = "Условие" Или "#Параметр(16)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. И ( #Параметр(17) ) #ИначеЕсли "#Параметр(16)" = "ПравоЧтения" Или "#Параметр(16)" = "ПравоИзменения" #Тогда И Т.#Параметр(17) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(17)) #Если Не "#Параметр(16)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(16)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(16)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(17) #Если Не "#Параметр(16)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Группа параметров отключена. #ИначеЕсли "#Параметр(16)" = "НастройкиПрав" #Тогда И ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(17) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(17) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(16),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(16)", ",") #Тогда НеверныйВидДоступа: "#Параметр(16)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(16)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(16),") #Тогда И ( ЕСТЬNULL(Т.#Параметр(17), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(16),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(16),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(17) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(16),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.#Параметр(17) #ИначеЕсли "Т.#Параметр(17)" = "Т.Ссылка" И "#Параметр(16)" <> "Пользователи" И "#Параметр(16)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(16)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(16)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(16),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = Т.#Параметр(17) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(17) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(17)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе И ЕСТЬNULL(Т.#Параметр(17), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли //// Проверка значения поля группы параметров 8. #Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(18)" = "Условие" Или "#Параметр(18)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. И ( #Параметр(19) ) #ИначеЕсли "#Параметр(18)" = "ПравоЧтения" Или "#Параметр(18)" = "ПравоИзменения" #Тогда И Т.#Параметр(19) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(19)) #Если Не "#Параметр(18)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(18)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(18)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(19) #Если Не "#Параметр(18)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Группа параметров отключена. #ИначеЕсли "#Параметр(18)" = "НастройкиПрав" #Тогда И ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(19) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(19) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(18),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(18)", ",") #Тогда НеверныйВидДоступа: "#Параметр(18)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(18)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(18),") #Тогда И ( ЕСТЬNULL(Т.#Параметр(19), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(18),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(18),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(19) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(18),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.#Параметр(19) #ИначеЕсли "Т.#Параметр(19)" = "Т.Ссылка" И "#Параметр(18)" <> "Пользователи" И "#Параметр(18)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(18)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(18)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(18),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = Т.#Параметр(19) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(19) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(19)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе И ЕСТЬNULL(Т.#Параметр(19), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли //// Проверка значения поля группы параметров 9. #Если "#Параметр(20)" = "" И "#Параметр(21)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(20)" = "Условие" Или "#Параметр(20)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. И ( #Параметр(21) ) #ИначеЕсли "#Параметр(20)" = "ПравоЧтения" Или "#Параметр(20)" = "ПравоИзменения" #Тогда И Т.#Параметр(21) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(21)) #Если Не "#Параметр(20)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(20)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(20)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(21) #Если Не "#Параметр(20)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Группа параметров отключена. #ИначеЕсли "#Параметр(20)" = "НастройкиПрав" #Тогда И ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(21) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(21) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(20),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(20)", ",") #Тогда НеверныйВидДоступа: "#Параметр(20)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(20)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(20),") #Тогда И ( ЕСТЬNULL(Т.#Параметр(21), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(20),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(20),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(21) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(20),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.#Параметр(21) #ИначеЕсли "Т.#Параметр(21)" = "Т.Ссылка" И "#Параметр(20)" <> "Пользователи" И "#Параметр(20)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(20)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(20)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(20),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = Т.#Параметр(21) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(21) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(21)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе И ЕСТЬNULL(Т.#Параметр(21), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли //// Проверка значения поля группы параметров 10. #Если "#Параметр(22)" = "" И "#Параметр(23)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(22)" = "Условие" Или "#Параметр(22)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. И ( #Параметр(23) ) #ИначеЕсли "#Параметр(22)" = "ПравоЧтения" Или "#Параметр(22)" = "ПравоИзменения" #Тогда И Т.#Параметр(23) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(23)) #Если Не "#Параметр(22)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(22)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(22)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(23) #Если Не "#Параметр(22)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Группа параметров отключена. #ИначеЕсли "#Параметр(22)" = "НастройкиПрав" #Тогда И ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(23) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(23) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(22),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(22)", ",") #Тогда НеверныйВидДоступа: "#Параметр(22)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(22)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(22),") #Тогда И ( ЕСТЬNULL(Т.#Параметр(23), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(22),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(22),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(23) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(22),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.#Параметр(23) #ИначеЕсли "Т.#Параметр(23)" = "Т.Ссылка" И "#Параметр(22)" <> "Пользователи" И "#Параметр(22)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(22)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(22)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(22),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = Т.#Параметр(23) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(23) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(23)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе И ЕСТЬNULL(Т.#Параметр(23), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли //// Проверка значения поля группы параметров 11. #Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(24)" = "Условие" Или "#Параметр(24)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. И ( #Параметр(25) ) #ИначеЕсли "#Параметр(24)" = "ПравоЧтения" Или "#Параметр(24)" = "ПравоИзменения" #Тогда И Т.#Параметр(25) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(25)) #Если Не "#Параметр(24)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(24)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(24)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(25) #Если Не "#Параметр(24)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Группа параметров отключена. #ИначеЕсли "#Параметр(24)" = "НастройкиПрав" #Тогда И ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(25) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(25) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(24),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(24)", ",") #Тогда НеверныйВидДоступа: "#Параметр(24)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(24)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(24),") #Тогда И ( ЕСТЬNULL(Т.#Параметр(25), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(24),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(24),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(25) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(24),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.#Параметр(25) #ИначеЕсли "Т.#Параметр(25)" = "Т.Ссылка" И "#Параметр(24)" <> "Пользователи" И "#Параметр(24)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(24)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(24)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(24),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = Т.#Параметр(25) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(25) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(25)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе И ЕСТЬNULL(Т.#Параметр(25), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли //// Проверка значения поля группы параметров 12. #Если "#Параметр(26)" = "" И "#Параметр(27)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(26)" = "Условие" Или "#Параметр(26)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. И ( #Параметр(27) ) #ИначеЕсли "#Параметр(26)" = "ПравоЧтения" Или "#Параметр(26)" = "ПравоИзменения" #Тогда И Т.#Параметр(27) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(27)) #Если Не "#Параметр(26)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(26)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(26)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(27) #Если Не "#Параметр(26)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Группа параметров отключена. #ИначеЕсли "#Параметр(26)" = "НастройкиПрав" #Тогда И ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(27) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(27) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(26),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(26)", ",") #Тогда НеверныйВидДоступа: "#Параметр(26)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(26)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(26),") #Тогда И ( ЕСТЬNULL(Т.#Параметр(27), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(26),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(26),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(27) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(26),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.#Параметр(27) #ИначеЕсли "Т.#Параметр(27)" = "Т.Ссылка" И "#Параметр(26)" <> "Пользователи" И "#Параметр(26)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(26)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(26)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(26),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = Т.#Параметр(27) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(27) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(27)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе И ЕСТЬNULL(Т.#Параметр(27), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли //// Проверка значения поля группы параметров 13. #Если "#Параметр(28)" = "" И "#Параметр(29)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(28)" = "Условие" Или "#Параметр(28)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. И ( #Параметр(29) ) #ИначеЕсли "#Параметр(28)" = "ПравоЧтения" Или "#Параметр(28)" = "ПравоИзменения" #Тогда И Т.#Параметр(29) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(29)) #Если Не "#Параметр(28)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(28)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(28)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(29) #Если Не "#Параметр(28)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Группа параметров отключена. #ИначеЕсли "#Параметр(28)" = "НастройкиПрав" #Тогда И ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(29) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(29) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(28),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(28)", ",") #Тогда НеверныйВидДоступа: "#Параметр(28)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(28)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(28),") #Тогда И ( ЕСТЬNULL(Т.#Параметр(29), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(28),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(28),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(29) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(28),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.#Параметр(29) #ИначеЕсли "Т.#Параметр(29)" = "Т.Ссылка" И "#Параметр(28)" <> "Пользователи" И "#Параметр(28)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(28)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(28)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(28),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = Т.#Параметр(29) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(29) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(29)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе И ЕСТЬNULL(Т.#Параметр(29), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли //// Проверка значения поля группы параметров 14. #Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(30)" = "Условие" Или "#Параметр(30)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. И ( #Параметр(31) ) #ИначеЕсли "#Параметр(30)" = "ПравоЧтения" Или "#Параметр(30)" = "ПравоИзменения" #Тогда И Т.#Параметр(31) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(31)) #Если Не "#Параметр(30)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(30)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(30)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(31) #Если Не "#Параметр(30)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Группа параметров отключена. #ИначеЕсли "#Параметр(30)" = "НастройкиПрав" #Тогда И ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(31) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(31) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(30),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(30)", ",") #Тогда НеверныйВидДоступа: "#Параметр(30)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(30)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(30),") #Тогда И ( ЕСТЬNULL(Т.#Параметр(31), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(30),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(30),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(31) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(30),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.#Параметр(31) #ИначеЕсли "Т.#Параметр(31)" = "Т.Ссылка" И "#Параметр(30)" <> "Пользователи" И "#Параметр(30)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(30)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(30)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(30),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = Т.#Параметр(31) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(31) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(31)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе И ЕСТЬNULL(Т.#Параметр(31), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли //// Проверка значения поля группы параметров 15. #Если "#Параметр(32)" = "" И "#Параметр(33)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(32)" = "Условие" Или "#Параметр(32)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. И ( #Параметр(33) ) #ИначеЕсли "#Параметр(32)" = "ПравоЧтения" Или "#Параметр(32)" = "ПравоИзменения" #Тогда И Т.#Параметр(33) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(33)) #Если Не "#Параметр(32)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(32)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(32)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(33) #Если Не "#Параметр(32)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Группа параметров отключена. #ИначеЕсли "#Параметр(32)" = "НастройкиПрав" #Тогда И ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(33) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(33) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(32),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(32)", ",") #Тогда НеверныйВидДоступа: "#Параметр(32)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(32)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(32),") #Тогда И ( ЕСТЬNULL(Т.#Параметр(33), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(32),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(32),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(33) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(32),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.#Параметр(33) #ИначеЕсли "Т.#Параметр(33)" = "Т.Ссылка" И "#Параметр(32)" <> "Пользователи" И "#Параметр(32)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(32)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(32)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(32),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = Т.#Параметр(33) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(33) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(33)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе И ЕСТЬNULL(Т.#Параметр(33), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли //// Проверка значения поля группы параметров 16. #Если "#Параметр(34)" = "" И "#Параметр(35)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(34)" = "Условие" Или "#Параметр(34)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. И ( #Параметр(35) ) #ИначеЕсли "#Параметр(34)" = "ПравоЧтения" Или "#Параметр(34)" = "ПравоИзменения" #Тогда И Т.#Параметр(35) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(Т.#Параметр(35)) #Если Не "#Параметр(34)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(34)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(34)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = Т.#Параметр(35) #Если Не "#Параметр(34)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Группа параметров отключена. #ИначеЕсли "#Параметр(34)" = "НастройкиПрав" #Тогда И ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(35) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = Т.#Параметр(35) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(34),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(34)", ",") #Тогда НеверныйВидДоступа: "#Параметр(34)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(34)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(34),") #Тогда И ( ЕСТЬNULL(Т.#Параметр(35), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(34),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(34),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = Т.#Параметр(35) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(34),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.#Параметр(35) #ИначеЕсли "Т.#Параметр(35)" = "Т.Ссылка" И "#Параметр(34)" <> "Пользователи" И "#Параметр(34)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(34)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(34)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(34),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = Т.#Параметр(35) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(35) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(Т.#Параметр(35)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе И ЕСТЬNULL(Т.#Параметр(35), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли ) ) #КонецЕсли #КонецЕсли // Информационная база заблокирована для обновления. ПоЗначениямИНаборамРасширенный // ПоЗначениямИНаборамРасширенный(Таблица, -, Модификатор, ПрисоединяемыеТаблицы, О, В1,П1,О1, В2,П2,О2,..., В(n), П(n), О(n)). // № параметра: 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,...,3+n*3,4+n*3,5+n*3. // Читается так: "ограничение доступа по значениям и наборам расширенный". // Параметры: // Таблица - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг". // Модификатор - изменяет шаблон. // 1-й модификатор - строка "НеОграничиватьДоступКГруппам" указывает // безусловно выбирать группы иерархического справочника. // 2-й модификатор - строка "РасширенноеИЛИ" указывает для ограничений, // например, "ПоОрганизациям или ПоУчетнымЗаписям" делать расширенную // проверку, при которой вариант настройки вида доступа в группах доступа // "Все разрешены, без запрещенных" считается, как "Вид доступа не используется". // Если этого модификатора нет, тогда результат проверки Истина, что приводит // к итоговому результату Истина, если "Все разрешены, без запрещенных" // хотя бы по одному из видов доступа (либо ПоОрганизациям, либо ПоУчетнымЗаписям). // Модификатор имеет смысл только при проверке наборов значений доступа. // Можно использовать комбинации модификаторов: "НеОграничиватьДоступКГруппам", // "РасширенноеИЛИ", "НеОграничиватьДоступКГруппам,РасширенноеИЛИ". // Других модификаторов в этой версии шаблона не предусмотрено. // ПрисоединяемыеТаблицы - текст присоедиения дополнительных таблиц на языке запросов, например, // "ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет.ОплатаПоставщикам КАК Т1 // ПО Т.Ссылка = Т1.Ссылка". // Присоединение позволяет указать поля таблицы ОплатаПоставщикам, как поля основной таблицы // для проверки их значений, как значений основной таблицы. // Следует помнить, что при размножении строк в результате соединения, достаточно чтобы // всего одна строка прошла условия проверки, т.е. результаты проверки строк объединяются по "ИЛИ". // О - Начальные скобки "(". // В(n) - Вид доступа - имя вида доступа, например, "Организации". Для полей составного типа, с целью повышения // производительности, лучше указать несколько имен, например, "Организации,ГруппыФизическихЛиц", // чем использовать несколько блоков параметров, с одним и тем же именем поля. // Специальные виды доступа "Объект", "Условие", "НастройкиПрав", "ПравоЧтения", "ПравоИзменения", // "ПравоЧтенияПоИдентификатору", "ПравоИзмененияПоИдентификатору" можно использовать только отдельно. // Когда В(n) = "Условие" (или ""), Тогда П(n) содержит строку условия на языке запросов, например // "Т.Автор = &АвторизованныйПользователь", // "ТИПЗНАЧЕНИЯ(Т.Владелец) = ТИП(Справочник.Организации)", где Т - псевдоним текущей таблицы. // Когда В(n) = "ПравоЧтения" Или "ПравоИзменения", // выполняется проверка наличия права на таблицу значения Т.П(n). // Когда В(n) = "ПравоЧтенияПоИдентификатору" или "ПравоИзмененияПоИдентификатору", // выполняется проверка наличия права на таблицу по идентификатору в значении Т.П(n). // Когда В(n) = "Объект" (или " "), то // когда есть запись зависимости прав в регистре сведений ЗависимостиПравДоступа тогда // выполняется проверка права чтения Т.П(n) и наборов значений доступа // в регистре сведений НаборыЗначенийДоступа, считываемых по ссылке Т.П(n) для права чтения; // иначе используется стандартное правило: // когда Право = "Чтение" тогда выполняется проверка права чтения Т.П(n) и наборов значений доступа // в регистре сведений НаборыЗначенийДоступа, считываемых по ссылке Т.П(n) для права чтения; // когда Право = "Изменение" тогда выполняется проверка права изменения Т.П(n) // и наборов значений доступа, считываемых по ссылке Т.П(n) для права изменения. // П(n) - Поле проверяемого значения с псевдонимом, например "Т.Организация", // кроме случая В(n) = "Условие" (или ""). // О(n) - Логические операции "И", "ИЛИ" в сочетании с скобками "(", ")". // Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но // необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. // Шаблон имеет структуру: // <Соединение по таблице1> <Соединение по таблице2> ... <Соединение по таблице(m)> // <Общая часть условий> <Условие по группе параметров 1> И/ИЛИ <Условие по группе параметров 1> И/ИЛИ ... <Условие по группе параметров(n)> // Пример: // ПоЗначениямИНаборамРасширенный("ЖурналДокументов.СкладскиеДокументы", "", "", // "", // "", // "Объект","Т.Ссылка","И", // "Объект","Т.ОсновнойДокумент","", "","","", ...) #Если &ОграничениеДоступаНаУровнеЗаписейИспользуется = "" #Тогда // Информационная база заблокирована для обновления. ГДЕ ЛОЖЬ #ИначеЕсли Не СтрСодержит(&ВерсииШаблоновОграниченияДоступа, ",ПоЗначениямИНаборамРасширенный18,") #Тогда Ошибка: Требуется обновить шаблон на актуальную версию, поставляемую в роли ИзменениеУчастниковГруппДоступа по причине: Используется устаревшая версия 18 шаблона ограничения доступа ПоЗначениямИНаборамРасширенный. Объект: #ИмяТекущейТаблицы, Право: #ИмяТекущегоПраваДоступа. #Иначе // Проверка правильности параметра Право. #Если Не ("#Параметр(2)" = "Чтение" Или "#Параметр(2)" = "Добавление" Или "#Параметр(2)" = "Изменение" Или "#Параметр(2)" = "Удаление" Или "#Параметр(2)" = "") Или #ИмяТекущегоПраваДоступа <> "Чтение" И "#Параметр(2)" = "Чтение" Или #ИмяТекущегоПраваДоступа = "Чтение" И "#Параметр(2)" <> "Чтение" И "#Параметр(2)" <> "" #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверноеПраво: #Параметр(2) #КонецЕсли // Проверка правильности параметра ИмяТаблицы. #Если "#Параметр(1)" <> #ИмяТекущейТаблицы #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверноеИмяТекущейТаблицы: "#Параметр(1)" #КонецЕсли // Проверка правильности параметра Модификатор. #Если Не ( "#Параметр(3)" = "НеОграничиватьДоступКГруппам" Или "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" Или "#Параметр(3)" = "") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйМодификатор: #Параметр(3) #КонецЕсли // Общая проверка использования ограничений доступа на уровне записей и // проверка использования хотя бы одного ограничения из указанных видов доступа. #Если Не ( Истина И ("#Параметр(6)" = "" И "#Параметр(7)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(6),")) И ("#Параметр(9)" = "" И "#Параметр(10)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(9),")) И ("#Параметр(12)" = "" И "#Параметр(13)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(12),")) И ("#Параметр(15)" = "" И "#Параметр(16)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(15),")) И ("#Параметр(18)" = "" И "#Параметр(19)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(18),")) И ("#Параметр(21)" = "" И "#Параметр(22)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(21),")) И ("#Параметр(24)" = "" И "#Параметр(25)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(24),")) И ("#Параметр(27)" = "" И "#Параметр(28)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(27),")) И ("#Параметр(30)" = "" И "#Параметр(31)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(30),")) И ("#Параметр(33)" = "" И "#Параметр(34)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(33),")) И ("#Параметр(36)" = "" И "#Параметр(37)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(36),")) И ("#Параметр(39)" = "" И "#Параметр(40)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(39),")) И ("#Параметр(42)" = "" И "#Параметр(43)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(42),")) И ("#Параметр(45)" = "" И "#Параметр(46)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(45),")) И ("#Параметр(48)" = "" И "#Параметр(49)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(48),")) И ("#Параметр(51)" = "" И "#Параметр(52)" = "" Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(51),")) ) #Тогда Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов). // Присоединяемые таблицы к проверяемой строке текущей таблицы "Т". #Параметр(4) ГДЕ ИСТИНА В ( // Проверка права пользователя на текущую таблицу в целом. // Права на таблицы формируются по составу ролей профиля группы доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ #Если СтрСодержит(&ТаблицыРасширенийСОграничениемДоступа, "|#Параметр(1);") #Тогда Справочник.ИдентификаторыОбъектовРасширений КАК СвойстваТекущейТаблицы #Иначе Справочник.ИдентификаторыОбъектовМетаданных КАК СвойстваТекущейТаблицы #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа ПО СвойстваТекущейТаблицы.ПолноеИмя = "#Параметр(1)" И ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа ГДЕ ТаблицыГруппДоступа.Таблица = СвойстваТекущейТаблицы.Ссылка И ТаблицыГруппДоступа.ГруппаДоступа = ГруппыДоступа.Ссылка #Если #ИмяТекущегоПраваДоступа = "Изменение" #Тогда И ТаблицыГруппДоступа.ПравоИзменение #ИначеЕсли #ИмяТекущегоПраваДоступа = "Добавление" #Тогда И ТаблицыГруппДоступа.ПравоДобавление #КонецЕсли ) И ГруппыДоступа.Ссылка В ( ВЫБРАТЬ ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа ИЗ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = ГруппыДоступаПользователи.Пользователь ) ГДЕ // Безусловная выборка групп в иерархическом объекте метаданных (если нужно). #Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда Т.ЭтоГруппа ИЛИ #КонецЕсли ( // Поиск значений заданных полей в разрешенных значениях групп доступа (пользователей). #Параметр(5) // [([(][(]...] 0-n открывающихся скобок. //// Проверка значения поля группы параметров 1. #Если &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(6)" = "Условие" Или "#Параметр(6)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. ( #Параметр(7) ) #ИначеЕсли "#Параметр(6)" = "ПравоЧтения" Или "#Параметр(6)" = "ПравоИзменения" #Тогда #Параметр(7) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(7)) #Если Не "#Параметр(6)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(6)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(6)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(7) #Если Не "#Параметр(6)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(6)" = "Объект" Или "#Параметр(6)" = " " #Тогда ( // Проверка права объекта ведущей таблицы (зависимость по правам) ( ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта ГДЕ ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(7)) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Проверка ведущего права для права Чтение // Право Чтение может зависеть только от права Чтение #Иначе // Проверка ведущего права для права Изменение // Право Изменение может зависеть от ведущих прав Чтение, Изменение И НЕ ( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(7)) ) ) #КонецЕсли ) ) #Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Проверка ограничения права объекта ведущей таблицы И #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(7)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ИЛИ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(7)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ТОГДА ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(7) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(7) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) ИНАЧЕ #КонецЕсли #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда НЕ ( ИСТИНА В // Не все проверки отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(7) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(7)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(7) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) ) И НЕ #Иначе ( #КонецЕсли ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(7) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(7)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(7) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) И #КонецЕсли НЕ ЛОЖЬ В // Все проверки успешны. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(7) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ВЫБОР #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда #Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда КОГДА НаборыЗначений.ЗначениеБезГрупп ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли КОГДА НаборыЗначений.СтандартноеЗначение #Иначе КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) ) #КонецЕсли #Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда ТОГДА ИСТИНА #Иначе ТОГДА #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ВЫБОР #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда КОГДА НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли #Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) ТОГДА ИСТИНА #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ИНАЧЕ #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОНЕЦ #КонецЕсли #КонецЕсли // Проверка заведомого ложного или истинного однострочного набора значений. КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен) ТОГДА ИСТИНА КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен) ТОГДА ЛОЖЬ // Проверка права доступа пользователя к таблице ЗначенияДоступа. КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных) ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа ) #Иначе ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ) ) #КонецЕсли #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ИНАЧЕ ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #Иначе ИНАЧЕ ЛОЖЬ #КонецЕсли КОНЕЦ ) // НЕ ЛОЖЬ В ) ) #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда КОНЕЦ #КонецЕсли #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда ИСТИНА // Группа параметров отключена. #ИначеЕсли "#Параметр(6)" = "НастройкиПрав" #Тогда ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(7) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(7) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(6),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(6)", ",") #Тогда НеверныйВидДоступа: "#Параметр(6)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(6)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(6),") #Тогда ( ЕСТЬNULL(#Параметр(7), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(6),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(6),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(7) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(6),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = #Параметр(7) #ИначеЕсли "#Параметр(7)" = "Т.Ссылка" И "#Параметр(6)" <> "Пользователи" И "#Параметр(6)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(6)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(6)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(6),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = #Параметр(7) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = #Параметр(7) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(7)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе ЕСТЬNULL(#Параметр(7), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли #Параметр(8) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. //// Проверка значения поля группы параметров 2. #Если "#Параметр(9)" = "" И "#Параметр(10)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(9)" = "Условие" Или "#Параметр(9)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. ( #Параметр(10) ) #ИначеЕсли "#Параметр(9)" = "ПравоЧтения" Или "#Параметр(9)" = "ПравоИзменения" #Тогда #Параметр(10) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(10)) #Если Не "#Параметр(9)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(9)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(9)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(10) #Если Не "#Параметр(9)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(9)" = "Объект" Или "#Параметр(9)" = " " #Тогда ( // Проверка права объекта ведущей таблицы (зависимость по правам) ( ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта ГДЕ ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(10)) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Проверка ведущего права для права Чтение // Право Чтение может зависеть только от права Чтение #Иначе // Проверка ведущего права для права Изменение // Право Изменение может зависеть от ведущих прав Чтение, Изменение И НЕ ( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(10)) ) ) #КонецЕсли ) ) #Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Проверка ограничения права объекта ведущей таблицы И #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(10)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ИЛИ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(10)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ТОГДА ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(10) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(10) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) ИНАЧЕ #КонецЕсли #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда НЕ ( ИСТИНА В // Не все проверки отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(10) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(10)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(10) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) ) И НЕ #Иначе ( #КонецЕсли ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(10) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(10)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(10) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) И #КонецЕсли НЕ ЛОЖЬ В // Все проверки успешны. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(10) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ВЫБОР #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда #Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда КОГДА НаборыЗначений.ЗначениеБезГрупп ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли КОГДА НаборыЗначений.СтандартноеЗначение #Иначе КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) ) #КонецЕсли #Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда ТОГДА ИСТИНА #Иначе ТОГДА #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ВЫБОР #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда КОГДА НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли #Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) ТОГДА ИСТИНА #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ИНАЧЕ #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОНЕЦ #КонецЕсли #КонецЕсли // Проверка заведомого ложного или истинного однострочного набора значений. КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен) ТОГДА ИСТИНА КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен) ТОГДА ЛОЖЬ // Проверка права доступа пользователя к таблице ЗначенияДоступа. КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных) ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа ) #Иначе ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ) ) #КонецЕсли #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ИНАЧЕ ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #Иначе ИНАЧЕ ЛОЖЬ #КонецЕсли КОНЕЦ ) // НЕ ЛОЖЬ В ) ) #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда КОНЕЦ #КонецЕсли #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда ИСТИНА // Группа параметров отключена. #ИначеЕсли "#Параметр(9)" = "НастройкиПрав" #Тогда ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(10) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(10) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(9),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(9)", ",") #Тогда НеверныйВидДоступа: "#Параметр(9)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(9)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(9),") #Тогда ( ЕСТЬNULL(#Параметр(10), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(9),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(9),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(10) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(9),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = #Параметр(10) #ИначеЕсли "#Параметр(10)" = "Т.Ссылка" И "#Параметр(9)" <> "Пользователи" И "#Параметр(9)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(9)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(9)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(9),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = #Параметр(10) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = #Параметр(10) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(10)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе ЕСТЬNULL(#Параметр(10), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли #Параметр(11) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. //// Проверка значения поля группы параметров 3. #Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(12)" = "Условие" Или "#Параметр(12)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. ( #Параметр(13) ) #ИначеЕсли "#Параметр(12)" = "ПравоЧтения" Или "#Параметр(12)" = "ПравоИзменения" #Тогда #Параметр(13) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(13)) #Если Не "#Параметр(12)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(12)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(12)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(13) #Если Не "#Параметр(12)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(12)" = "Объект" Или "#Параметр(12)" = " " #Тогда ( // Проверка права объекта ведущей таблицы (зависимость по правам) ( ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта ГДЕ ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(13)) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Проверка ведущего права для права Чтение // Право Чтение может зависеть только от права Чтение #Иначе // Проверка ведущего права для права Изменение // Право Изменение может зависеть от ведущих прав Чтение, Изменение И НЕ ( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(13)) ) ) #КонецЕсли ) ) #Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Проверка ограничения права объекта ведущей таблицы И #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(13)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ИЛИ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(13)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ТОГДА ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(13) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(13) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) ИНАЧЕ #КонецЕсли #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда НЕ ( ИСТИНА В // Не все проверки отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(13) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(13)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(13) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) ) И НЕ #Иначе ( #КонецЕсли ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(13) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(13)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(13) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) И #КонецЕсли НЕ ЛОЖЬ В // Все проверки успешны. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(13) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ВЫБОР #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда #Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда КОГДА НаборыЗначений.ЗначениеБезГрупп ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли КОГДА НаборыЗначений.СтандартноеЗначение #Иначе КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) ) #КонецЕсли #Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда ТОГДА ИСТИНА #Иначе ТОГДА #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ВЫБОР #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда КОГДА НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли #Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) ТОГДА ИСТИНА #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ИНАЧЕ #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОНЕЦ #КонецЕсли #КонецЕсли // Проверка заведомого ложного или истинного однострочного набора значений. КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен) ТОГДА ИСТИНА КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен) ТОГДА ЛОЖЬ // Проверка права доступа пользователя к таблице ЗначенияДоступа. КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных) ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа ) #Иначе ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ) ) #КонецЕсли #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ИНАЧЕ ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #Иначе ИНАЧЕ ЛОЖЬ #КонецЕсли КОНЕЦ ) // НЕ ЛОЖЬ В ) ) #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда КОНЕЦ #КонецЕсли #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда ИСТИНА // Группа параметров отключена. #ИначеЕсли "#Параметр(12)" = "НастройкиПрав" #Тогда ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(13) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(13) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(12),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(12)", ",") #Тогда НеверныйВидДоступа: "#Параметр(12)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(12)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(12),") #Тогда ( ЕСТЬNULL(#Параметр(13), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(12),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(12),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(13) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(12),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = #Параметр(13) #ИначеЕсли "#Параметр(13)" = "Т.Ссылка" И "#Параметр(12)" <> "Пользователи" И "#Параметр(12)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(12)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(12)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(12),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = #Параметр(13) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = #Параметр(13) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(13)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе ЕСТЬNULL(#Параметр(13), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли #Параметр(14) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. //// Проверка значения поля группы параметров 4. #Если "#Параметр(15)" = "" И "#Параметр(16)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(15)" = "Условие" Или "#Параметр(15)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. ( #Параметр(16) ) #ИначеЕсли "#Параметр(15)" = "ПравоЧтения" Или "#Параметр(15)" = "ПравоИзменения" #Тогда #Параметр(16) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(16)) #Если Не "#Параметр(15)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(15)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(15)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(16) #Если Не "#Параметр(15)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(15)" = "Объект" Или "#Параметр(15)" = " " #Тогда ( // Проверка права объекта ведущей таблицы (зависимость по правам) ( ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта ГДЕ ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(16)) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Проверка ведущего права для права Чтение // Право Чтение может зависеть только от права Чтение #Иначе // Проверка ведущего права для права Изменение // Право Изменение может зависеть от ведущих прав Чтение, Изменение И НЕ ( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(16)) ) ) #КонецЕсли ) ) #Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Проверка ограничения права объекта ведущей таблицы И #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(16)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ИЛИ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(16)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ТОГДА ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(16) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(16) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) ИНАЧЕ #КонецЕсли #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда НЕ ( ИСТИНА В // Не все проверки отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(16) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(16)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(16) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) ) И НЕ #Иначе ( #КонецЕсли ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(16) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(16)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(16) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) И #КонецЕсли НЕ ЛОЖЬ В // Все проверки успешны. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(16) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ВЫБОР #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда #Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда КОГДА НаборыЗначений.ЗначениеБезГрупп ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли КОГДА НаборыЗначений.СтандартноеЗначение #Иначе КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) ) #КонецЕсли #Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда ТОГДА ИСТИНА #Иначе ТОГДА #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ВЫБОР #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда КОГДА НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли #Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) ТОГДА ИСТИНА #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ИНАЧЕ #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОНЕЦ #КонецЕсли #КонецЕсли // Проверка заведомого ложного или истинного однострочного набора значений. КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен) ТОГДА ИСТИНА КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен) ТОГДА ЛОЖЬ // Проверка права доступа пользователя к таблице ЗначенияДоступа. КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных) ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа ) #Иначе ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ) ) #КонецЕсли #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ИНАЧЕ ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #Иначе ИНАЧЕ ЛОЖЬ #КонецЕсли КОНЕЦ ) // НЕ ЛОЖЬ В ) ) #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда КОНЕЦ #КонецЕсли #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда ИСТИНА // Группа параметров отключена. #ИначеЕсли "#Параметр(15)" = "НастройкиПрав" #Тогда ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(16) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(16) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(15),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(15)", ",") #Тогда НеверныйВидДоступа: "#Параметр(15)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(15)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(15),") #Тогда ( ЕСТЬNULL(#Параметр(16), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(15),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(15),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(16) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(15),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = #Параметр(16) #ИначеЕсли "#Параметр(16)" = "Т.Ссылка" И "#Параметр(15)" <> "Пользователи" И "#Параметр(15)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(15)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(15)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(15),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = #Параметр(16) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = #Параметр(16) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(16)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе ЕСТЬNULL(#Параметр(16), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли #Параметр(17) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. //// Проверка значения поля группы параметров 5. #Если "#Параметр(18)" = "" И "#Параметр(19)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(18)" = "Условие" Или "#Параметр(18)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. ( #Параметр(19) ) #ИначеЕсли "#Параметр(18)" = "ПравоЧтения" Или "#Параметр(18)" = "ПравоИзменения" #Тогда #Параметр(19) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(19)) #Если Не "#Параметр(18)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(18)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(18)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(19) #Если Не "#Параметр(18)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(18)" = "Объект" Или "#Параметр(18)" = " " #Тогда ( // Проверка права объекта ведущей таблицы (зависимость по правам) ( ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта ГДЕ ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(19)) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Проверка ведущего права для права Чтение // Право Чтение может зависеть только от права Чтение #Иначе // Проверка ведущего права для права Изменение // Право Изменение может зависеть от ведущих прав Чтение, Изменение И НЕ ( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(19)) ) ) #КонецЕсли ) ) #Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Проверка ограничения права объекта ведущей таблицы И #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(19)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ИЛИ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(19)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ТОГДА ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(19) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(19) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) ИНАЧЕ #КонецЕсли #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда НЕ ( ИСТИНА В // Не все проверки отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(19) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(19)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(19) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) ) И НЕ #Иначе ( #КонецЕсли ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(19) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(19)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(19) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) И #КонецЕсли НЕ ЛОЖЬ В // Все проверки успешны. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(19) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ВЫБОР #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда #Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда КОГДА НаборыЗначений.ЗначениеБезГрупп ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли КОГДА НаборыЗначений.СтандартноеЗначение #Иначе КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) ) #КонецЕсли #Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда ТОГДА ИСТИНА #Иначе ТОГДА #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ВЫБОР #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда КОГДА НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли #Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) ТОГДА ИСТИНА #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ИНАЧЕ #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОНЕЦ #КонецЕсли #КонецЕсли // Проверка заведомого ложного или истинного однострочного набора значений. КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен) ТОГДА ИСТИНА КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен) ТОГДА ЛОЖЬ // Проверка права доступа пользователя к таблице ЗначенияДоступа. КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных) ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа ) #Иначе ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ) ) #КонецЕсли #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ИНАЧЕ ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #Иначе ИНАЧЕ ЛОЖЬ #КонецЕсли КОНЕЦ ) // НЕ ЛОЖЬ В ) ) #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда КОНЕЦ #КонецЕсли #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда ИСТИНА // Группа параметров отключена. #ИначеЕсли "#Параметр(18)" = "НастройкиПрав" #Тогда ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(19) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(19) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(18),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(18)", ",") #Тогда НеверныйВидДоступа: "#Параметр(18)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(18)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(18),") #Тогда ( ЕСТЬNULL(#Параметр(19), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(18),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(18),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(19) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(18),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = #Параметр(19) #ИначеЕсли "#Параметр(19)" = "Т.Ссылка" И "#Параметр(18)" <> "Пользователи" И "#Параметр(18)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(18)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(18)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(18),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = #Параметр(19) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = #Параметр(19) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(19)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе ЕСТЬNULL(#Параметр(19), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли #Параметр(20) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. //// Проверка значения поля группы параметров 6. #Если "#Параметр(21)" = "" И "#Параметр(22)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(21)" = "Условие" Или "#Параметр(21)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. ( #Параметр(22) ) #ИначеЕсли "#Параметр(21)" = "ПравоЧтения" Или "#Параметр(21)" = "ПравоИзменения" #Тогда #Параметр(22) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(22)) #Если Не "#Параметр(21)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(21)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(21)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(22) #Если Не "#Параметр(21)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(21)" = "Объект" Или "#Параметр(21)" = " " #Тогда ( // Проверка права объекта ведущей таблицы (зависимость по правам) ( ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта ГДЕ ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(22)) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Проверка ведущего права для права Чтение // Право Чтение может зависеть только от права Чтение #Иначе // Проверка ведущего права для права Изменение // Право Изменение может зависеть от ведущих прав Чтение, Изменение И НЕ ( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(22)) ) ) #КонецЕсли ) ) #Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Проверка ограничения права объекта ведущей таблицы И #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(22)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ИЛИ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(22)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ТОГДА ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(22) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(22) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) ИНАЧЕ #КонецЕсли #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда НЕ ( ИСТИНА В // Не все проверки отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(22) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(22)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(22) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) ) И НЕ #Иначе ( #КонецЕсли ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(22) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(22)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(22) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) И #КонецЕсли НЕ ЛОЖЬ В // Все проверки успешны. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(22) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ВЫБОР #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда #Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда КОГДА НаборыЗначений.ЗначениеБезГрупп ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли КОГДА НаборыЗначений.СтандартноеЗначение #Иначе КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) ) #КонецЕсли #Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда ТОГДА ИСТИНА #Иначе ТОГДА #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ВЫБОР #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда КОГДА НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли #Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) ТОГДА ИСТИНА #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ИНАЧЕ #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОНЕЦ #КонецЕсли #КонецЕсли // Проверка заведомого ложного или истинного однострочного набора значений. КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен) ТОГДА ИСТИНА КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен) ТОГДА ЛОЖЬ // Проверка права доступа пользователя к таблице ЗначенияДоступа. КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных) ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа ) #Иначе ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ) ) #КонецЕсли #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ИНАЧЕ ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #Иначе ИНАЧЕ ЛОЖЬ #КонецЕсли КОНЕЦ ) // НЕ ЛОЖЬ В ) ) #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда КОНЕЦ #КонецЕсли #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда ИСТИНА // Группа параметров отключена. #ИначеЕсли "#Параметр(21)" = "НастройкиПрав" #Тогда ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(22) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(22) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(21),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(21)", ",") #Тогда НеверныйВидДоступа: "#Параметр(21)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(21)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(21),") #Тогда ( ЕСТЬNULL(#Параметр(22), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(21),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(21),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(22) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(21),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = #Параметр(22) #ИначеЕсли "#Параметр(22)" = "Т.Ссылка" И "#Параметр(21)" <> "Пользователи" И "#Параметр(21)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(21)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(21)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(21),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = #Параметр(22) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = #Параметр(22) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(22)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе ЕСТЬNULL(#Параметр(22), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли #Параметр(23) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. //// Проверка значения поля группы параметров 7. #Если "#Параметр(24)" = "" И "#Параметр(25)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(24)" = "Условие" Или "#Параметр(24)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. ( #Параметр(25) ) #ИначеЕсли "#Параметр(24)" = "ПравоЧтения" Или "#Параметр(24)" = "ПравоИзменения" #Тогда #Параметр(25) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(25)) #Если Не "#Параметр(24)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(24)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(24)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(25) #Если Не "#Параметр(24)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(24)" = "Объект" Или "#Параметр(24)" = " " #Тогда ( // Проверка права объекта ведущей таблицы (зависимость по правам) ( ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта ГДЕ ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(25)) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Проверка ведущего права для права Чтение // Право Чтение может зависеть только от права Чтение #Иначе // Проверка ведущего права для права Изменение // Право Изменение может зависеть от ведущих прав Чтение, Изменение И НЕ ( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(25)) ) ) #КонецЕсли ) ) #Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Проверка ограничения права объекта ведущей таблицы И #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(25)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ИЛИ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(25)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ТОГДА ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(25) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(25) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) ИНАЧЕ #КонецЕсли #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда НЕ ( ИСТИНА В // Не все проверки отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(25) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(25)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(25) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) ) И НЕ #Иначе ( #КонецЕсли ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(25) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(25)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(25) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) И #КонецЕсли НЕ ЛОЖЬ В // Все проверки успешны. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(25) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ВЫБОР #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда #Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда КОГДА НаборыЗначений.ЗначениеБезГрупп ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли КОГДА НаборыЗначений.СтандартноеЗначение #Иначе КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) ) #КонецЕсли #Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда ТОГДА ИСТИНА #Иначе ТОГДА #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ВЫБОР #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда КОГДА НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли #Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) ТОГДА ИСТИНА #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ИНАЧЕ #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОНЕЦ #КонецЕсли #КонецЕсли // Проверка заведомого ложного или истинного однострочного набора значений. КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен) ТОГДА ИСТИНА КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен) ТОГДА ЛОЖЬ // Проверка права доступа пользователя к таблице ЗначенияДоступа. КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных) ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа ) #Иначе ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ) ) #КонецЕсли #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ИНАЧЕ ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #Иначе ИНАЧЕ ЛОЖЬ #КонецЕсли КОНЕЦ ) // НЕ ЛОЖЬ В ) ) #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда КОНЕЦ #КонецЕсли #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда ИСТИНА // Группа параметров отключена. #ИначеЕсли "#Параметр(24)" = "НастройкиПрав" #Тогда ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(25) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(25) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(24),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(24)", ",") #Тогда НеверныйВидДоступа: "#Параметр(24)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(24)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(24),") #Тогда ( ЕСТЬNULL(#Параметр(25), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(24),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(24),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(25) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(24),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = #Параметр(25) #ИначеЕсли "#Параметр(25)" = "Т.Ссылка" И "#Параметр(24)" <> "Пользователи" И "#Параметр(24)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(24)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(24)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(24),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = #Параметр(25) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = #Параметр(25) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(25)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе ЕСТЬNULL(#Параметр(25), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли #Параметр(26) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. //// Проверка значения поля группы параметров 8. #Если "#Параметр(27)" = "" И "#Параметр(28)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(27)" = "Условие" Или "#Параметр(27)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. ( #Параметр(28) ) #ИначеЕсли "#Параметр(27)" = "ПравоЧтения" Или "#Параметр(27)" = "ПравоИзменения" #Тогда #Параметр(28) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(28)) #Если Не "#Параметр(27)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(27)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(27)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(28) #Если Не "#Параметр(27)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(27)" = "Объект" Или "#Параметр(27)" = " " #Тогда ( // Проверка права объекта ведущей таблицы (зависимость по правам) ( ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта ГДЕ ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(28)) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Проверка ведущего права для права Чтение // Право Чтение может зависеть только от права Чтение #Иначе // Проверка ведущего права для права Изменение // Право Изменение может зависеть от ведущих прав Чтение, Изменение И НЕ ( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(28)) ) ) #КонецЕсли ) ) #Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Проверка ограничения права объекта ведущей таблицы И #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(28)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ИЛИ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(28)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ТОГДА ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(28) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(28) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) ИНАЧЕ #КонецЕсли #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда НЕ ( ИСТИНА В // Не все проверки отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(28) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(28)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(28) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) ) И НЕ #Иначе ( #КонецЕсли ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(28) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(28)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(28) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) И #КонецЕсли НЕ ЛОЖЬ В // Все проверки успешны. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(28) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ВЫБОР #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда #Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда КОГДА НаборыЗначений.ЗначениеБезГрупп ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли КОГДА НаборыЗначений.СтандартноеЗначение #Иначе КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) ) #КонецЕсли #Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда ТОГДА ИСТИНА #Иначе ТОГДА #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ВЫБОР #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда КОГДА НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли #Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) ТОГДА ИСТИНА #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ИНАЧЕ #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОНЕЦ #КонецЕсли #КонецЕсли // Проверка заведомого ложного или истинного однострочного набора значений. КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен) ТОГДА ИСТИНА КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен) ТОГДА ЛОЖЬ // Проверка права доступа пользователя к таблице ЗначенияДоступа. КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных) ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа ) #Иначе ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ) ) #КонецЕсли #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ИНАЧЕ ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #Иначе ИНАЧЕ ЛОЖЬ #КонецЕсли КОНЕЦ ) // НЕ ЛОЖЬ В ) ) #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда КОНЕЦ #КонецЕсли #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда ИСТИНА // Группа параметров отключена. #ИначеЕсли "#Параметр(27)" = "НастройкиПрав" #Тогда ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(28) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(28) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(27),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(27)", ",") #Тогда НеверныйВидДоступа: "#Параметр(27)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(27)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(27),") #Тогда ( ЕСТЬNULL(#Параметр(28), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(27),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(27),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(28) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(27),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = #Параметр(28) #ИначеЕсли "#Параметр(28)" = "Т.Ссылка" И "#Параметр(27)" <> "Пользователи" И "#Параметр(27)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(27)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(27)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(27),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = #Параметр(28) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = #Параметр(28) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(28)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе ЕСТЬNULL(#Параметр(28), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли #Параметр(29) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. //// Проверка значения поля группы параметров 9. #Если "#Параметр(30)" = "" И "#Параметр(31)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(30)" = "Условие" Или "#Параметр(30)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. ( #Параметр(31) ) #ИначеЕсли "#Параметр(30)" = "ПравоЧтения" Или "#Параметр(30)" = "ПравоИзменения" #Тогда #Параметр(31) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(31)) #Если Не "#Параметр(30)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(30)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(30)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(31) #Если Не "#Параметр(30)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(30)" = "Объект" Или "#Параметр(30)" = " " #Тогда ( // Проверка права объекта ведущей таблицы (зависимость по правам) ( ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта ГДЕ ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(31)) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Проверка ведущего права для права Чтение // Право Чтение может зависеть только от права Чтение #Иначе // Проверка ведущего права для права Изменение // Право Изменение может зависеть от ведущих прав Чтение, Изменение И НЕ ( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(31)) ) ) #КонецЕсли ) ) #Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Проверка ограничения права объекта ведущей таблицы И #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(31)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ИЛИ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(31)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ТОГДА ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(31) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(31) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) ИНАЧЕ #КонецЕсли #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда НЕ ( ИСТИНА В // Не все проверки отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(31) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(31)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(31) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) ) И НЕ #Иначе ( #КонецЕсли ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(31) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(31)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(31) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) И #КонецЕсли НЕ ЛОЖЬ В // Все проверки успешны. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(31) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ВЫБОР #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда #Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда КОГДА НаборыЗначений.ЗначениеБезГрупп ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли КОГДА НаборыЗначений.СтандартноеЗначение #Иначе КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) ) #КонецЕсли #Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда ТОГДА ИСТИНА #Иначе ТОГДА #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ВЫБОР #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда КОГДА НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли #Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) ТОГДА ИСТИНА #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ИНАЧЕ #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОНЕЦ #КонецЕсли #КонецЕсли // Проверка заведомого ложного или истинного однострочного набора значений. КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен) ТОГДА ИСТИНА КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен) ТОГДА ЛОЖЬ // Проверка права доступа пользователя к таблице ЗначенияДоступа. КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных) ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа ) #Иначе ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ) ) #КонецЕсли #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ИНАЧЕ ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #Иначе ИНАЧЕ ЛОЖЬ #КонецЕсли КОНЕЦ ) // НЕ ЛОЖЬ В ) ) #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда КОНЕЦ #КонецЕсли #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда ИСТИНА // Группа параметров отключена. #ИначеЕсли "#Параметр(30)" = "НастройкиПрав" #Тогда ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(31) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(31) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(30),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(30)", ",") #Тогда НеверныйВидДоступа: "#Параметр(30)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(30)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(30),") #Тогда ( ЕСТЬNULL(#Параметр(31), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(30),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(30),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(31) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(30),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = #Параметр(31) #ИначеЕсли "#Параметр(31)" = "Т.Ссылка" И "#Параметр(30)" <> "Пользователи" И "#Параметр(30)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(30)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(30)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(30),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = #Параметр(31) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = #Параметр(31) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(31)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе ЕСТЬNULL(#Параметр(31), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли #Параметр(32) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. //// Проверка значения поля группы параметров 10. #Если "#Параметр(33)" = "" И "#Параметр(34)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(33)" = "Условие" Или "#Параметр(33)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. ( #Параметр(34) ) #ИначеЕсли "#Параметр(33)" = "ПравоЧтения" Или "#Параметр(33)" = "ПравоИзменения" #Тогда #Параметр(34) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(34)) #Если Не "#Параметр(33)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(33)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(33)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(34) #Если Не "#Параметр(33)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(33)" = "Объект" Или "#Параметр(33)" = " " #Тогда ( // Проверка права объекта ведущей таблицы (зависимость по правам) ( ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта ГДЕ ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(34)) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Проверка ведущего права для права Чтение // Право Чтение может зависеть только от права Чтение #Иначе // Проверка ведущего права для права Изменение // Право Изменение может зависеть от ведущих прав Чтение, Изменение И НЕ ( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(34)) ) ) #КонецЕсли ) ) #Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Проверка ограничения права объекта ведущей таблицы И #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(34)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ИЛИ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(34)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ТОГДА ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(34) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(34) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) ИНАЧЕ #КонецЕсли #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда НЕ ( ИСТИНА В // Не все проверки отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(34) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(34)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(34) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) ) И НЕ #Иначе ( #КонецЕсли ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(34) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(34)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(34) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) И #КонецЕсли НЕ ЛОЖЬ В // Все проверки успешны. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(34) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ВЫБОР #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда #Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда КОГДА НаборыЗначений.ЗначениеБезГрупп ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли КОГДА НаборыЗначений.СтандартноеЗначение #Иначе КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) ) #КонецЕсли #Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда ТОГДА ИСТИНА #Иначе ТОГДА #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ВЫБОР #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда КОГДА НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли #Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) ТОГДА ИСТИНА #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ИНАЧЕ #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОНЕЦ #КонецЕсли #КонецЕсли // Проверка заведомого ложного или истинного однострочного набора значений. КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен) ТОГДА ИСТИНА КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен) ТОГДА ЛОЖЬ // Проверка права доступа пользователя к таблице ЗначенияДоступа. КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных) ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа ) #Иначе ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ) ) #КонецЕсли #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ИНАЧЕ ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #Иначе ИНАЧЕ ЛОЖЬ #КонецЕсли КОНЕЦ ) // НЕ ЛОЖЬ В ) ) #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда КОНЕЦ #КонецЕсли #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда ИСТИНА // Группа параметров отключена. #ИначеЕсли "#Параметр(33)" = "НастройкиПрав" #Тогда ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(34) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(34) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(33),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(33)", ",") #Тогда НеверныйВидДоступа: "#Параметр(33)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(33)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(33),") #Тогда ( ЕСТЬNULL(#Параметр(34), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(33),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(33),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(34) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(33),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = #Параметр(34) #ИначеЕсли "#Параметр(34)" = "Т.Ссылка" И "#Параметр(33)" <> "Пользователи" И "#Параметр(33)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(33)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(33)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(33),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = #Параметр(34) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = #Параметр(34) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(34)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе ЕСТЬNULL(#Параметр(34), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли #Параметр(35) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. //// Проверка значения поля группы параметров 11. #Если "#Параметр(36)" = "" И "#Параметр(37)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(36)" = "Условие" Или "#Параметр(36)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. ( #Параметр(37) ) #ИначеЕсли "#Параметр(36)" = "ПравоЧтения" Или "#Параметр(36)" = "ПравоИзменения" #Тогда #Параметр(37) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(37)) #Если Не "#Параметр(36)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(36)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(36)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(37) #Если Не "#Параметр(36)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(36)" = "Объект" Или "#Параметр(36)" = " " #Тогда ( // Проверка права объекта ведущей таблицы (зависимость по правам) ( ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта ГДЕ ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(37)) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Проверка ведущего права для права Чтение // Право Чтение может зависеть только от права Чтение #Иначе // Проверка ведущего права для права Изменение // Право Изменение может зависеть от ведущих прав Чтение, Изменение И НЕ ( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(37)) ) ) #КонецЕсли ) ) #Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Проверка ограничения права объекта ведущей таблицы И #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(37)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ИЛИ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(37)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ТОГДА ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(37) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(37) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) ИНАЧЕ #КонецЕсли #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда НЕ ( ИСТИНА В // Не все проверки отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(37) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(37)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(37) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) ) И НЕ #Иначе ( #КонецЕсли ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(37) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(37)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(37) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) И #КонецЕсли НЕ ЛОЖЬ В // Все проверки успешны. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(37) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ВЫБОР #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда #Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда КОГДА НаборыЗначений.ЗначениеБезГрупп ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли КОГДА НаборыЗначений.СтандартноеЗначение #Иначе КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) ) #КонецЕсли #Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда ТОГДА ИСТИНА #Иначе ТОГДА #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ВЫБОР #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда КОГДА НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли #Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) ТОГДА ИСТИНА #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ИНАЧЕ #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОНЕЦ #КонецЕсли #КонецЕсли // Проверка заведомого ложного или истинного однострочного набора значений. КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен) ТОГДА ИСТИНА КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен) ТОГДА ЛОЖЬ // Проверка права доступа пользователя к таблице ЗначенияДоступа. КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных) ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа ) #Иначе ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ) ) #КонецЕсли #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ИНАЧЕ ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #Иначе ИНАЧЕ ЛОЖЬ #КонецЕсли КОНЕЦ ) // НЕ ЛОЖЬ В ) ) #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда КОНЕЦ #КонецЕсли #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда ИСТИНА // Группа параметров отключена. #ИначеЕсли "#Параметр(36)" = "НастройкиПрав" #Тогда ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(37) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(37) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(36),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(36)", ",") #Тогда НеверныйВидДоступа: "#Параметр(36)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(36)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(36),") #Тогда ( ЕСТЬNULL(#Параметр(37), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(36),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(36),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(37) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(36),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = #Параметр(37) #ИначеЕсли "#Параметр(37)" = "Т.Ссылка" И "#Параметр(36)" <> "Пользователи" И "#Параметр(36)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(36)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(36)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(36),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = #Параметр(37) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = #Параметр(37) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(37)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе ЕСТЬNULL(#Параметр(37), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли #Параметр(38) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. //// Проверка значения поля группы параметров 12. #Если "#Параметр(39)" = "" И "#Параметр(40)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(39)" = "Условие" Или "#Параметр(39)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. ( #Параметр(40) ) #ИначеЕсли "#Параметр(39)" = "ПравоЧтения" Или "#Параметр(39)" = "ПравоИзменения" #Тогда #Параметр(40) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(40)) #Если Не "#Параметр(39)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(39)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(39)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(40) #Если Не "#Параметр(39)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(39)" = "Объект" Или "#Параметр(39)" = " " #Тогда ( // Проверка права объекта ведущей таблицы (зависимость по правам) ( ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта ГДЕ ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(40)) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Проверка ведущего права для права Чтение // Право Чтение может зависеть только от права Чтение #Иначе // Проверка ведущего права для права Изменение // Право Изменение может зависеть от ведущих прав Чтение, Изменение И НЕ ( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(40)) ) ) #КонецЕсли ) ) #Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Проверка ограничения права объекта ведущей таблицы И #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(40)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ИЛИ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(40)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ТОГДА ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(40) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(40) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) ИНАЧЕ #КонецЕсли #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда НЕ ( ИСТИНА В // Не все проверки отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(40) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(40)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(40) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) ) И НЕ #Иначе ( #КонецЕсли ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(40) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(40)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(40) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) И #КонецЕсли НЕ ЛОЖЬ В // Все проверки успешны. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(40) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ВЫБОР #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда #Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда КОГДА НаборыЗначений.ЗначениеБезГрупп ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли КОГДА НаборыЗначений.СтандартноеЗначение #Иначе КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) ) #КонецЕсли #Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда ТОГДА ИСТИНА #Иначе ТОГДА #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ВЫБОР #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда КОГДА НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли #Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) ТОГДА ИСТИНА #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ИНАЧЕ #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОНЕЦ #КонецЕсли #КонецЕсли // Проверка заведомого ложного или истинного однострочного набора значений. КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен) ТОГДА ИСТИНА КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен) ТОГДА ЛОЖЬ // Проверка права доступа пользователя к таблице ЗначенияДоступа. КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных) ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа ) #Иначе ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ) ) #КонецЕсли #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ИНАЧЕ ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #Иначе ИНАЧЕ ЛОЖЬ #КонецЕсли КОНЕЦ ) // НЕ ЛОЖЬ В ) ) #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда КОНЕЦ #КонецЕсли #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда ИСТИНА // Группа параметров отключена. #ИначеЕсли "#Параметр(39)" = "НастройкиПрав" #Тогда ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(40) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(40) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(39),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(39)", ",") #Тогда НеверныйВидДоступа: "#Параметр(39)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(39)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(39),") #Тогда ( ЕСТЬNULL(#Параметр(40), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(39),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(39),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(40) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(39),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = #Параметр(40) #ИначеЕсли "#Параметр(40)" = "Т.Ссылка" И "#Параметр(39)" <> "Пользователи" И "#Параметр(39)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(39)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(39)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(39),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = #Параметр(40) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = #Параметр(40) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(40)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе ЕСТЬNULL(#Параметр(40), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли #Параметр(41) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. //// Проверка значения поля группы параметров 13. #Если "#Параметр(42)" = "" И "#Параметр(43)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(42)" = "Условие" Или "#Параметр(42)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. ( #Параметр(43) ) #ИначеЕсли "#Параметр(42)" = "ПравоЧтения" Или "#Параметр(42)" = "ПравоИзменения" #Тогда #Параметр(43) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(43)) #Если Не "#Параметр(42)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(42)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(42)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(43) #Если Не "#Параметр(42)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(42)" = "Объект" Или "#Параметр(42)" = " " #Тогда ( // Проверка права объекта ведущей таблицы (зависимость по правам) ( ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта ГДЕ ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(43)) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Проверка ведущего права для права Чтение // Право Чтение может зависеть только от права Чтение #Иначе // Проверка ведущего права для права Изменение // Право Изменение может зависеть от ведущих прав Чтение, Изменение И НЕ ( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(43)) ) ) #КонецЕсли ) ) #Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Проверка ограничения права объекта ведущей таблицы И #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(43)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ИЛИ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(43)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ТОГДА ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(43) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(43) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) ИНАЧЕ #КонецЕсли #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда НЕ ( ИСТИНА В // Не все проверки отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(43) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(43)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(43) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) ) И НЕ #Иначе ( #КонецЕсли ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(43) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(43)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(43) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) И #КонецЕсли НЕ ЛОЖЬ В // Все проверки успешны. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(43) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ВЫБОР #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда #Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда КОГДА НаборыЗначений.ЗначениеБезГрупп ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли КОГДА НаборыЗначений.СтандартноеЗначение #Иначе КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) ) #КонецЕсли #Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда ТОГДА ИСТИНА #Иначе ТОГДА #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ВЫБОР #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда КОГДА НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли #Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) ТОГДА ИСТИНА #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ИНАЧЕ #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОНЕЦ #КонецЕсли #КонецЕсли // Проверка заведомого ложного или истинного однострочного набора значений. КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен) ТОГДА ИСТИНА КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен) ТОГДА ЛОЖЬ // Проверка права доступа пользователя к таблице ЗначенияДоступа. КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных) ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа ) #Иначе ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ) ) #КонецЕсли #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ИНАЧЕ ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #Иначе ИНАЧЕ ЛОЖЬ #КонецЕсли КОНЕЦ ) // НЕ ЛОЖЬ В ) ) #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда КОНЕЦ #КонецЕсли #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда ИСТИНА // Группа параметров отключена. #ИначеЕсли "#Параметр(42)" = "НастройкиПрав" #Тогда ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(43) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(43) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(42),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(42)", ",") #Тогда НеверныйВидДоступа: "#Параметр(42)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(42)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(42),") #Тогда ( ЕСТЬNULL(#Параметр(43), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(42),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(42),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(43) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(42),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = #Параметр(43) #ИначеЕсли "#Параметр(43)" = "Т.Ссылка" И "#Параметр(42)" <> "Пользователи" И "#Параметр(42)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(42)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(42)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(42),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = #Параметр(43) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = #Параметр(43) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(43)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе ЕСТЬNULL(#Параметр(43), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли #Параметр(44) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. //// Проверка значения поля группы параметров 14. #Если "#Параметр(45)" = "" И "#Параметр(46)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(45)" = "Условие" Или "#Параметр(45)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. ( #Параметр(46) ) #ИначеЕсли "#Параметр(45)" = "ПравоЧтения" Или "#Параметр(45)" = "ПравоИзменения" #Тогда #Параметр(46) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(46)) #Если Не "#Параметр(45)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(45)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(45)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(46) #Если Не "#Параметр(45)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(45)" = "Объект" Или "#Параметр(45)" = " " #Тогда ( // Проверка права объекта ведущей таблицы (зависимость по правам) ( ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта ГДЕ ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(46)) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Проверка ведущего права для права Чтение // Право Чтение может зависеть только от права Чтение #Иначе // Проверка ведущего права для права Изменение // Право Изменение может зависеть от ведущих прав Чтение, Изменение И НЕ ( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(46)) ) ) #КонецЕсли ) ) #Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Проверка ограничения права объекта ведущей таблицы И #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(46)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ИЛИ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(46)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ТОГДА ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(46) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(46) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) ИНАЧЕ #КонецЕсли #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда НЕ ( ИСТИНА В // Не все проверки отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(46) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(46)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(46) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) ) И НЕ #Иначе ( #КонецЕсли ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(46) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(46)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(46) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) И #КонецЕсли НЕ ЛОЖЬ В // Все проверки успешны. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(46) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ВЫБОР #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда #Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда КОГДА НаборыЗначений.ЗначениеБезГрупп ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли КОГДА НаборыЗначений.СтандартноеЗначение #Иначе КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) ) #КонецЕсли #Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда ТОГДА ИСТИНА #Иначе ТОГДА #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ВЫБОР #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда КОГДА НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли #Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) ТОГДА ИСТИНА #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ИНАЧЕ #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОНЕЦ #КонецЕсли #КонецЕсли // Проверка заведомого ложного или истинного однострочного набора значений. КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен) ТОГДА ИСТИНА КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен) ТОГДА ЛОЖЬ // Проверка права доступа пользователя к таблице ЗначенияДоступа. КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных) ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа ) #Иначе ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ) ) #КонецЕсли #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ИНАЧЕ ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #Иначе ИНАЧЕ ЛОЖЬ #КонецЕсли КОНЕЦ ) // НЕ ЛОЖЬ В ) ) #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда КОНЕЦ #КонецЕсли #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда ИСТИНА // Группа параметров отключена. #ИначеЕсли "#Параметр(45)" = "НастройкиПрав" #Тогда ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(46) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(46) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(45),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(45)", ",") #Тогда НеверныйВидДоступа: "#Параметр(45)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(45)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(45),") #Тогда ( ЕСТЬNULL(#Параметр(46), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(45),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(45),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(46) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(45),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = #Параметр(46) #ИначеЕсли "#Параметр(46)" = "Т.Ссылка" И "#Параметр(45)" <> "Пользователи" И "#Параметр(45)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(45)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(45)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(45),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = #Параметр(46) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = #Параметр(46) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(46)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе ЕСТЬNULL(#Параметр(46), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли #Параметр(47) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. //// Проверка значения поля группы параметров 15. #Если "#Параметр(48)" = "" И "#Параметр(49)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(48)" = "Условие" Или "#Параметр(48)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. ( #Параметр(49) ) #ИначеЕсли "#Параметр(48)" = "ПравоЧтения" Или "#Параметр(48)" = "ПравоИзменения" #Тогда #Параметр(49) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(49)) #Если Не "#Параметр(48)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(48)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(48)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(49) #Если Не "#Параметр(48)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(48)" = "Объект" Или "#Параметр(48)" = " " #Тогда ( // Проверка права объекта ведущей таблицы (зависимость по правам) ( ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта ГДЕ ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(49)) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Проверка ведущего права для права Чтение // Право Чтение может зависеть только от права Чтение #Иначе // Проверка ведущего права для права Изменение // Право Изменение может зависеть от ведущих прав Чтение, Изменение И НЕ ( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(49)) ) ) #КонецЕсли ) ) #Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Проверка ограничения права объекта ведущей таблицы И #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(49)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ИЛИ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(49)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ТОГДА ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(49) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(49) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) ИНАЧЕ #КонецЕсли #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда НЕ ( ИСТИНА В // Не все проверки отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(49) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(49)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(49) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) ) И НЕ #Иначе ( #КонецЕсли ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(49) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(49)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(49) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) И #КонецЕсли НЕ ЛОЖЬ В // Все проверки успешны. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(49) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ВЫБОР #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда #Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда КОГДА НаборыЗначений.ЗначениеБезГрупп ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли КОГДА НаборыЗначений.СтандартноеЗначение #Иначе КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) ) #КонецЕсли #Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда ТОГДА ИСТИНА #Иначе ТОГДА #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ВЫБОР #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда КОГДА НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли #Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) ТОГДА ИСТИНА #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ИНАЧЕ #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОНЕЦ #КонецЕсли #КонецЕсли // Проверка заведомого ложного или истинного однострочного набора значений. КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен) ТОГДА ИСТИНА КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен) ТОГДА ЛОЖЬ // Проверка права доступа пользователя к таблице ЗначенияДоступа. КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных) ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа ) #Иначе ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ) ) #КонецЕсли #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ИНАЧЕ ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #Иначе ИНАЧЕ ЛОЖЬ #КонецЕсли КОНЕЦ ) // НЕ ЛОЖЬ В ) ) #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда КОНЕЦ #КонецЕсли #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда ИСТИНА // Группа параметров отключена. #ИначеЕсли "#Параметр(48)" = "НастройкиПрав" #Тогда ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(49) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(49) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(48),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(48)", ",") #Тогда НеверныйВидДоступа: "#Параметр(48)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(48)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(48),") #Тогда ( ЕСТЬNULL(#Параметр(49), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(48),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(48),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(49) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(48),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = #Параметр(49) #ИначеЕсли "#Параметр(49)" = "Т.Ссылка" И "#Параметр(48)" <> "Пользователи" И "#Параметр(48)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(48)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(48)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(48),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = #Параметр(49) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = #Параметр(49) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(49)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе ЕСТЬNULL(#Параметр(49), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли #Параметр(50) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. //// Проверка значения поля группы параметров 16. #Если "#Параметр(51)" = "" И "#Параметр(52)" = "" #Тогда // Группа параметров не используется. #ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(51)" = "Условие" Или "#Параметр(51)" = "") #Тогда // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие. ( #Параметр(52) ) #ИначеЕсли "#Параметр(51)" = "ПравоЧтения" Или "#Параметр(51)" = "ПравоИзменения" #Тогда #Параметр(52) <> НЕОПРЕДЕЛЕНО И ИСТИНА В ( // Проверка права пользователя на таблицу Значения, установленного в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(52)) #Если Не "#Параметр(51)" = "ПравоЧтения" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(51)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(51)" = "ПравоИзмененияПоИдентификатору" #Тогда ИСТИНА В ( // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава ГДЕ ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(52) #Если Не "#Параметр(51)" = "ПравоЧтенияПоИдентификатору" #Тогда И ТаблицыГруппДоступаПроверкаПрава.ПравоИзменение #КонецЕсли ) #ИначеЕсли "#Параметр(51)" = "Объект" Или "#Параметр(51)" = " " #Тогда ( // Проверка права объекта ведущей таблицы (зависимость по правам) ( ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваОбъекта ГДЕ ТаблицыГруппДоступаПроверкаПраваОбъекта.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваОбъекта.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(52)) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Проверка ведущего права для права Чтение // Право Чтение может зависеть только от права Чтение #Иначе // Проверка ведущего права для права Изменение // Право Изменение может зависеть от ведущих прав Чтение, Изменение И НЕ ( ТаблицыГруппДоступаПроверкаПраваОбъекта.ПравоИзменение = ЛОЖЬ И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(52)) ) ) #КонецЕсли ) ) #Если &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда // Проверка ограничения права объекта ведущей таблицы И #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(52)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ИЛИ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы ГДЕ ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(#Параметр(52)) И Идентификаторы.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав) ) ТОГДА ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(52) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(52) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) ИНАЧЕ #КонецЕсли #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда НЕ ( ИСТИНА В // Не все проверки отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора с не отключенной проверкой. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(52) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(52)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(52) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) ) И НЕ #Иначе ( #КонецЕсли ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первого набора по которому доступ разрешен. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НомераНаборов ГДЕ НомераНаборов.Объект = #Параметр(52) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение И НомераНаборов.Чтение = ИСТИНА #Иначе // Право Изменение может зависеть от ведущих прав Чтение, Изменение И ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа ГДЕ ЗависимостиПравДоступа.ПодчиненнаяТаблица = СвойстваТекущейТаблицы.Ссылка И ТИПЗНАЧЕНИЯ(ЗависимостиПравДоступа.ТипВедущейТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(52)) ) ТОГДА НомераНаборов.Чтение ИНАЧЕ НомераНаборов.Изменение КОНЕЦ #КонецЕсли И #Если "#Параметр(3)" = "РасширенноеИЛИ" Или "#Параметр(3)" = "НеОграничиватьДоступКГруппам,РасширенноеИЛИ" #Тогда ИСТИНА В // Не все проверки текущего набора отключены. ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Выбор первой не отключенной проверки текущего набора. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(52) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА // Поиск настроек ограничений доступа ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА ) ) И #КонецЕсли НЕ ЛОЖЬ В // Все проверки успешны. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ // Выбор первого не разрешенного значения доступа. ИЗ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначений ГДЕ НаборыЗначений.Объект = #Параметр(52) И НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора И НЕ ВЫБОР #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда #Если НЕ &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда КОГДА НаборыЗначений.ЗначениеБезГрупп ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли КОГДА НаборыЗначений.СтандартноеЗначение #Иначе КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) ) #КонецЕсли #Если &ВидыДоступаСОтключеннымИспользованием = "Все" #Тогда ТОГДА ИСТИНА #Иначе ТОГДА #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ВЫБОР #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" #Тогда КОГДА НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовМетаданных КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) И НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.ИдентификаторыОбъектовРасширений КАК ТипыСсылок ГДЕ ТИПЗНАЧЕНИЯ(ТипыСсылок.ЗначениеПустойСсылки) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ТипыСсылок.ЗначениеПустойСсылки В (&ТипыЗначенийДоступаСГруппами) ) ТОГДА ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #КонецЕсли #Если Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) ТОГДА ИСТИНА #КонецЕсли #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда ИНАЧЕ #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ #Если Не #ИмяТекущегоПраваДоступа = "Чтение" Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") Или Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") #Тогда КОНЕЦ #КонецЕсли #КонецЕсли // Проверка заведомого ложного или истинного однострочного набора значений. КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен) ТОГДА ИСТИНА КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен) ТОГДА ЛОЖЬ // Проверка права доступа пользователя к таблице ЗначенияДоступа. КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных) ИЛИ ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовРасширений) #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда // Право Чтение может зависеть только от права Чтение ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа ) #Иначе ТОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект ГДЕ ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа И НЕ(НаборыЗначений.Уточнение <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) И ТаблицыГруппДоступаПроверкаПраваНаОбъект.ПравоИзменение = ЛОЖЬ) ) #КонецЕсли #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда ИНАЧЕ ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения И НастройкиПрав.Таблица = ВЫБОР КОГДА НаборыЗначений.Уточнение В (&ИдентификаторыТаблицСОтдельнымиНастройкамиПрав) ТОГДА НаборыЗначений.Уточнение ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КОНЕЦ #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #Иначе ИНАЧЕ ЛОЖЬ #КонецЕсли КОНЕЦ ) // НЕ ЛОЖЬ В ) ) #Если Не &ТипыВладельцевНастроекПрав = "" #Тогда КОНЕЦ #КонецЕсли #КонецЕсли ) #ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда ИСТИНА // Группа параметров отключена. #ИначеЕсли "#Параметр(51)" = "НастройкиПрав" #Тогда ( ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(52) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) И НЕ ЛОЖЬ В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено. ( ВЫБРАТЬ ПЕРВЫЕ 1 ЛОЖЬ ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек ПО НаследованиеНастроек.Объект = #Параметр(52) И НастройкиПрав.Объект = НаследованиеНастроек.Родитель #Если #ИмяТекущегоПраваДоступа = "Чтение" #Тогда И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения #Иначе #Если СтрСодержит(&ТаблицыСОтдельнымиНастройкамиПрав, "|#Параметр(1);") #Тогда И НастройкиПрав.Таблица = СвойстваТекущейТаблицы.Ссылка #Иначе И НастройкиПрав.Таблица = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) #КонецЕсли И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияИзменения #КонецЕсли ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ПО СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь ) ) #ИначеЕсли Не СтрСодержит(&ВсеВидыДоступаКромеСпециальных, ",#Параметр(51),") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. #Если СтрСодержит("#Параметр(51)", ",") #Тогда НеверныйВидДоступа: "#Параметр(51)" - "Список имен видов доступа не найден" #Иначе НеверныйВидДоступа: "#Параметр(51)" - "Имя вида доступа не найдено" #КонецЕсли #ИначеЕсли &ВидыДоступаСОтключеннымИспользованием <> "Все" И Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",#Параметр(51),") #Тогда ( ЕСТЬNULL(#Параметр(52), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО И #Если (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",Пользователи,") И СтрСодержит(",#Параметр(51),", ",Пользователи,")) Или (Не СтрСодержит(&ВидыДоступаСОтключеннымИспользованием, ",ВнешниеПользователи,") И СтрСодержит(",#Параметр(51),", ",ВнешниеПользователи,")) #Тогда НЕ ( НЕ ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа ГДЕ ГруппыЗначенийДоступа.ЗначениеДоступа = #Параметр(52) И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь ) И НЕ #Иначе ( #КонецЕсли ВЫБОР КОГДА ИСТИНА В ( #Если СтрСодержит(&ВидыДоступаБезГруппДляЗначенияДоступа, ",#Параметр(51),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = #Параметр(52) #ИначеЕсли "#Параметр(52)" = "Т.Ссылка" И "#Параметр(51)" <> "Пользователи" И "#Параметр(51)" <> "ВнешниеПользователи" #Тогда #Если СтрСодержит("#Параметр(51)", ",") #Тогда // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа. НеверныйВидДоступа: "#Параметр(51)" - "При проверке таблицы значения доступа можно указывать только один вид доступа" #ИначеЕсли СтрСодержит(&ВидыДоступаСОднойГруппойДляЗначенияДоступа, ",#Параметр(51),") #Тогда ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ГДЕ Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = Т.ГруппаДоступа #Иначе // Значения доступа, для которых можно указать несколько групп значений доступа. ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа И ГруппыЗначений.Ссылка = #Параметр(52) #КонецЕсли #Иначе ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ПО Значения.ГруппаДоступа = ГруппыДоступа.Ссылка И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа И ГруппыЗначений.ЗначениеДоступа = #Параметр(52) #КонецЕсли ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ = ВЫБОР КОГДА ИСТИНА В ( ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию ГДЕ ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(#Параметр(52)) И ЗначенияПоУмолчанию.ВсеРазрешены = ЛОЖЬ ) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ) ) #Иначе ЕСТЬNULL(#Параметр(52), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО #КонецЕсли #Параметр(53) // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок. ) ) #КонецЕсли #КонецЕсли // Информационная база заблокирована для обновления.