Кто допиливал ограничение доступа RLS, мб подскажите? Не отрабатывает как надо. (скрины внутри есть)

1. Medveedka 21.11.19 13:56 Сейчас в теме
Здравствуйте.

Начну с начала.

Суть в том, чтобы к одному значению справочника, ограничить доступ.

Сам справочник - банковские счета. Есть там счет с наименованием Яковлев. Вот мне надо чтобы этот счёт только 3 человека видели. Остальные нет.

Открываю статью: https://infostart.ru/public/313468/ и выполняю по пунктам.

1. Добавила в конфигурацию справочник ГруппыДоступаБанковскихСчетов и создала там реквизит ГруппаДоступа ссылочного типа на этот же справочник (делала это, т.к. в комментариях к статье было (пробовала и без него - ничего)) (скрин1)
2. В справочнике БанковскиеСчета добавила реквизит ГруппаДоступа с ссылкой на новый справочник (скрин 2)
3. В определяемый тип ЗначенияДоступа и ЗначениеДоступаСГруппамиЗначенийДоступаОбъект (без второго типа обновление ругалось) включил ссылки на БанковскиеСчета и ГруппыДоступаБанковскихСчетов.
4.В подписке на событие "ОбновитьГруппыЗначенийДоступа" поставила галку на БанковскиеСчета.
5. В общем модуле УправлениеДоступомПереопределяемый внесла такой код (выделен множеством +):

Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт
	
	ЗарплатаКадры.УправлениеДоступомЗаполнитьСвойстваВидаДоступа(ВидыДоступа);
	
	 // ++++++++++++++++++++Наша вставка
    ВидДоступа = ВидыДоступа.Добавить();
    ВидДоступа.Имя = "ГруппыБанковскихСчетов"; // имя вида доступа (используется в ролях для RLS)
    ВидДоступа.Представление    = НСтр("ru = 'Группы банковских счетов'");
    ВидДоступа.ТипЗначений      = Тип("СправочникСсылка.БанковскиеСчета"); // критерий ограничения доступа
    ВидДоступа.ТипГруппЗначений = Тип("СправочникСсылка.ГруппыДоступаБанковскихСчетов"); // средство ограничения доступа
    // ---------------------------------------Наша вставка
	
	УправлениеДоступомБП.ЗаполнитьВидыДоступа(ВидыДоступа);
	// бит_Финанс Изменение кода. Начало. 09.02.2015{{
	бит_ПраваДоступаОсновной.ЗаполнитьСвойстваВидовДоступа(ВидыДоступа);
	// бит_Финанс Изменение кода. Конец. 09.02.2015}}
	РегламентированнаяОтчетность.ПриЗаполненииВидовДоступа(ВидыДоступа);
		
	//bt_04_0971_suyy_191217_N
	бит_стр_ОМТС_Сервер.УправлениеДоступомЗаполнитьСвойстваВидаДоступа(ВидыДоступа);
	//bt_04_0971_suyy_191217_K
	
КонецПроцедуры


Процедура ПриЗаполненииИспользованияВидаДоступа(ВидДоступа, Использование) Экспорт
	
	ЗарплатаКадры.УправлениеДоступомЗаполнитьИспользованиеВидаДоступа(ВидДоступа, Использование);
	
	 // +++++++++++++++++++++++Наша вставка    
    Если ВидДоступа = "ГруппыБанковскихСчетов" Тогда
        Использование = Истина;
    КонецЕсли;
    // ---------------------------------------------Наша вставка
	
	//bt_04_0971_suyy_191217_N
	бит_стр_ОМТС_Сервер.УправлениеДоступомЗаполнитьИспользованиеВидаДоступа(ВидДоступа, Использование);
	//bt_04_0971_suyy_191217_K
	
КонецПроцедуры

Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт
		
	Описание = "";
	
	// +++++++++++++++++++++++++++Наша вставка
    // указание прав объектов метаданных, на которые распространяется RLS 
    Описание = Описание + "
    |Справочник.БанковскиеСчета.Чтение.ГруппыБанковскихСчетов
    |Справочник.БанковскиеСчета.Изменение.ГруппыБанковскихСчетов
    |";
    // ---------------------------------------------------Наша вставка

	
	УправлениеДоступомБП.ЗаполнитьВидыОграниченийПравОбъектовМетаданных(Описание);
	
	РегламентированнаяОтчетность.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание);
	
	ЭлектронноеВзаимодействие.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание);
	
	//bt_04_0971_suyy_191217_N
	бит_стр_ОМТС_Сервер.ЗаполнитьВидыОграниченийПравОбъектовМетаданных(Описание);
	//bt_04_0971_suyy_191217_K
	
