Имя: Пароль:
1C
1С v8
RLS, sql и ошибки
0 TITKIT
 
11.02.16
15:15
День добрый гуру!
Помогите с вопросом взаимодействия RLS и SQL. Есть УПП, 1с 8.2.19.130, sql 11.0.2100.60 Операционная система 6.2.9200.
Есть роль разрешающая редактирование контрагентов и массив контрагентов, которые доступны данному пользователю. Он заполняется на момент старта системы и содержит группы, которые доступны. В данной роли права на чтение, изменение содержат инструкции
ТекущаяТаблица
ИЗ
    #ТекущаяТаблица КАК ТекущаяТаблица
Где
    Выбор Когда ТекущаяТаблица.ЭтоГруппа Тогда
        ТекущаяТаблица.Ссылка В (&ДоступныеКонтрагенты)
    Иначе
        ТекущаяТаблица.Родитель В (&ДоступныеКонтрагенты)
    Конец
Все работает. Пользователи видят в зависимости от подразделения каждый свои папки. Всё было бы хорошо, но потребовалось ограничить добавление в совместно видимые каждым подразделением папки. Т.е. появились два массива групп доступные на чтение и обычные.
в "добавление" добавил
ТекущаяТаблица
ИЗ
#ТекущаяТаблица КАК ТекущаяТаблица
Где
ТекущаяТаблица.Родитель В (&ДоступныеКонтрагенты)
И НЕ ТекущаяТаблица.Родитель В (&ДоступныеКонтрагентыНаЧтение).

И тут понеслось!!! У пользователей из одного конкретного подразделения вылетает ошибка SQL с руганью  на SDBL....
Пользователя перетаскиваешь в другое подразделение и всё нормально: куда положено может добавлять, куда не положено- не может! Самое главное, что всё тоже самое работает на ура в файловом варианте!
Полез в профайл и обнаружил, что в варианте, когда вылетает ошибка, идет инструкция SQL... THEN CASE WHEN (T2._ParentIDRRef IN
(SELECT
T3._INVALUELISTRRef AS INVALUELISTRRef
FROM #SDBL_TMP_1 T3 WITH(NOLOCK)...... в нормальном варианте THEN CASE WHEN ((T2._ParentIDRRef IN (@P1, и дальше куча переменных я так понял где содержатся ссылки на группы.
Можно конечно плюнуть на этот RLS и написать прямо в процедуре ПередЗаписью... но именно у этого подразделения имеются почему-то тормоза при работе с базой! Где копать даже не представляю(( Говорили мне как-то имеются у 1С проблемы RLS именно с этим SQL. Может кто сталкивался с этим?
1 ЧеловекДуши
 
11.02.16
15:18
Люди говариваю. РЛС, зло :)
А вычибучить реквизит в справочник. И использовать его для Правильного отбора?
2 rozer76
 
11.02.16
15:18
(0) попробуй это "И НЕ ТекущаяТаблица.Родитель В (&ДоступныеКонтрагентыНаЧтение)" переписать без НЕ
3 ЧеловекДуши
 
11.02.16
15:19
Попробуй поставить условие "ИЛИ" и скобочки
4 ЧеловекДуши
 
11.02.16
15:20
(2) Какая разница?
Автору нужны группы и реквизиты, которые должны быть видимы.
А для определённых ролей и даже доступны на запись.
5 TITKIT
 
11.02.16
15:33
(1) реквизит не вариант, поскольку проще немного в отчетах использовать "Разрешенные"
(2) Мне же нужно, чтобы в одну группу можно было записывать, а другая только на чтение
Я не понял почему зависимость от подразделения и от доступных папок((( почему эта падла корректно работает в файловом варианте!(
6 mehfk
 
11.02.16
15:36
Что-то не вяжется, выборка из временной таблицы вроде как должна соответствовать когда идет условие "В ИЕРАРХИИ".
7 TITKIT
 
11.02.16
15:38
(6) в иерархи не положено использовать в RLS. Поэтому перечень групп создается запросом, а потом через фиксированных массив передается в качестве параметр сеанса
8 Franchiser
 
гуру
11.02.16
15:40
возможно это связано с количеством родителей: в одном случае их много - создается ВТ, в другом случае мало и сделано через переменные
9 Franchiser
 
гуру
11.02.16
15:48
по ходу у тебя создается огромная временная таблица со всеми элементами-контрагентов, входящих в определенные группы и под нее не хватает места
10 mehfk
 
11.02.16
15:49
&ДоступныеКонтрагентыНаЧтение передается как массив, список значений или таблица значений?
11 mehfk
 
11.02.16
15:51
Сторно (10)
12 TITKIT
 
11.02.16
15:52
(8) переменных 103 штуки, в первом случае же групп тоже примерно такое же количество 168((
13 TITKIT
 
11.02.16
15:54
(9) Создается массив групп( в первом случае 168 элементов, во втором случае 103. При добавлении анализируется же входит ли новый с родителем в массив.
(10) обе переменные как фиксированный массив
14 Franchiser
 
гуру
11.02.16
16:26
(13) для тестирования можно уменьшить количество групп со 168 до 100
15 TITKIT
 
11.02.16
16:44
(13) Вот это прикол!!!! Это просто финиш какой-то! Из-за этого дела.... И какой же велосипед придумывать?!(((
16 mehfk
 
11.02.16
16:46
А полный текст ошибки все-таки какой?
17 Fragster
 
гуру
11.02.16
16:48
надо сделать так, чтобы в доступных на чтение были все, которые доступны на добавление, в доступных на добавление - только те, которые на добавление/изменение. тогда шаблон останется без изменений, просто в шаблоне на чтение будет использоваться другой параметр сеанса.
18 Fragster
 
гуру
11.02.16
16:49
чтобы в доступных на чтение были все, которые доступны на добавление и на чтение
19 Serginio1
 
11.02.16
16:52
И  ТекущаяТаблица.Родитель Not IN (&ДоступныеКонтрагентыНаЧтение)"
20 Fragster
 
гуру
11.02.16
16:53
(19) до свидания, производительность...
21 TITKIT
 
11.02.16
16:59
(16) Ошибка СУБД
Microsoft sql server native client 11.0: Недопустимое имя объекта #SDBL_TMP_1". hresault=80040E37, sqlsrvr:SQLState = 1,severity = 10, native = 208, line = 1
22 TITKIT
 
11.02.16
17:01
Это получается, что и тормоза у этого подразделения из-за количества в массиве((( Эта же падла везде проверяет в отчетах, документах, справочниках на доступность и разрешенность.
23 Franchiser
 
гуру
11.02.16
17:19
(22) на счет количества - это всего лишь предположение, могут быть еще какие-нибудь зациклинности