Имя: Пароль:
1C
1С v8
У пользователя недостаточно прав
,
0 TSRh
 
05.12.19
12:28
Здравствуйте всем!

ЗУП 3.1
8.3.13.1690

Профиль пользователя - "Кадровик"
Роль "Добавление изменение штатного расписания" - вкл
RLS вкл
Ограничение по Подразделениям - вкл, нужное указано
В ТЖ событий QERR нет

Внимание, вопрос:
{Справочник.ШтатноеРасписание.Форма.ФормаЭлемента.Форма(3497)}: Ошибка при вызове метода контекста (Записать)
    ИначеЕсли Записать(ПараметрыЗаписи) И ДополнительныеПараметры.ЗакрытьПослеЗаписи Тогда
по причине:
У пользователя недостаточно прав на исполнение операции над базой данных.

Буду очень благодарен за наводку, где и как же увидеть то самое место?
1 ДенисЧ
 
05.12.19
12:33
В журнале регистрации обычно такое видно
2 catena
 
05.12.19
12:33
В ЖР возможно написано каких прав и на какой объект не хватает.
3 TSRh
 
05.12.19
12:35
Ну если я до ТЖ докатился, но очевидно в ЖР ничего внятного, кроме того же самого, нет )
4 TSRh
 
05.12.19
12:37
Забыл добавить:
В расширениях ничего про Справочник.ШтатноеРасписание нету
5 catena
 
05.12.19
12:37
(3)А в ЖР включена регистрация всех событий?
6 ДенисЧ
 
05.12.19
12:38
(3) ТЖ и ограничения прав мало связаны...
7 TSRh
 
05.12.19
12:40
(5) пардон за дремучесть, а как это проверить ?
8 ДенисЧ
 
05.12.19
12:41
(7) В конфигураторе Администрирование - настройка журнала регистрации
9 TSRh
 
05.12.19
12:41
(6)

https://its.1c.ru/db/v8313doc#bookmark:adm:TI000000396
● QERR ‑ события, связанные с обнаружением ошибок компиляции запроса или ограничения на уровне записей и полей базы данных.
10 TSRh
 
05.12.19
12:43
(8) спасибо, совсем забыл про этот пункт. успел даже обработку найти, которая программно настраивает


да, регистрация всех событий включена
11 TSRh
 
05.12.19
12:44
(10) Событие то в ЖР есть, куда ж без него
только толку

Справочник.ШтатноеРасписание
Действие: Добавление
Доступ: Отказ в доступе
12 Kigo_Kigo
 
05.12.19
12:46
Удачи в отлове этой ошибки,
"У пользователя недостаточно прав на исполнение операции над базой данных."

я так ее и не отловил,Во всех ТЖ,ЖР и так далее пусто,все события вкл, если отловишь и решишь, как с ней бороться -отпишись
13 catena
 
05.12.19
12:47
(11)Ну вот, осталось проверить роли пользователя на предмет Добавления в данный справочник.
14 ДенисЧ
 
05.12.19
12:50
(11) "Справочник.ШтатноеРасписание
Действие: Добавление
Доступ: Отказ в доступе"

Ты не русский? ))Не понимаешь, что тут написано?
15 piter3
 
05.12.19
12:50
(12) В чем подвох?
16 Kigo_Kigo
 
05.12.19
12:57
(15) не нашел, пока отказался от РЛС, весь прикол в том что, работало и тут раз - нате, распишитесь
Не могу отловить "у пользователя недостаточно прав на исполнение операции над базой данны"
17 Kigo_Kigo
 
05.12.19
12:58
(11) а, ну тут то есть над чем подумать, мне такого благо не снизошло
18 TSRh
 
05.12.19
13:02
(13) см (0)

(14) вы не русский, см (0)

(12) ок
19 Putrina
 
05.12.19
13:09
подвох есть!
20 catena
 
05.12.19
13:11
(18)И что? Вытаскиваем шаблон РЛС и смотрим.
21 ДенисЧ
 
05.12.19
13:11
(18) Ты добавил роль. А есть ли в этой роли право на изменение справочника? Это проверил? А РЛС проверил?
22 TSRh
 
05.12.19
13:19
(20) (21) с этого места можно поподробнее, пжл

в шаблоне: Прочие поля