КонецПроцедуры


Показать


Дальше в режиме предприятия запускаю внешнюю обработку Обновление вспомогательных данных обновляю (БСП так понимаю?). Появляется новый вид доступа.

6. В новом справочнике создаю объект, называю его Пенза, делаю владельцем наш счет Яковлев. (скрин 3).

7.Настраиваю новый профиль test с ограничением "все РАЗРЕШИТЬ, кроме..." добавляю ограничение Пенза.

8. Создаю нового пользователя (тест4) с минимальным набором ролей. Во всех ролях, кроме одной, выключаю чтение справочника БанковскиеСчета.
В одной роли, которая и осуществляет только доступ к справочнику, пишу такое ограничение:
#ПоЗначениям( "Справочник.БанковскиеСчета","Чтение","","ГруппыБанковскихСчетов","Ссылка","","","","","","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","" ) 

Не знаю надо ли, но могу кинуть шаблон (ПоЗначениям) который использовался.

Захожу под пользователем, лезу в банковские счета иии... ничего не убралось. БК Яковлев всё так же висит.

Настраиваю профиль "все ЗАПРЕТИТЬ, кроме..." и также свою Пензу оставляю.
Перезахожу под пользователем иии... убирается воообще ВСЁ. Что за хрень такая творится?

Я почему то грешу на не верную настройку ролей.
Прикрепленные файлы:
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
7. dhurricane 21.11.19 14:39 Сейчас в теме
(1) Сообщите, пожалуйста, а какая у Вас версия БСП?
8. Medveedka 21.11.19 14:40 Сейчас в теме
9. Medveedka 21.11.19 14:42 Сейчас в теме
(7)так понимаю это надо? стандартные подсистемы?
Прикрепленные файлы:
10. dhurricane 21.11.19 14:42 Сейчас в теме
14. Medveedka 21.11.19 15:15 Сейчас в теме
(10) у вас нет идей, что может быть?
15. dhurricane 21.11.19 15:17 Сейчас в теме
(14) Я в процессе. :) А справочник банковских счетов иерархический?
16. Medveedka 21.11.19 15:26 Сейчас в теме
(15)извиняюсь) нет, не иерархический)
17. VmvLer 21.11.19 15:33 Сейчас в теме
(16) роли в новом профиле все типовые?

как-то у себя в инструкции писал такое

Крайне важно: При добавлении новых ролей с установками ограничений по шаблонам обязательно включить эти новые роли в подсистемы, которые будут доступны пользователям. Без включения новых ролей в доступные пользователю подсистемы RLS не будет выдавать ошибок, но списки будут пусты. Если подсистемы на замке, то через настройку поддержки конфигурации их необходимо их открыть.
18. Medveedka 21.11.19 15:38 Сейчас в теме
(17) роли не все типовые. Немного поподробнее можно пожалуйста. Куда мне необходимо включить данные роли?
19. VmvLer 21.11.19 15:41 Сейчас в теме
(18) обязательно включить эти новые роли в подсистемы, которые будут доступны пользователям
20. Medveedka 21.11.19 15:46 Сейчас в теме
(19) с этим уже сложнее. не подскажешь как это можно посмотреть включены ли они в подсистемы?
21. VmvLer 21.11.19 15:52 Сейчас в теме
(20) правой кнопкой щелкаем на роли и там два пути

Опция:
поиск ссылок на объект с флагом
Свойства
остальные флаги сбросить

Опция:
дополнительно
глаза смотрим в какие подсистемы попадает роль.

Если роль не включена в подсистемы и в ней есть ограничения по шаблонам РЛС, то это
косяк. Включайте роль в подсистему.

Причем, забавно. что ограничение на чтение будет работать и без включения в подсистемы,
а вот для "просмотр" не будет работать.
Это сродни тому, как СКД не показывает данные если на добавленной таблице стоит только
галка "чтение" и нет галки "просмотр".

