Есть динамический список, в котором отражается результат выполнения запроса. Под полными правами пользователь видит значение измерения "организация" этого регистра на форме.
Есть пользователи, у которых стоит ограничение на все организации, кроме своей. Нужно, чтобы пользователи, с ограниченными правами могли видеть наименование организации в этом списке.
Пробовал сделать так: в настройках дин. списка убираю галку "динам. считывание данных". Далее в пр-ре на форме ПриСозданииНаСервере
В результат выполнения запросе на сервере - наим. организации в отладчике есть. Однако при переходе с сервера на клиент оно почему то теряется( под пользователем с ограниченными правами. Под полными - все ок(.
Как еще можно выполнить даный запрос для дин.списка, чтобы вывести наим. организации для пользователя с урезанными правами ?
(11) Manticor, я без шаблона делал) с шаблонами сами разбирайтесь )) ПоЗначениям не подойдет помоему, там надо ПоЗначениямРасширенный шаблон вам брать ) но и с шаблоном возможно сделать тоже самое, только с параметрами разобраться)
(1) Manticor, я так понимаю, что проблема в
| РегистрСведенийлнт_КадровыйРезерв.Организация,
т.е. по прежнему тащится ссылка, на организацию, но на нее запрет.
Так что, надо либо убрать это поле, оставить только
РегистрСведенийлнт_КадровыйРезерв.Организация.Наименование КАК ОИВ
либо в самом запросе, исключить, каким то параметром, это ссылочное поле.
Т.е. организацию в параметр и передаем.
(7) Manticor, привелигированный режим то не навсегда установлен, а в рамках процедурки, и когда оно выполнится,
привелигированному режиму придет конец, - а в результате запроса у нас есть запрещенные элементы, что должно вызвать ошибку.
Для этого и нужно, пока включен режим бога, сформировать результат в таком виде, чтобы он был нормально захаван пользователем с любыми правами.
(1)Решил немного проще. Не шаблонами. Перед запросом установил привилегированный режим.
Процедура ПодготовитьДанные()
// Код подготовки запроса
УстановитьПривилегированныйРежим(Истина);
Выборка = Запрос.Выполнить().Выбрать();
УстановитьПривилегированныйРежим(Ложь);
// Обработка результатов запроса
Показать
взято здесь Только я не процедурой воспользовался, а функцией, возвращал выборку.
Я использовал эти механизмы в расширении и если у расширения включен безопасный режим, то привилегированный режим не сработает. Тоже самое с внешними обработками.
Понимаю, что апнул тему 5-тилетней давности, но поиском только эту более-менее подходящую тему нашел. Вот и решил тут отписаться, может кому поможет.
(15) Я уже не помню точно, но мне этот способ не подошел, так как после возврата с сервера на клиент не было значения организации.
У вас по видимому нет вызова сервера с клиента?
(17)у меня при получении данных с сервера в динамической списке надо было получить данные из регистра по измерения, которые не доступные по РЛС. Технически все на сервере, но были траблы с тем, что событие на сервере без контекста. Нашёл статью где можно указать нужные данные формы в настройки компоновщика. Так и решил задачу.
делается параметр сеанса, скажем "ЧтениеВсехОрганизаций" - булево.. при установке сеанса инициализируем его в = Ложь.. делаем новую роль, или на вашу пользовательскую ограниченную роль цепляем RLS на справочник организации - чтение, типа "ГДЕ &ЧтениеВсехОрганизаций".. ну и в нужном месте (ну скажем в вашем случае при создании на сервере ставим ЧтениеВсехОрганизаций= истина" и все ) не забудьте только сбросить потом параметр сеанса ЧтениеВсехОрганизаций= ложь, когда форму закроют)
(10) AllexSoft, а как установить данный параметр в ограничениях прав? Тоесть мы его установим данный параметр в истину или ложь при инициализации сеанса, затем в шаблоне ограничения нужно к нему обратиться.
Текст шаблона начинается так:
// ПоЗначениям ( Таблица, Право, Модификатор, В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) = "Условие" (или "").
// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но
// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального.
// Шаблон имеет структуру:
// <Общая часть условий> <Условие по группе параметров 1> И <Условие по группе параметров 2> И ... <Условие по группе параметров(n)>
// Пример:
// ПоЗначениям("Документ.ПоступлениеТоваровИУслуг", "Чтение", "",
// "Организации","Организация",
// "Поставщики","Контрагент", "","", ...)
// Проверка правильности параметра Модификатор.
#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйМодификатор: #Параметр(3)
#КонецЕсли
// Проверка правильности параметра Право.
#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ
"#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверноеПраво: #Параметр(2)
#КонецЕсли
(11) Manticor, я без шаблона делал) с шаблонами сами разбирайтесь )) ПоЗначениям не подойдет помоему, там надо ПоЗначениямРасширенный шаблон вам брать ) но и с шаблоном возможно сделать тоже самое, только с параметрами разобраться)
(14) Владимир, доброго дня. Да.... Теме 5 лет, а до сих пор актуально. Хорошо, что кому то понадобилась)
ГДЕ &ЧтениеВсехОрганизаций я помещал в RLS роли, которая есть у пользователя с неполными правами.
Сам параметр ЧтениеВсехОрганизаций сначала добавлял в параметры сеанса затем устанавливал в модуле сеанса в пр-ре УстановитьЗначениеПараметраСеанса
Постараюсь привести текст RLS. Он довольно болшой, но добавлялась всего одна строчка кода:
#Если &ЧтениеВсехОрганизаций = Истина #Тогда
Истина ИЛИ
#КонецЕсли
// ПоЗначениям ( Таблица, Право, Модификатор, В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) = "Условие" (или "").
// Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но
// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального.
// Шаблон имеет структуру:
// <Общая часть условий> <Условие по группе параметров 1> И <Условие по группе параметров 2> И ... <Условие по группе параметров(n)>
// Пример:
// ПоЗначениям("Документ.ПоступлениеТоваровИУслуг", "Чтение", "",
// "Организации","Организация",
// "Поставщики","Контрагент", "","", ...)
// Проверка правильности параметра Модификатор.
#Если НЕ ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" ИЛИ "#Параметр(3)" = "") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверныйМодификатор: #Параметр(3)
#КонецЕсли
// Проверка правильности параметра Право.
#Если НЕ ("#Параметр(2)" = "Чтение" ИЛИ "#Параметр(2)" = "Добавление" ИЛИ
"#Параметр(2)" = "Изменение" ИЛИ "#Параметр(2)" = "Удаление") #Тогда
// Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
НеверноеПраво: #Параметр(2)
#КонецЕсли
// Общая проверка использования ограничений доступа на уровне записей.
#Если НЕ &ОграничиватьДоступПоВиду = "" #Тогда
Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов).
ГДЕ
// Безусловная выборка групп в иерархическом объекте метаданных (если нужно).
#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда
Т.ЭтоГруппа ИЛИ
#КонецЕсли
Показать
//++ВСТАВКА ПАРАМЕТРА!!!+ 29.01.2015
#Если &ЧтениеВсехОрганизаций = Истина #Тогда
Истина ИЛИ
#КонецЕсли
//--ВСТАВКА ПАРАМЕТРА!!!+ 29.01.2015
Истина В
( // Проверка права пользователя на текущую таблицу в целом.
// Права на таблицы формируются по составу ролей профиля группы доступа.
Выбрать Первые 1 Истина
ИЗ
(
Выбрать РАЗЛИЧНЫЕ
ТаблицыГруппДоступа.Таблица,
ТаблицыГруппДоступа.ГруппаДоступа
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей
ПО
ТаблицыГруппДоступа.Таблица = "#Параметр(1)"
#Если НЕ "#Параметр(2)" = "Чтение" #Тогда
И ТаблицыГруппДоступа.#Параметр(2)
#КонецЕсли
#Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь
#Иначе
И ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь
#КонецЕсли
И ПользователиИГруппыПользователей.ГруппаДоступа = ТаблицыГруппДоступа.Пользователь
) КАК ТаблицыГруппДоступа
ГДЕ
( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа.
//// Проверка значения поля группы параметров 1.
#Если "#Параметр(4)" = "Условие" ИЛИ "#Параметр(4)" = "" #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
( #Параметр(5) )
#ИначеЕсли "#Параметр(4)" = "ПравоЧтения" ИЛИ "#Параметр(4)" = "ПравоДобавления" ИЛИ "#Параметр(4)" = "ПравоИзменения" #Тогда
#Параметр(5) <> Неопределено
И Истина В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И ТипЗначения(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТипЗначения(#Параметр(5))
#Если "#Параметр(4)" = "ПравоДобавления" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Добавление
#ИначеЕсли "#Параметр(4)" = "ПравоИзменения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(4) = "" #Тогда
#Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЧерезПраваПоЗначениямДоступа" #Тогда
(
НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается.
(
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды
ГДЕ
Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4))
И Виды.ТолькоВидДоступа = Истина
)
ИЛИ
Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям
Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений
ПО
ИерархияЗначений.ИспользоватьПраваСсылки
И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4))
И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(5)
И ПраваПоЗначениям.Таблица = "#Параметр(1)"
И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа
И ПраваПоЗначениям.#Параметр(2)
И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем
Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей
ПО
#Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь
#Иначе
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь
#КонецЕсли
И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь
)
И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
Выбрать Первые 1 Ложь
ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям
Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений
ПО
ИерархияЗначений.ИспользоватьПраваСсылки
И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4))
И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(5)
И ПраваПоЗначениям.Таблица = "#Параметр(1)"
И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа
И ПраваПоЗначениям.#Параметр(2)Запрещено
И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем
Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей
ПО
#Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь
#Иначе
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь
#КонецЕсли
И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь
)
)
#Иначе
(
#Если "#Параметр(4)" = "Пользователи" #Тогда
#Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
#Если НЕ &ДобавлятьРуководителямДоступПодчиненных #Тогда
Истина В
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей
ГДЕ
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи)
И ПользователиИГруппыПользователей.ЗначениеДоступа = Т.#Параметр(5)
И ПользователиИГруппыПользователей.ГруппаДоступа = &ТекущийПользователь
)
#Иначе
Истина В
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ПодчиненныеПользователи КАК ПодчиненныеПользователи
ГДЕ
ПодчиненныеПользователи.Пользователь = &ТекущийПользователь
И ПодчиненныеПользователи.ПодчиненныйПользователь = Т.#Параметр(5)
И ПодчиненныеПользователи.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
)
#КонецЕсли
ИЛИ
#КонецЕсли
#ИначеЕсли "#Параметр(4)" = "ВнешниеПользователи" #Тогда
#Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда
#Если НЕ &ДобавлятьРуководителямДоступПодчиненных #Тогда
Истина В
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей
ГДЕ
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи)
И ПользователиИГруппыПользователей.ЗначениеДоступа = Т.#Параметр(5)
И ПользователиИГруппыПользователей.ГруппаДоступа = &ТекущийВнешнийПользователь
)
#Иначе
Истина В
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ПодчиненныеПользователи КАК ПодчиненныеПользователи
ГДЕ
ПодчиненныеПользователи.Пользователь = &ТекущийВнешнийПользователь
И ПодчиненныеПользователи.ПодчиненныйПользователь = Т.#Параметр(5)
И ПодчиненныеПользователи.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
)
#КонецЕсли
ИЛИ
#КонецЕсли
// Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа.
#ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,БезГрупп" ИЛИ
&ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ
&ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда
(
#Если "Т.#Параметр(5)" = "Т.Ссылка" #Тогда
Т.ВидДоступа#Параметр(4)
#Иначе
НЕ Истина В
(
Выбрать Истина
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения
ГДЕ
ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4))
И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(5)
И ВидыЗначения.ТолькоВидДоступа = Истина
)
#КонецЕсли
) И
#КонецЕсли
Выбор
Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений.
(
#Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид, БезГрупп" ИЛИ
&ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,БезГрупп" #Тогда
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = Т.#Параметр(5)
#ИначеЕсли "Т.#Параметр(5)" = "Т.Ссылка" #Тогда
#Если &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид, ОднаГруппа" #Тогда
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(4)
#ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(4) = "ЕдинственныйВид ,МножествоГрупп" #Тогда
Выбрать Первые 1 Истина
ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения
ПО
ГруппыЗначений.Ссылка = Т.#Параметр(5)
И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
#Иначе // &ОграничиватьДоступПоВиду##Параметр(4) = "ОдинИзМногихВидов,МножествоГрупп"
Показать
Выбрать Первые 1 Истина
ИЗ #Параметр(1).ГруппыДоступа#Параметр(4) КАК ГруппыЗначений
Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения
ПО
ГруппыЗначений.Ссылка = Т.#Параметр(5)
И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(4)
#КонецЕсли
#Иначе // "Т.##Параметр(5)" <> "Т.Ссылка"
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения
ПО
ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4))
И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(5)
И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4))
И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
#КонецЕсли
)
Тогда Истина
Иначе Ложь
Конец
=
Выбор
Когда Истина В // Проверка наличия ограничения по виду доступа для значений.
(
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды
ГДЕ
Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(4))
И Виды.ТолькоВидДоступа = Истина
)
Тогда Истина
Иначе Ложь
Конец
)
#КонецЕсли
#Иначе
Истина
#КонецЕсли
//// Проверка значения поля группы параметров 2.
#Если "#Параметр(6)" = "" И "#Параметр(7)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли "#Параметр(6)" = "Условие" ИЛИ "#Параметр(6)" = "" #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
И ( #Параметр(7) )
#ИначеЕсли "#Параметр(6)" = "ПравоЧтения" ИЛИ "#Параметр(6)" = "ПравоДобавления" ИЛИ "#Параметр(6)" = "ПравоИзменения" #Тогда
И #Параметр(7) <> Неопределено
И Истина В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И ТипЗначения(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТипЗначения(#Параметр(7))
#Если "#Параметр(6)" = "ПравоДобавления" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Добавление
#ИначеЕсли "#Параметр(6)" = "ПравоИзменения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(6) = "" #Тогда
И
#Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЧерезПраваПоЗначениямДоступа" #Тогда
(
НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается.
(
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды
ГДЕ
Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6))
И Виды.ТолькоВидДоступа = Истина
)
ИЛИ
Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям
Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений
ПО
ИерархияЗначений.ИспользоватьПраваСсылки
И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6))
И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(7)
И ПраваПоЗначениям.Таблица = "#Параметр(1)"
И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа
И ПраваПоЗначениям.#Параметр(2)
И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем
Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей
ПО
#Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь
#Иначе
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь
#КонецЕсли
И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь
)
И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
Выбрать Первые 1 Ложь
ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям
Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений
ПО
ИерархияЗначений.ИспользоватьПраваСсылки
И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6))
И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(7)
И ПраваПоЗначениям.Таблица = "#Параметр(1)"
И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа
И ПраваПоЗначениям.#Параметр(2)Запрещено
И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем
Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей
ПО
#Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь
#Иначе
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь
#КонецЕсли
И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь
)
)
#Иначе
(
#Если "#Параметр(6)" = "Пользователи" #Тогда
#Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
#Если НЕ &ДобавлятьРуководителямДоступПодчиненных #Тогда
Истина В
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей
ГДЕ
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи)
И ПользователиИГруппыПользователей.ЗначениеДоступа = Т.#Параметр(7)
И ПользователиИГруппыПользователей.ГруппаДоступа = &ТекущийПользователь
)
#Иначе
Истина В
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ПодчиненныеПользователи КАК ПодчиненныеПользователи
ГДЕ
ПодчиненныеПользователи.Пользователь = &ТекущийПользователь
И ПодчиненныеПользователи.ПодчиненныйПользователь = Т.#Параметр(7)
И ПодчиненныеПользователи.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
)
#КонецЕсли
ИЛИ
#КонецЕсли
#ИначеЕсли "#Параметр(6)" = "ВнешниеПользователи" #Тогда
#Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда
#Если НЕ &ДобавлятьРуководителямДоступПодчиненных #Тогда
Истина В
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей
ГДЕ
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи)
И ПользователиИГруппыПользователей.ЗначениеДоступа = Т.#Параметр(7)
И ПользователиИГруппыПользователей.ГруппаДоступа = &ТекущийВнешнийПользователь
)
#Иначе
Истина В
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ПодчиненныеПользователи КАК ПодчиненныеПользователи
ГДЕ
ПодчиненныеПользователи.Пользователь = &ТекущийВнешнийПользователь
И ПодчиненныеПользователи.ПодчиненныйПользователь = Т.#Параметр(7)
И ПодчиненныеПользователи.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
)
#КонецЕсли
ИЛИ
#КонецЕсли
// Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа.
#ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" ИЛИ
&ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ
&ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда
(
#Если "Т.#Параметр(7)" = "Т.Ссылка" #Тогда
Т.ВидДоступа#Параметр(6)
#Иначе
НЕ Истина В
(
Выбрать Истина
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения
ГДЕ
ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6))
И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(7)
И ВидыЗначения.ТолькоВидДоступа = Истина
)
#КонецЕсли
) И
#КонецЕсли
Выбор
Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений.
(
#Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, БезГрупп" ИЛИ
&ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,БезГрупп" #Тогда
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = Т.#Параметр(7)
#ИначеЕсли "Т.#Параметр(7)" = "Т.Ссылка" #Тогда
#Если &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид, ОднаГруппа" #Тогда
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(6)
#ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(6) = "ЕдинственныйВид ,МножествоГрупп" #Тогда
Выбрать Первые 1 Истина
ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения
ПО
ГруппыЗначений.Ссылка = Т.#Параметр(7)
И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
#Иначе // &ОграничиватьДоступПоВиду##Параметр(6) = "ОдинИзМногихВидов,МножествоГрупп"
Выбрать Первые 1 Истина
ИЗ #Параметр(1).ГруппыДоступа#Параметр(6) КАК ГруппыЗначений
Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения
ПО
ГруппыЗначений.Ссылка = Т.#Параметр(7)
И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(6)
#КонецЕсли
#Иначе // "Т.##Параметр(7)" <> "Т.Ссылка"
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения
ПО
ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6))
И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(7)
И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6))
И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
#КонецЕсли
)
Тогда Истина
Иначе Ложь
Конец
=
Выбор
Когда Истина В // Проверка наличия ограничения по виду доступа для значений.
(
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды
ГДЕ
Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6))
И Виды.ТолькоВидДоступа = Истина
)
Тогда Истина
Иначе Ложь
Конец
)
#КонецЕсли
#КонецЕсли
Показать
//// Проверка значения поля группы параметров 3.
#Если "#Параметр(8)" = "" И "#Параметр(9)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли "#Параметр(8)" = "Условие" ИЛИ "#Параметр(8)" = "" #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
И ( #Параметр(9) )
#ИначеЕсли "#Параметр(8)" = "ПравоЧтения" ИЛИ "#Параметр(8)" = "ПравоДобавления" ИЛИ "#Параметр(8)" = "ПравоИзменения" #Тогда
И #Параметр(9) <> Неопределено
И Истина В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И ТипЗначения(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТипЗначения(#Параметр(9))
#Если "#Параметр(8)" = "ПравоДобавления" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Добавление
#ИначеЕсли "#Параметр(8)" = "ПравоИзменения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(8) = "" #Тогда
И
#Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЧерезПраваПоЗначениямДоступа" #Тогда
(
НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается.
(
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды
ГДЕ
Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8))
И Виды.ТолькоВидДоступа = Истина
)
ИЛИ
Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям
Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений
ПО
ИерархияЗначений.ИспользоватьПраваСсылки
И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8))
И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(9)
И ПраваПоЗначениям.Таблица = "#Параметр(1)"
И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа
И ПраваПоЗначениям.#Параметр(2)
И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем
Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей
ПО
#Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь
#Иначе
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь
#КонецЕсли
И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь
)
И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
Выбрать Первые 1 Ложь
ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям
Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений
ПО
ИерархияЗначений.ИспользоватьПраваСсылки
И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8))
И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(9)
И ПраваПоЗначениям.Таблица = "#Параметр(1)"
И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа
И ПраваПоЗначениям.#Параметр(2)Запрещено
И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем
Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей
ПО
#Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь
#Иначе
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь
#КонецЕсли
И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь
)
)
#Иначе
(
#Если "#Параметр(8)" = "Пользователи" #Тогда
#Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
#Если НЕ &ДобавлятьРуководителямДоступПодчиненных #Тогда
Истина В
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей
ГДЕ
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи)
И ПользователиИГруппыПользователей.ЗначениеДоступа = Т.#Параметр(9)
И ПользователиИГруппыПользователей.ГруппаДоступа = &ТекущийПользователь
)
#Иначе
Истина В
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ПодчиненныеПользователи КАК ПодчиненныеПользователи
ГДЕ
ПодчиненныеПользователи.Пользователь = &ТекущийПользователь
И ПодчиненныеПользователи.ПодчиненныйПользователь = Т.#Параметр(9)
И ПодчиненныеПользователи.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
)
#КонецЕсли
ИЛИ
#КонецЕсли
#ИначеЕсли "#Параметр(8)" = "ВнешниеПользователи" #Тогда
#Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда
#Если НЕ &ДобавлятьРуководителямДоступПодчиненных #Тогда
Истина В
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей
ГДЕ
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи)
И ПользователиИГруппыПользователей.ЗначениеДоступа = Т.#Параметр(9)
И ПользователиИГруппыПользователей.ГруппаДоступа = &ТекущийВнешнийПользователь
)
#Иначе
Истина В
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ПодчиненныеПользователи КАК ПодчиненныеПользователи
ГДЕ
ПодчиненныеПользователи.Пользователь = &ТекущийВнешнийПользователь
И ПодчиненныеПользователи.ПодчиненныйПользователь = Т.#Параметр(9)
И ПодчиненныеПользователи.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
)
#КонецЕсли
ИЛИ
#КонецЕсли
// Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа.
#ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,БезГрупп" ИЛИ
&ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ
&ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда
(
#Если "Т.#Параметр(9)" = "Т.Ссылка" #Тогда
Т.ВидДоступа#Параметр(8)
#Иначе
НЕ Истина В
(
Выбрать Истина
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения
ГДЕ
ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8))
И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(9)
И ВидыЗначения.ТолькоВидДоступа = Истина
)
#КонецЕсли
) И
#КонецЕсли
Выбор
Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений.
(
#Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид, БезГрупп" ИЛИ
&ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,БезГрупп" #Тогда
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = Т.#Параметр(9)
#ИначеЕсли "Т.#Параметр(9)" = "Т.Ссылка" #Тогда
#Если &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид, ОднаГруппа" #Тогда
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(8)
#ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(8) = "ЕдинственныйВид ,МножествоГрупп" #Тогда
Выбрать Первые 1 Истина
ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения
ПО
ГруппыЗначений.Ссылка = Т.#Параметр(9)
И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
#Иначе // &ОграничиватьДоступПоВиду##Параметр(8) = "ОдинИзМногихВидов,МножествоГрупп"
Выбрать Первые 1 Истина
ИЗ #Параметр(1).ГруппыДоступа#Параметр(8) КАК ГруппыЗначений
Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения
ПО
ГруппыЗначений.Ссылка = Т.#Параметр(9)
И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(8)
#КонецЕсли
#Иначе // "Т.##Параметр(9)" <> "Т.Ссылка"
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения
ПО
ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8))
И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(9)
И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8))
И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
#КонецЕсли
)
Тогда Истина
Иначе Ложь
Конец
=
Выбор
Когда Истина В // Проверка наличия ограничения по виду доступа для значений.
(
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды
ГДЕ
Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(8))
И Виды.ТолькоВидДоступа = Истина
)
Тогда Истина
Иначе Ложь
Конец
)
#КонецЕсли
#КонецЕсли
Показать
//// Проверка значения поля группы параметров 4.
#Если "#Параметр(10)" = "" И "#Параметр(11)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли "#Параметр(10)" = "Условие" ИЛИ "#Параметр(10)" = "" #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
И ( #Параметр(11) )
#ИначеЕсли "#Параметр(10)" = "ПравоЧтения" ИЛИ "#Параметр(10)" = "ПравоДобавления" ИЛИ "#Параметр(10)" = "ПравоИзменения" #Тогда
И #Параметр(11) <> Неопределено
И Истина В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И ТипЗначения(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТипЗначения(#Параметр(11))
#Если "#Параметр(10)" = "ПравоДобавления" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Добавление
#ИначеЕсли "#Параметр(10)" = "ПравоИзменения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(10) = "" #Тогда
И
#Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЧерезПраваПоЗначениямДоступа" #Тогда
(
НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается.
(
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды
ГДЕ
Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10))
И Виды.ТолькоВидДоступа = Истина
)
ИЛИ
Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям
Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений
ПО
ИерархияЗначений.ИспользоватьПраваСсылки
И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10))
И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(11)
И ПраваПоЗначениям.Таблица = "#Параметр(1)"
И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа
И ПраваПоЗначениям.#Параметр(2)
И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем
Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей
ПО
#Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь
#Иначе
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь
#КонецЕсли
И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь
)
И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
Выбрать Первые 1 Ложь
ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям
Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений
ПО
ИерархияЗначений.ИспользоватьПраваСсылки
И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10))
И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(11)
И ПраваПоЗначениям.Таблица = "#Параметр(1)"
И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа
И ПраваПоЗначениям.#Параметр(2)Запрещено
И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем
Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей
ПО
#Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь
#Иначе
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь
#КонецЕсли
И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь
)
)
#Иначе
(
#Если "#Параметр(10)" = "Пользователи" #Тогда
#Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
#Если НЕ &ДобавлятьРуководителямДоступПодчиненных #Тогда
Истина В
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей
ГДЕ
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи)
И ПользователиИГруппыПользователей.ЗначениеДоступа = Т.#Параметр(11)
И ПользователиИГруппыПользователей.ГруппаДоступа = &ТекущийПользователь
)
#Иначе
Истина В
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ПодчиненныеПользователи КАК ПодчиненныеПользователи
ГДЕ
ПодчиненныеПользователи.Пользователь = &ТекущийПользователь
И ПодчиненныеПользователи.ПодчиненныйПользователь = Т.#Параметр(11)
И ПодчиненныеПользователи.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
)
#КонецЕсли
ИЛИ
#КонецЕсли
#ИначеЕсли "#Параметр(10)" = "ВнешниеПользователи" #Тогда
#Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда
#Если НЕ &ДобавлятьРуководителямДоступПодчиненных #Тогда
Истина В
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей
ГДЕ
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи)
И ПользователиИГруппыПользователей.ЗначениеДоступа = Т.#Параметр(11)
И ПользователиИГруппыПользователей.ГруппаДоступа = &ТекущийВнешнийПользователь
)
#Иначе
Истина В
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ПодчиненныеПользователи КАК ПодчиненныеПользователи
ГДЕ
ПодчиненныеПользователи.Пользователь = &ТекущийВнешнийПользователь
И ПодчиненныеПользователи.ПодчиненныйПользователь = Т.#Параметр(11)
И ПодчиненныеПользователи.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
)
#КонецЕсли
ИЛИ
#КонецЕсли
// Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа.
#ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,БезГрупп" ИЛИ
&ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ
&ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда
(
#Если "Т.#Параметр(11)" = "Т.Ссылка" #Тогда
Т.ВидДоступа#Параметр(10)
#Иначе
НЕ Истина В
(
Выбрать Истина
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения
ГДЕ
ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10))
И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(11)
И ВидыЗначения.ТолькоВидДоступа = Истина
)
#КонецЕсли
) И
#КонецЕсли
Выбор
Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений.
(
#Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид, БезГрупп" ИЛИ
&ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,БезГрупп" #Тогда
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = Т.#Параметр(11)
#ИначеЕсли "Т.#Параметр(11)" = "Т.Ссылка" #Тогда
#Если &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид, ОднаГруппа" #Тогда
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(10)
#ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(10) = "ЕдинственныйВид ,МножествоГрупп" #Тогда
Выбрать Первые 1 Истина
ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения
ПО
ГруппыЗначений.Ссылка = Т.#Параметр(11)
И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
#Иначе // &ОграничиватьДоступПоВиду##Параметр(10) = "ОдинИзМногихВидов,МножествоГрупп"
Выбрать Первые 1 Истина
ИЗ #Параметр(1).ГруппыДоступа#Параметр(10) КАК ГруппыЗначений
Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения
ПО
ГруппыЗначений.Ссылка = Т.#Параметр(11)
И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(10)
#КонецЕсли
#Иначе // "Т.##Параметр(11)" <> "Т.Ссылка"
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения
ПО
ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10))
И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(11)
И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10))
И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
#КонецЕсли
)
Тогда Истина
Иначе Ложь
Конец
=
Выбор
Когда Истина В // Проверка наличия ограничения по виду доступа для значений.
(
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды
ГДЕ
Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(10))
И Виды.ТолькоВидДоступа = Истина
)
Тогда Истина
Иначе Ложь
Конец
)
#КонецЕсли
#КонецЕсли
Показать
//// Проверка значения поля группы параметров 5.
#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли "#Параметр(12)" = "Условие" ИЛИ "#Параметр(12)" = "" #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
И ( #Параметр(13) )
#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" ИЛИ "#Параметр(12)" = "ПравоДобавления" ИЛИ "#Параметр(12)" = "ПравоИзменения" #Тогда
И #Параметр(13) <> Неопределено
И Истина В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И ТипЗначения(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТипЗначения(#Параметр(13))
#Если "#Параметр(12)" = "ПравоДобавления" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Добавление
#ИначеЕсли "#Параметр(12)" = "ПравоИзменения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(12) = "" #Тогда
И
#Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЧерезПраваПоЗначениямДоступа" #Тогда
(
НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается.
(
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды
ГДЕ
Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12))
И Виды.ТолькоВидДоступа = Истина
)
ИЛИ
Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям
Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений
ПО
ИерархияЗначений.ИспользоватьПраваСсылки
И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12))
И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(13)
И ПраваПоЗначениям.Таблица = "#Параметр(1)"
И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа
И ПраваПоЗначениям.#Параметр(2)
И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем
Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей
ПО
#Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь
#Иначе
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь
#КонецЕсли
И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь
)
И НЕ Ложь В // Проверка, что пользователю или какой-нибудь группе пользователя право запрещено
(
Выбрать Первые 1 Ложь
ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям
Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений
ПО
ИерархияЗначений.ИспользоватьПраваСсылки
И ИерархияЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12))
И ИерархияЗначений.ЗначениеДоступа = Т.#Параметр(13)
И ПраваПоЗначениям.Таблица = "#Параметр(1)"
И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаДоступа
И ПраваПоЗначениям.#Параметр(2)Запрещено
И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем
Внутреннее Соединение РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей
ПО
#Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь
#Иначе
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)
И ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийВнешнийПользователь
#КонецЕсли
И ПользователиИГруппыПользователей.ГруппаДоступа = ПраваПоЗначениям.Пользователь
)
)
#Иначе
(
#Если "#Параметр(12)" = "Пользователи" #Тогда
#Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
#Если НЕ &ДобавлятьРуководителямДоступПодчиненных #Тогда
Истина В
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей
ГДЕ
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.Пользователи)
И ПользователиИГруппыПользователей.ЗначениеДоступа = Т.#Параметр(13)
И ПользователиИГруппыПользователей.ГруппаДоступа = &ТекущийПользователь
)
#Иначе
Истина В
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ПодчиненныеПользователи КАК ПодчиненныеПользователи
ГДЕ
ПодчиненныеПользователи.Пользователь = &ТекущийПользователь
И ПодчиненныеПользователи.ПодчиненныйПользователь = Т.#Параметр(13)
И ПодчиненныеПользователи.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
)
#КонецЕсли
ИЛИ
#КонецЕсли
#ИначеЕсли "#Параметр(12)" = "ВнешниеПользователи" #Тогда
#Если НЕ (&ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка)) #Тогда
#Если НЕ &ДобавлятьРуководителямДоступПодчиненных #Тогда
Истина В
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей
ГДЕ
ПользователиИГруппыПользователей.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи)
И ПользователиИГруппыПользователей.ЗначениеДоступа = Т.#Параметр(13)
И ПользователиИГруппыПользователей.ГруппаДоступа = &ТекущийВнешнийПользователь
)
#Иначе
Истина В
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ПодчиненныеПользователи КАК ПодчиненныеПользователи
ГДЕ
ПодчиненныеПользователи.Пользователь = &ТекущийВнешнийПользователь
И ПодчиненныеПользователи.ПодчиненныйПользователь = Т.#Параметр(13)
И ПодчиненныеПользователи.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
)
#КонецЕсли
ИЛИ
#КонецЕсли
// Если ВидПоТипуЗначенияОдинИзМногих, тогда проверка возможности доступа к значению через вид доступа.
#ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" ИЛИ
&ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" ИЛИ
&ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп" #Тогда
(
#Если "Т.#Параметр(13)" = "Т.Ссылка" #Тогда
Т.ВидДоступа#Параметр(12)
#Иначе
НЕ Истина В
(
Выбрать Истина
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначения
ГДЕ
ВидыЗначения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12))
И ВидыЗначения.ЗначениеДоступа = Т.#Параметр(13)
И ВидыЗначения.ТолькоВидДоступа = Истина
)
#КонецЕсли
) И
#КонецЕсли
Выбор
Когда Истина В // Поиск значения в группе доступа (пользователей) непосредственно или через группы доступа значений.
(
#Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, БезГрупп" ИЛИ
&ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,БезГрупп" #Тогда
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = Т.#Параметр(13)
#ИначеЕсли "Т.#Параметр(13)" = "Т.Ссылка" #Тогда
#Если &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид, ОднаГруппа" #Тогда
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = Т.ГруппаДоступа
#ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ОдинИзМногихВидов,ОднаГруппа" #Тогда
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Значения
ГДЕ
Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = Т.ГруппаДоступа#Параметр(12)
#ИначеЕсли &ОграничиватьДоступПоВиду#Параметр(12) = "ЕдинственныйВид ,МножествоГрупп" #Тогда
Выбрать Первые 1 Истина
ИЗ #Параметр(1).ГруппыДоступа КАК ГруппыЗначений
Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения
ПО
ГруппыЗначений.Ссылка = Т.#Параметр(13)
И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
#Иначе // &ОграничиватьДоступПоВиду##Параметр(12) = "ОдинИзМногихВидов,МножествоГрупп"
Выбрать Первые 1 Истина
ИЗ #Параметр(1).ГруппыДоступа#Параметр(12) КАК ГруппыЗначений
Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения
ПО
ГруппыЗначений.Ссылка = Т.#Параметр(13)
И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12))
И Значения.ТолькоВидДоступа = Ложь
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа#Параметр(12)
#КонецЕсли
#Иначе // "Т.##Параметр(13)" <> "Т.Ссылка"
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения
ПО
ГруппыЗначений.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12))
И ГруппыЗначений.ЗначениеДоступа = Т.#Параметр(13)
И Значения.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Значения.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12))
И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа
И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаДоступа
#КонецЕсли
)
Тогда Истина
Иначе Ложь
Конец
=
Выбор
Когда Истина В // Проверка наличия ограничения по виду доступа для значений.
(
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды
ГДЕ
Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(12))
И Виды.ТолькоВидДоступа = Истина
)
Тогда Истина
Иначе Ложь
Конец
)
#КонецЕсли
#КонецЕсли
Показать
[1C-CODE]/// Проверка значения поля группы параметров 6.
#Если "#Параметр(14)" = "" И "#Параметр(15)" = "" #Тогда
// Группа параметров не используется.
#ИначеЕсли "#Параметр(14)" = "Условие" ИЛИ "#Параметр(14)" = "" #Тогда
// Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
И ( #Параметр(15) )
#ИначеЕсли "#Параметр(14)" = "ПравоЧтения" ИЛИ "#Параметр(14)" = "ПравоДобавления" ИЛИ "#Параметр(14)" = "ПравоИзменения" #Тогда
И #Параметр(15) <> Неопределено
И Истина В
( // Проверка права пользователя на таблицу Значения, установленного в поле.
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
ГДЕ
ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И ТипЗначения(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТипЗначения(#Параметр(15))
#Если "#Параметр(14)" = "ПравоДобавления" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Добавление
#ИначеЕсли "#Параметр(14)" = "ПравоИзменения" #Тогда
И ТаблицыГруппДоступаПроверкаПрава.Изменение
#КонецЕсли
)
#ИначеЕсли НЕ &ОграничиватьДоступПоВиду#Параметр(14) = "" #Тогда
И
#Если &ОграничиватьДоступПоВиду#Параметр(14) = "ЧерезПраваПоЗначениямДоступа" #Тогда
(
НЕ Истина В // Проверка, что по виду доступа пользователь ограничивается.
(
Выбрать Истина
ИЗ РегистрСведений.ЗначенияГруппДоступа КАК Виды
ГДЕ
Виды.ГруппаДоступа = ТаблицыГруппДоступа.ГруппаДоступа
И Виды.ВидДоступа = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(14))
И Виды.ТолькоВидДоступа = Истина
)
ИЛИ
Истина В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
(
Выбрать Первые 1 Истина
ИЗ РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям
Внутреннее Соединение РегистрСведений.ГруппыЗнач[