#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
#ДляОбъекта("")
#Иначе
#ПоЗначениямРасширенный( "Справочник.ШтатноеРасписание","Добавление","",
"ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПодчиненностьПодразделенийОрганизаций КАК Т2
ПО Т2.Подразделение = Т.Подразделение",
"",
"ПодразделенияОрганизаций","Т2.ВышестоящееПодразделение","И",
"Организации","Т.Владелец","",
"","","","","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","" )
#КонецЕсли


и как эту байду проверить ??
23 TSRh
 
05.12.19
13:20
(22) На регистр право "Чтение" у роли стоит
24 pechkin
 
05.12.19
13:21
переходи на ОграничениеДоступаНаУровнеЗаписейУниверсально
25 catena
 
05.12.19
13:22
(22)Там есть закладка с шаблонами, в них запросы.
26 TSRh
 
05.12.19
13:28
(25) Ну я оттуда его и взял
27 catena
 
05.12.19
13:29
(26)не правда
28 catena
 
05.12.19
13:30
(26)Ты взял с закладки "Права". ПоЗначениямРасширенный - это шаблон, он на другой закладке.
29 drcrasher
 
05.12.19
13:31
(0) запустить конфигуратор под проблемным юзером, выставить остановку по ошибке, запустить отладку,..., профит
30 TSRh
 
05.12.19
13:48
31 TSRh
 
05.12.19
13:48
(29) это фиаско
32 catena
 
05.12.19
13:51
https://i111.fastpic.ru/big/2019/1205/36/_2f41fab4572708c939cf5f68b3bf8f36.png


ПоЗначениямРасширенный - Оно прям посередине картинки
33 catena
 
05.12.19
13:52
Только роль открой нужную, а не по всем шаблонам
34 TSRh
 
05.12.19
13:56
(33) Меня сейчас вырвет прямо на монитор

// ПоЗначениямРасширенный(Таблица, -, Модификатор, ПрисоединяемыеТаблицы, О, В1,П1,О1, В2,П2,О2,..., В(n), П(n), О(n)).
// № параметра:                 1, 2,           3,                     4, 5,  6, 7, 8,  9,10,11,...,3+n*3,4+n*3,5+n*3.
// Читается так: "ограничение доступа по значениям расширенный".
// Параметры:
//     Таблица   - Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг".
//     Модификатор - изменяет шаблон.
//                 1-й модификатор - строка "НеОграничиватьДоступКГруппам" указывает
//                  безусловно выбирать группы иерархического справочника.
//                 Других модификаторов в этой версии шаблона не предусмотрено.
//     ПрисоединяемыеТаблицы - текст присоедиения дополнительных таблиц на языке запросов, например,
//                 "ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет.ОплатаПоставщикам КАК Т1
//                  ПО Т.Ссылка = Т1.Ссылка".
//                 Присоединение позволяет указать поля таблицы ОплатаПоставщикам, как поля основной таблицы
//                  для проверки их значений, как значений основной таблицы.
//                 Следует помнить, что при размножении строк в результате соединения, достаточно чтобы
//                  всего одна строка прошла условия проверки, т.е. результаты проверки строк объединяются по "ИЛИ".
//     О         - Начальные скобки "(".
//     В(n)      - Вид доступа - имя вида доступа, например, "Организации". Для полей составного типа, с целью повышения
//                  производительности, лучше указать несколько имен, например, "Организации,ГруппыФизическихЛиц",
//                  чем использовать несколько блоков параметров, с одним и тем же именем поля.
//                  Специальные виды доступа "Условие", "НастройкиПрав", "ПравоЧтения", "ПравоИзменения",
//                  "ПравоЧтенияПоИдентификатору", "ПравоИзмененияПоИдентификатору" можно использовать только отдельно.
//                 Когда В(n) = "Условие" (или ""), тогда П(n) содержит строку условия на языке запросов, например
//                  "Т.Автор = &АвторизованныйПользователь",
//                  "ТИПЗНАЧЕНИЯ(Т.Владелец) = ТИП(Справочник.Организации)", где Т - псевдоним текущей таблицы.
//                 Когда В(n) = "ПравоЧтения" Или "ПравоИзменения",
//                  выполняется проверка наличия права на таблицу значения Т.П(n).
//                 Когда В(n) = "ПравоЧтенияПоИдентификатору" или "ПравоИзмененияПоИдентификатору",
//                  выполняется проверка наличия права на таблицу по идентификатору в значении Т.П(n).
//     П(n)      - Поле проверяемого значения с псевдонимом, например "Т.Организация",
//                 кроме случая В(n) = "Условие" (или "").
//     О(n)      - Логические операции "И", "ИЛИ" в сочетании с скобками "(", ")".
//  Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но
// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального.
//  Шаблон имеет структуру:
//     <Общая часть условий> <Условие по группе параметров 1> И/ИЛИ <Условие по группе параметров 2> И/ИЛИ ... <Условие по группе параметров(n)>
//  Пример:
//      ПоЗначениямРасширенный("Документ.ПеремещениеТоваров", "", "",
//      "",
//      "",
//      "Организации","Т.Организация","И(",
//      "Склады","Т.СкладОтправитель","ИЛИ",
//      "Склады","Т.СкладПолучатель",")", "","","", ...)

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

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