Если это не поможет копайте дальше код.
22. Medveedka 21.11.19 15:55 Сейчас в теме
(21) поняла, пошла смотреть
23. dhurricane 21.11.19 15:59 Сейчас в теме
(1) В общем, я попробовал создать ограничение доступа к банковским счетам, аналогичное Вашему, но в демо-базе БСП. Следовал описанию на ИТС для БСП 3.0.2, дорабатывал конфигурацию и параллельно писал инструкцию. Инструкция получилась плохо структурированной и объемной, прошу прощения за это. Некоторые пункты, возможно, избыточны.

Но в итоге результат удовлетворительный. Итак.

1. Добавить новый справочник "ГруппыДоступаБанковскихСчетов". Добавить в справочник реквизит:
- Имя: ГруппаДоступа
- Тип: СправочникСсылка.ГруппыДоступаБанковскихСчетов

2. Добавить в справочник "БанковскиеСчета" новый реквизит:
- Имя: ГруппаДоступа
- Тип: СправочникСсылка.ГруппыДоступаБанковскихСчетов

3. В обработчике "ПриЧтенииНаСервере" формы элемента обоих справочников добавить код:
УправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);

4. В процедуре "ПриЗаполненииСписковСОграничениемДоступа" общего модуля "УправлениеДоступомПереопределяемый" добавить код:
Списки.Вставить(Метаданные.Справочники.БанковскиеСчета, Истина);
Списки.Вставить(Метаданные.Справочники.ГруппыДоступаБанковскихСчетов, Истина);

5. В процедуре "ПриЗаполненииВидовДоступа" общего модуля "УправлениеДоступомПереопределяемый" добавить код:
ВидДоступа = ВидыДоступа.Добавить();
ВидДоступа.Имя = "ГруппыБанковскихСчетов";
ВидДоступа.Представление    = НСтр("ru = 'Группы банковских счетов'");
ВидДоступа.ТипЗначений      = Тип("СправочникСсылка.БанковскиеСчета");
ВидДоступа.ТипГруппЗначений = Тип("СправочникСсылка.ГруппыДоступаБанковскихСчетов");

6. Включить в состав определяемого типа "ЗначениеДоступа":
- СправочникСсылка.БанковскиеСчета
- СправочникСсылка.ГруппыДоступаБанковскихСчетов

7. Включить в состав определяемого типа "ЗначениеДоступаОбъект":
- СправочникОбъект.БанковскиеСчета

8. Добавть роль "ДобавлениеИзменениеБанковскихСчетов". Скопировать из любой типовой роли шаблоны ограничения доступа "ДляОбъекта" и "ПоЗначениям"

9. Для новой роли назначить права на "Чтение" справочника "ГруппыДоступаБанковскихСчетов" со следующим ограничением доступа:
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
#ДляОбъекта("")
#Иначе
#ПоЗначениям( "Справочник.ГруппыДоступаБанковскихСчетов", "Чтение", "",
"ГруппыБанковскихСчетов", "Ссылка", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","")
#КонецЕсли
Дать также права на "Просмотр" и "Ввод по строке" справочника.

10. Для новой роли назначить права на "Чтение" справочника "БанковскиеСчета" со следующим ограничением доступа:
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
#ДляОбъекта("")
#Иначе
#ПоЗначениям( "Справочник.БанковскиеСчета", "Чтение", "",
"ГруппыБанковскихСчетов", "Ссылка", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","")
#КонецЕсли
Аналогично дать права на "Изменение" и "Добавление" с таким же ограничением доступа, заменив "Чтение" на "Изменение" и "Добавление" соответственно.
Дать также права на "Просмотр" и "Ввод по строке" справочника, "Интерактивное добавление", "Редактирование" и пр.

11. Добавить в модуль менеджера обоих справочников код:
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
	
	Ограничение.Текст =
	"РазрешитьЧтениеИзменение
	|ГДЕ
	|	ЗначениеРазрешено(Ссылка)";
	
КонецПроцедуры

12. Включить в состав определяемого типа "ВладелецЗначенийКлючейДоступа":
- СправочникСсылка.БанковскиеСчета
- СправочникСсылка.ГруппыДоступаБанковскихСчетов

13. Включить в состав определяемого типа "ВладелецЗначенийКлючейДоступаОбъект":
- СправочникОбъект.БанковскиеСчета
- СправочникОбъект.ГруппыДоступаБанковскихСчетов

14. В процедуре "ПриЗаполненииВидовОграниченийПравОбъектовМетаданных" общего модуля "УправлениеДоступомПереопределяемый" добавить код:
Описание = Описание + "
|Справочник.БанковскиеСчета.Добавление.ГруппыБанковскихСчетов
|Справочник.БанковскиеСчета.Изменение.ГруппыБанковскихСчетов
|Справочник.БанковскиеСчета.Чтение.ГруппыБанковскихСчетов
|Справочник.ГруппыДоступаБанковскихСчетов.Чтение.ГруппыБанковскихСчетов
|";

15. Обновить конфигурацию информационной базы. Запустить обновление вспомогательных данных информационной базы одним из способов:
- запустить базу с ключом "/CЗапуститьОбновлениеИнформационнойБазы".
- воспользоваться обработкой "ОбновлениеВспомогательныхДанных.epf"
puzo50; user1809226; pakill; LexmanR; triviumfan; MaxOPTdv; mchammer4; skeptik2105; denium; Pipapalamm; BlizD; simgo83; plebedinskiy; whitedi; pereligins; vovan_victory; Shecurok; agaraev; linkov; +19 Ответить
24. Medveedka 21.11.19 16:04 Сейчас в теме
(23) ооооххх. Благодарю за инструкцию, пошла переписывать всё.
25. Medveedka 21.11.19 16:12 Сейчас в теме
(23) у меня сразу будет вопрос. В созданном справочнике же нет никакой формы элемента. Не с нуля же её писать.
Извиняюсь за глупые вопросы :с
26. dhurricane 21.11.19 16:17 Сейчас в теме
(25) Этот пункт нужен для того, чтобы заблокировать элемент, когда есть права на чтение, но нет прав на изменение. Если не выполните его, ничего страшного не должно случиться. Просто кнопка "Записать", например, будет доступна для нажатия. При этом записать все равное не получится, появится сообщение об ошибке.

Но да, для выполнения пункта форму нужно добавить.
27. Medveedka 21.11.19 16:18 Сейчас в теме
(26) попробую его пропустить. спасибо)
28. Medveedka 21.11.19 17:14 Сейчас в теме
(26) так, я тут с правами накосячила (ещё до Вашей инструкции), разбираться долго, а копию снять новую пока нет возможности. Сегодня вряд ли дам ответ, но как что - сразу отпишусь)
29. Medveedka 21.11.19 18:14 Сейчас в теме
(23) Всё делала по Вашей инструкции (на чистейшей копии), кроме эл-та форм в справочнике ГруппыДоступаБанковскихСчетов и новую роль не создавала.
Использовала уже существующую роль ДобавлениеИзменениеБанковскихСчетов, но естественно подредактировала как написано.
Там были шаблоны "ПоЗначению" и "ДляОбъекта(ПолеОбъекта)" - их я никак не меняла.
Обновила с обработкой, создала пользователя, минимизировала ему права.

В справочник Банковские счета не входит, такая ошибка:
В справочник Группы доступа банковских счетов входит нормально, без ошибок.

От чего могла возникнуть данная ошибка? Где недоработала?

Upd. ошибка возникает при "все разрешены кроме", щас попробую на "все запрещены"

Upd2. ошибка не ушла. Возможно дала слишком мало прав. Ибо у меня даже при входе в систему ругается, что "недостаточно прав для работы с таблицей Организации." Вот и тут посомтрю в общем. Из дома уже.
Прикрепленные файлы:
30. dhurricane 21.11.19 18:23 Сейчас в теме
(29) Как в итоге выглядит ограничение доступа в роли?
31. Medveedka 22.11.19 09:29 Сейчас в теме
(30) сам шаблон выглядит так:
// ДляОбъекта(ПолеОбъекта = "")
// Шаблон используется для ограничения элементов справочников, документов и
// других списков объектов по полю Ссылка, а также элементов зависимых списков
// объектов и записей регистров через поле объекта-владельца.
//
// Параметры:
//  ПолеОбъекта - имя поля, содержащего ссылку на объект, от которого зависит элемент списка.
//                Значение "" (по умолчанию) то же, что имя поля "Ссылка".
//
#Если &СпискиСОтключеннымОграничениемЧтения = "Неопределено" #Тогда
  // Информационная база заблокирована для обновления.
    ГДЕ ЛОЖЬ