#Иначе

// Проверка правильности параметра Право.
#Если Не ("#Параметр(2)" = "Чтение"    Или "#Параметр(2)" = "Добавление" Или
          "#Параметр(2)" = "Изменение" Или "#Параметр(2)" = "Удаление"   Или "#Параметр(2)" = "")
      Или #ИмяТекущегоПраваДоступа <> "Чтение" И "#Параметр(2)"  = "Чтение"
      Или #ИмяТекущегоПраваДоступа  = "Чтение" И "#Параметр(2)" <> "Чтение" И "#Параметр(2)" <> "" #Тогда
    // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
    НеверноеПраво: #Параметр(2)
#КонецЕсли

// Проверка правильности параметра ИмяТаблицы.
#Если "#Параметр(1)" <> #ИмяТекущейТаблицы #Тогда
    // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
    НеверноеИмяТекущейТаблицы: "#Параметр(1)"
#КонецЕсли

// Проверка правильности параметра Модификатор.
#Если Не ("#Параметр(3)" = "НеОграничиватьДоступКГруппам" Или "#Параметр(3)" = "") #Тогда
    // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
    НеверныйМодификатор: #Параметр(3)
#КонецЕсли

// Общая проверка использования ограничений доступа на уровне записей и
// проверка использования хотя бы одного ограничения из указанных видов доступа.
#Если Не
     (  Истина
      И ("#Параметр(6)" = "" И "#Параметр(7)" = ""
         Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
           И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(6),"))
      И ("#Параметр(9)" = "" И "#Параметр(10)" = ""
         Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
           И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(9),"))
      И ("#Параметр(12)" = "" И "#Параметр(13)" = ""
         Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
           И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(12),"))
      И ("#Параметр(15)" = "" И "#Параметр(16)" = ""
         Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
           И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(15),"))
      И ("#Параметр(18)" = "" И "#Параметр(19)" = ""
         Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
           И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(18),"))
      И ("#Параметр(21)" = "" И "#Параметр(22)" = ""
         Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
           И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(21),"))
      И ("#Параметр(24)" = "" И "#Параметр(25)" = ""
         Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
           И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(24),"))
      И ("#Параметр(27)" = "" И "#Параметр(28)" = ""
         Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
           И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(27),"))
      И ("#Параметр(30)" = "" И "#Параметр(31)" = ""
         Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
           И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(30),"))
      И ("#Параметр(33)" = "" И "#Параметр(34)" = ""
         Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
           И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(33),"))
      И ("#Параметр(36)" = "" И "#Параметр(37)" = ""
         Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
           И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(36),"))
      И ("#Параметр(39)" = "" И "#Параметр(40)" = ""
         Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
           И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(39),"))
      И ("#Параметр(42)" = "" И "#Параметр(43)" = ""
         Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
           И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(42),"))
      И ("#Параметр(45)" = "" И "#Параметр(46)" = ""
         Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
           И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(45),"))
      И ("#Параметр(48)" = "" И "#Параметр(49)" = ""
         Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
           И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(48),"))
      И ("#Параметр(51)" = "" И "#Параметр(52)" = ""
         Или Не &ОграничениеДоступаНаУровнеЗаписейИспользуется
           И Не СтрСодержит(",Объект, ,ПравоЧтения,ПравоИзменения,ПравоЧтенияПоИдентификатору,ПравоИзмененияПоИдентификатору,", ",#Параметр(51),"))
     ) #Тогда

Т ИЗ Т // Т - псевдоним текущей таблицы (выбран коротким, чтобы сократить количество символов в тексте параметра-условия на языке запросов).

// Присоединяемые таблицы к проверяемой строке текущей таблицы "Т".
#Параметр(4)

ГДЕ

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

// Безусловная выборка групп в иерархическом объекте метаданных (если нужно).
#Если "#Параметр(3)" = "НеОграничиватьДоступКГруппам" #Тогда
    Т.ЭтоГруппа ИЛИ
#КонецЕсли

  ( // Поиск значений заданных полей в разрешенных значениях групп доступа (пользователей).

    #Параметр(5)  // [([(][(]...] 0-n открывающихся скобок.

//// Проверка значения поля группы параметров 1.
#Если &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(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), НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО
#КонецЕсли

    #Параметр(8)  // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.

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

    #Параметр(11)  // [)[)][)]...] [ИЛИ|И] [([(][(]...] оператор И/ИЛИ с/без скобок.

//// Проверка значения поля группы параметров 3.
#Если "#Параметр(12)" = "" И "#Параметр(13)" = "" #Тогда
    // Группа параметров не используется.
#ИначеЕсли &ОграничениеДоступаНаУровнеЗаписейИспользуется И ("#Параметр(12)" = "Условие" Или "#Параметр(12)" = "") #Тогда
    // Когда имя вида доступа "Условие" (или ""), тогда вместо имени поля задано условие.
     ( #Параметр(13) )
#ИначеЕсли "#Параметр(12)" = "ПравоЧтения" Или "#Параметр(12)" = "ПравоИзменения" #Тогда
     #Параметр(13) <> НЕОПРЕДЕЛЕНО
    И ИСТИНА В
     (    // Проверка права пользователя на таблицу Значения, установленного в поле.
        ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
        ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
        ГДЕ
              ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
            И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПрава.ТипТаблицы) = ТИПЗНАЧЕНИЯ(#Параметр(13))
        #Если Не "#Параметр(12)" = "ПравоЧтения" #Тогда
            И ТаблицыГруппДоступаПроверкаПрава.Изменение
        #КонецЕсли
     )
#ИначеЕсли "#Параметр(12)" = "ПравоЧтенияПоИдентификатору" Или "#Параметр(12)" = "ПравоИзмененияПоИдентификатору" #Тогда
      ИСТИНА В
     (    // Проверка права пользователя на таблицу, идентификатор которой указан в Значении, установленном в поле.
        ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
        ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПрава
        ГДЕ
              ТаблицыГруппДоступаПроверкаПрава.ГруппаДоступа = ГруппыДоступа.Ссылка
            И ТаблицыГруппДоступаПроверкаПрава.Таблица = #Параметр(13)
        #Если Не "#Параметр(12)" = "ПравоЧтенияПоИдентификатору" #Тогда
            И ТаблицыГруппДоступаПроверкаПрава.Изменение
        #КонецЕсли
     )
#ИначеЕсли Не &ОграничениеДоступаНаУровнеЗаписейИспользуется #Тогда
    ИСТИНА // Группа параметров отключена.
#ИначеЕсли "#Параметр(12)" = "НастройкиПрав" #Тогда
    
     (
        ИСТИНА В // Проверка, что пользователю или какой-нибудь группе пользователя право разрешено
            (
            ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
            ИЗ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
                ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
                ПО
                      НаследованиеНастроек.Объект = #Параметр(13)
                    И НастройкиПрав.Объ
35 TSRh
 
05.12.19
13:57
(33) (34) как ЭТО можно отладить, добрый человек ?? )
36 singlych
 
05.12.19
14:37
Ну как-как, смотришь значения параметров сеанса, подставляешь параметры из ограничения, раскрываешь Если, и вперед, в консоль...
37 singlych
 
05.12.19
14:38
Потом выясняется какая-нибудь очевидная фигня, что юзеру тупо недоступно какое-нибудь подразделение или че-то типа того.
38 TSRh
 
05.12.19
17:04
(37) подразделения проверил
где-то в другом месте затык, третий день уже бьюсь...
39 TSRh
 
05.12.19
17:16
ещё смущает, что в ТЖ нет записей QERR, значит RLS по идее не причём
40 TSRh
 
05.12.19
17:56
Фигня выяснилась. Но как она работает я так и не понял (
41 singlych
 
06.12.19
17:38
(40) а че было-то?
42 TSRh
 
12.12.19
12:45
(41) В профиле доступа не было "Добавить изменить штатное расписание", хотя в роли было. Не пойму, как профиль применяется. Видимо при запуске меняет роли ?