#ИначеЕсли Не СтрСодержит(&ВерсииШаблоновОграниченияДоступа, ",ДляОбъекта3,")
         И Не СтрСодержит(&ВерсииШаблоновОграниченияДоступа, ",ДляОбъекта3ТребуетсяПерезапуститьСеанс,") #Тогда
    Ошибка: Требуется обновить шаблон на актуальную версию, поставляемую в роли ИзменениеУчастниковГруппДоступа по причине: Используется устаревшая версия 1 шаблона ограничения доступа ДляОбъекта. Объект: #ИмяТекущейТаблицы, Право: #ИмяТекущегоПраваДоступа.

#ИначеЕсли &СпискиСОтключеннымОграничениемЧтения = "Все" #Тогда
  // У пользователя отключены все виды доступа или
  // ограничение на уровне записей не используется.
    ГДЕ ИСТИНА

#ИначеЕсли СтрСодержит(&СпискиСОтключеннымОграничениемЧтения, #ИмяТекущейТаблицы) #Тогда
  // У пользователя отключено ограничение для текущей таблицы.
    ГДЕ ИСТИНА

#ИначеЕсли СтрСодержит(&ВерсииШаблоновОграниченияДоступа, ",ДляОбъекта3ТребуетсяПерезапуститьСеанс,") #Тогда
    Ошибка: Версия программы обновлена, требуется перезапустить сеанс. Объект: #ИмяТекущейТаблицы, Право: #ИмяТекущегоПраваДоступа.

#ИначеЕсли #ИмяТекущегоПраваДоступа <> "Чтение" #Тогда
  // Проверка прав Добавление, Изменение, Удаление выполняется ПередЗаписью / ПриЗаписи.
    ГДЕ ИСТИНА
#ИначеЕсли СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") #Тогда
ТекущаяТаблица ГДЕ ИСТИНА В
 (
  ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
  ИЗ РегистрСведений.КлючиДоступаКОбъектам КАК КлючиДоступаКОбъектам
#Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
  ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаПользователей КАК РазрешенныеКлючиДоступа
#Иначе
  ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаВнешнихПользователей КАК РазрешенныеКлючиДоступа
#КонецЕсли
  ПО
  #Если "#ПолеОбъекта" = "" #Тогда
      КлючиДоступаКОбъектам.Объект = ТекущаяТаблица.Ссылка
  #Иначе
      КлючиДоступаКОбъектам.Объект = ТекущаяТаблица.#ПолеОбъекта
  #КонецЕсли
  #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
    И РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаПользователей
    И РазрешенныеКлючиДоступа.Пользователь В (&РазрешенныйПользователь, &РазрешенныйНаборГруппДоступа
  #Иначе
    И РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаВнешнихПользователей
    И РазрешенныеКлючиДоступа.ВнешнийПользователь В (&РазрешенныйПользователь, &РазрешенныйНаборГруппДоступа
  #КонецЕсли
      #Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;*+")
        Или СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;+") #Тогда
        , &РазрешенныйНаборГруппПользователей
      #КонецЕсли
      #Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;*+")
        Или СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователей, #ИмяТекущейТаблицы + ":#ПолеОбъекта;*") #Тогда
        , &РазрешенныйПустойНаборГруппДоступа
      #КонецЕсли
      )
 )
#ИначеЕсли СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") #Тогда

    ТекущаяТаблица ГДЕ ИСТИНА В
 (
  ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
  ИЗ РегистрСведений.КлючиДоступаКОбъектам КАК КлючиДоступаКОбъектам
  ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаНаборовГруппДоступа КАК РазрешенныеКлючиДоступа
  ПО
  #Если "#ПолеОбъекта"  = "" #Тогда
      КлючиДоступаКОбъектам.Объект = ТекущаяТаблица.Ссылка
  #Иначе
      КлючиДоступаКОбъектам.Объект = ТекущаяТаблица.#ПолеОбъекта
  #КонецЕсли
  #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
    И РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаПользователей
  #Иначе
    И РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаВнешнихПользователей
  #КонецЕсли
    И РазрешенныеКлючиДоступа.НаборГруппДоступа В (&РазрешенныйНаборГруппДоступа
      #Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;*+")
        Или СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаГруппДоступа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;*") #Тогда
        , &РазрешенныйПустойНаборГруппДоступа
      #КонецЕсли
      )
 )
#ИначеЕсли СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователейИГруппДост­упа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;") #Тогда

    ТекущаяТаблица ГДЕ ИСТИНА В
 (
  ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
  ИЗ РегистрСведений.КлючиДоступаКОбъектам КАК КлючиДоступаКОбъектам
  ГДЕ
  #Если "#ПолеОбъекта"  = "" #Тогда
      КлючиДоступаКОбъектам.Объект = ТекущаяТаблица.Ссылка
  #Иначе
      КлючиДоступаКОбъектам.Объект = ТекущаяТаблица.#ПолеОбъекта
  #КонецЕсли
    И (
       ИСТИНА В
            (
            ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
          #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
            ИЗ РегистрСведений.КлючиДоступаПользователей КАК РазрешенныеКлючиДоступа
          #Иначе
            ИЗ РегистрСведений.КлючиДоступаВнешнихПользователей КАК РазрешенныеКлючиДоступа
          #КонецЕсли
            ГДЕ
             #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
                  РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаПользователей
                И РазрешенныеКлючиДоступа.Пользователь В (&РазрешенныйПользователь, &РазрешенныйНаборГруппДоступа
             #Иначе
                  РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаВнешнихПользователей
                И РазрешенныеКлючиДоступа.ВнешнийПользователь В (&РазрешенныйПользователь, &РазрешенныйНаборГруппДоступа
             #КонецЕсли
                  #Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователейИГруппДост­упа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;*+")
                    Или СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователейИГруппДост­упа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;+") #Тогда
                    , &РазрешенныйНаборГруппПользователей
                  #КонецЕсли
                  #Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователейИГруппДост­упа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;*+")
                    Или СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователейИГруппДост­упа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;*") #Тогда
                    , &РазрешенныйПустойНаборГруппДоступа
                  #КонецЕсли
                  )
            )
        ИЛИ ИСТИНА В
           (
            ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
            ИЗ РегистрСведений.КлючиДоступаНаборовГруппДоступа КАК РазрешенныеКлючиДоступа
            ГДЕ
              #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
                  РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаПользователей
              #Иначе
                  РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаВнешнихПользователей
              #КонецЕсли
                И РазрешенныеКлючиДоступа.НаборГруппДоступа В (&РазрешенныйНаборГруппДоступа
                  #Если СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователейИГруппДост­упа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;*+")
                    Или СтрСодержит(&СпискиСОграничениемЧерезКлючиДоступаПользователейИГруппДост­упа, #ИмяТекущейТаблицы + ":#ПолеОбъекта;*") #Тогда
                    , &РазрешенныйПустойНаборГруппДоступа
                  #КонецЕсли
                  )
           )
      )
 )

#Иначе
  Ошибка: Требуется актуализировать ограничение доступа по причине: Не удалось определить вариант ограничения доступа в параметрах сеанса для шаблона ДляОбъекта со значением параметра "#ПолеОбъекта". Объект: #ИмяТекущейТаблицы, Право: #ИмяТекущегоПраваДоступа.
#КонецЕсли
Показать
32. dhurricane 22.11.19 09:31 Сейчас в теме
(31) Не, я интересовался не самим шаблоном, а его использованием.
33. Medveedka 22.11.19 09:31 Сейчас в теме
(30)вот само ограничение:
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
#ДляОбъекта("")
#Иначе
#ПоЗначениям( "Справочник.БанковскиеСчета", "Чтение", "",
"ГруппыБанковскихСчетов", "Ссылка", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","")
#КонецЕсли


Если есть возможность можете отправить свой шаблон, который использовали
34. dhurricane 22.11.19 09:33 Сейчас в теме
(33) Я его приводил в инструкции. Видимо проблема именно в доступе к организациям у Вас.
35. Medveedka 22.11.19 09:41 Сейчас в теме
36. Medveedka 22.11.19 10:00 Сейчас в теме
(34)дала все права на 2 справочника:
организации и контрагенты (всё в той же роли) - все разрешить Кроме - показывает все, все запрещены Кроме - не показывает ничего.

Буду смотреть где ошиблась
37. Medveedka 09.12.19 14:43 Сейчас в теме
(23) в общем намучалась я с этим, но в целом всё получилось. Спасибо Вам огромное. Что помогло мне, чего не было в Вашей инструкции: на форму элемента справочника Банковские счета добавил реквизит ГруппаДоступа с видом Объект-ГруппаДоступа. В самой программе указал группу доступа на нужном мне счете (и естественно в спр. ГруппыДоступаБанковскихСчетов) И всё сработало. Остальное всё как у Вас.
38. dhurricane 09.12.19 15:03 Сейчас в теме
(37) Хм. Думал, что это очевидно. Ведь его нужно же как-то указывать. :-)

Рад, что смог помочь.
2. Ганс 21.11.19 14:13 Сейчас в теме
Дайте шаблон посмотреть
3. Medveedka 21.11.19 14:17 Сейчас в теме
(2)
// ПоЗначениям(Таблица, -, Модификатор, В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)>
//  Пример:
//      ПоЗначениям("Документ.ПоступлениеТоваровИУслуг", "", "",
//      "Организации","Организация",
//      "Поставщики","Контрагент", "","", ...)

#Если &ОграничениеДоступаНаУровнеЗаписейВключено = "" #Тогда // Информационная база заблокирована для обновления.
    ГДЕ ЛОЖЬ
#Иначе

// Проверка правильности параметра Право.
#Если Не ("#Параметр(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 ИСТИНА
                ИЗ
                    РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа
                    ГДЕ
                          ТаблицыГруппДоступа.Таблица       = СвойстваТекущейТаблицы.Ссылка
                        И ТаблицыГруппДоступа.ГруппаДоступа = ГруппыДоступа.Ссылка
                    #Если #ИмяТекущегоПраваДоступа = "Изменение" #Тогда
                        И ТаблицыГруппДоступа.Изменение
                    #ИначеЕсли #ИмяТекущегоПраваДоступа = "Добавление" #Тогда
                        И ТаблицыГруппДоступа.Добавление
                    #КонецЕсли
              )
            И ГруппыДоступа.Ссылка В
              (
                ВЫБРАТЬ
                    ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа
                ИЗ
                    Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
                    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
                    ПО
                          СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь
                        И СоставыГруппПользователей.ГруппаПользователей = ГруппыДоступаПользователи.Пользователь
              )
    ГДЕ

// Безусловная выборка групп в иерархическом объекте метаданных (если нужно).
#Если "#Параметр(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)"
Показать
4. Medveedka 21.11.19 14:21 Сейчас в теме
(2) шаблон стандартный, никак его не меняла
5. Ганс 21.11.19 14:29 Сейчас в теме
(4) Уже понял, можете удалить, чтоб не захламлять топик)

Вообще вроде всё верно сделано, сейчас у себя гляну, где-то недавно сталкивался с РЛС)
6. Medveedka 21.11.19 14:32 Сейчас в теме
(5) спасибо. Если сможете, киньте примерно как вы делали настройку, попробую по вашему образу сделать
11. Medveedka 21.11.19 14:57 Сейчас в теме
(5) нет никаких зацепок?
12. Ганс 21.11.19 15:05 Сейчас в теме
(11) Если честно не нашёл.
Такой вопрос ,а у того пользователя. под кем тестируете нет других ролей, разрешающих ему видеть всё?
13. Medveedka 21.11.19 15:13 Сейчас в теме
(12) точно нет, я уверена. Там у него 3 или 4 роли всего) все проверены и доступ только у одной роли
39. user1118625 12 13.10.21 09:36 Сейчас в теме
Добрый день. Подскажите пожалуйста, а пробовали ли добавить РЛС на объекты, которые добавлены в расширение? Сделал, Сабж (РЛС) в котором описываю свои муки и пути решения, может чем-то сможете помочь?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот