Имя: Пароль:
1C
1С v8
Оптимизация запроса
0 Лялечка
 
21.07.11
12:33
Добрый день! Я конечно понимаю, что тема обсуждалась на форуме уже ни раз, но все же.
Использую в конфигурации несколько наборов прав, MS SQL. Ограничен доступ на справочник "Контрагенты". Пользователю назначаю несколько ролей и при открытии справочника вылезает ошибка "слишком много таблиц.возможно 256", в принципе все логично, но права ограничивать как-то надо. Возможно ли оптимизировать данный запрос или нет? Заранее спасибо.

##Если &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей ##Тогда
ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица
   ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
       СоставГруппы.Ссылка КАК ГруппаПользователей
   ИЗ
       Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы
   ГДЕ
       СоставГруппы.Пользователь = &ТекущийПользователь
           ИЛИ СоставГруппы.Пользователь.Подразделение.Родитель = &ТекущееПодразделение
           ИЛИ СоставГруппы.Пользователь.Подразделение.Родитель.Родитель = &ТекущееПодразделение
           ИЛИ СоставГруппы.Пользователь.Подразделение.Родитель.Родитель.Родитель = &ТекущееПодразделение) КАК ГруппыПользователей
   ПО (&ИспользоватьОграниченияПравДоступаНаУровнеЗаписей)
ГДЕ (&ИспользоватьОграниченияПравДоступаНаУровнеЗаписей = ЛОЖЬ #Параметр(3)
           ИЛИ (НЕ 1 В
                   (ВЫБРАТЬ ПЕРВЫЕ 1
                       1 КАК ПолеОтбора
                   ИЗ
                       РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа
                   ГДЕ
                       НазначениеВидовОбъектовДоступа.ГруппаПользователей = ГруппыПользователей.ГруппаПользователей
                       И ВЫБОР
                           КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.#Параметр(1))
                               ТОГДА ВЫБОР
                                       КОГДА 1 В
                                               (ВЫБРАТЬ ПЕРВЫЕ 1
                                                   1
                                               ИЗ
                                                   РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
                                               ГДЕ
                                                   НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.#Параметр(2)
                                                   И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.#Параметр(1))
                                                   И (НастройкиПравДоступаПользователей.Пользователь = НазначениеВидовОбъектовДоступа.ГруппаПользователей
                                                       ИЛИ НастройкиПравДоступаПользователей.Пользователь = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи)))
                                           ТОГДА ИСТИНА        
                                       ИНАЧЕ ЛОЖЬ
                                     КОНЕЦ
                           ИНАЧЕ ИСТИНА
                       КОНЕЦ = ЛОЖЬ)
                       И (1 В
                           (ВЫБРАТЬ
                                   1 КАК КатегорииОбъектов
                               ИЗ
                                   РегистрСведений.КатегорииОбъектов КАК КатегорииОбъектов
                               ГДЕ КатегорииОбъектов.Категория.Наименование = "Поставщики"
                                   И ТекущаяТаблица.Ссылка = КатегорииОбъектов.Объект.Ссылка)))
                       И НЕ ГруппыПользователей.ГруппаПользователей ЕСТЬ NULL)
                                               
##КонецЕсли
1 Лялечка
 
22.07.11
10:30
Люди, ну неужели никто не поможет?:(
2 bar0n0
 
22.07.11
10:36
Скорее всего надо ограничить вот этот тип КатегорииОбъектов.Объект на те виды обектов которые реально используются.
3 luckyluke
 
22.07.11
10:37
КатегорииОбъектов.Категория - составной тип?
4 luckyluke
 
22.07.11
10:39
а! вот так "И ТекущаяТаблица.Ссылка = КатегорииОбъектов.Объект" попробуй.
5 Лялечка
 
22.07.11
11:57
(3)Нет, КатегорииОбъектов.Категория - СправочникСсылка, а вот КатегорииОбъектов.Объект как раз составной
6 luckyluke
 
22.07.11
11:59
(5) убери после вот этого "КатегорииОбъектов.Объект" вот это ".Ссылка"
7 Лялечка
 
22.07.11
12:04
Убрала, так вроде лучше работает, хотя бы ошибку не выдает:) Спасибо огромное:) только вот интересно, если я еще один набор такой сделаю, то не вылезет ли она снова, надо попробовать. Кроме ссылки этой больше нечего убрать?
8 Лялечка
 
02.08.11
14:59
Добрый день! В продолжение темы об этом несчастном запросе. Работает правильно, но очень долго:( Может есть какие-нибудь способы ускорить его работу?
9 Axel2009
 
02.08.11
15:02
(8) отказаться?
10 Fragster
 
гуру
02.08.11
15:05
ТекущаяТаблица.Ссылка = КатегорииОбъектов.Объект.Ссылка
убрано второе .Ссылка?

СоставГруппы.Пользователь или
СоставГруппы.Пользователь.Подраздление - составного типа?
11 Fragster
 
гуру
02.08.11
15:06
да и вообще все эти Или .Родитель не нравятся мне. может лучше В ИЕРАРХИИ (&ТекущееПодразделение)?
12 Лялечка
 
02.08.11
15:08
(10) да, получилось ТекущаяТаблица.Ссылка = КатегорииОбъектов.Объект
13 Лялечка
 
02.08.11
15:09
(10) нет подразделение не составного типа
14 Лялечка
 
02.08.11
15:14
(9) может быть и отказаться, тогда как ограничить права пользователей
15 Лялечка
 
02.08.11
15:19
(11) это RLS, по-моему, там нельзя использовать В ИЕРАРХИИ или я ошибаюсь?
16 Fragster
 
гуру
02.08.11
15:23
(15) а, ну да. тогда остается пересмотреть раздачу прав :)
попробуй свой запрос в консольке выполнить

OFF:
а почему @ГосподинПЖ на sql.ru заблокирован?
17 Лялечка
 
02.08.11
15:26
(16) >>OFF:
а почему @ГосподинПЖ на sql.ru заблокирован?
это что?
18 Лялечка
 
02.08.11
15:27
(16) ну выполню я его в консольке и что я должна увидеть?
19 Fragster
 
гуру
02.08.11
15:27
(17) это оффтопик. просто наткнулся на его пост на sql.кг по этой теме, а он там забанен
20 Fragster
 
гуру
02.08.11
15:28
(18) что он тупит. а потом - потихоньку бить на куски и искать "крайнего". может, у тебя там индекса где нет
21 Лялечка
 
02.08.11
15:30
ох, спасибо :( попробую
22 Лялечка
 
02.08.11
15:32
Теперь бы еще в консоли его выполнить, ни разу этого не делала, там же надо половину заменить?
23 Fragster
 
гуру
02.08.11
15:33
(22) ну да
24 Axel2009
 
02.08.11
15:37
(22) может быть при включении технологического журнала покажется полный запрос.. но я не пробовал =)
25 Лялечка
 
02.08.11
16:10
(20) Я конечно понимаю, что задаю тупые вопросы, но я с RLS не сталкивалась ни разу. Я выполнила запрос в консоли. И как теперь проверить где есть индексы, а где их нет.
26 Fragster
 
гуру
02.08.11
16:15
начиная с самого вложенного запроса выполнять по кускам... в определенный момент будет резкое замедление... тут-то и станет понятно
27 Axel2009
 
02.08.11
16:17
(26) + для этого вполне подойдет консоль запросов (Инструменты разработчиков). там есть встроенное разбитие на дерево запроса и выполнение любой части с замером
28 Лялечка
 
02.08.11
16:47
Спасибо большое:)
29 Лялечка
 
02.08.11
16:48
(27) консоль запросов (ИР) скачала, но вот что-то дерево она не создает:(
30 Axel2009
 
02.08.11
16:49
(29) там нужно включить режим дерева запросов (6 кнопка справа)
31 Лялечка
 
02.08.11
17:03
(30) {Форма.ирПлатформа.Форма(164)}: Ошибка при вызове метода контекста (ПолучитьМакет)
           ПолучитьМакет(ИмяКомпоненты).Записать(ФайлКомпоненты.ПолноеИмя);
32 Лялечка
 
10.08.11
14:19
Добрый день! В продолжение темы. Очень медленно работает запрос. Проверила в консоли запросов, тормозит кусок
ВЫБРАТЬ
                                   1 КАК КатегорииОбъектов
                               ИЗ
                                   РегистрСведений.КатегорииОбъектов КАК КатегорииОбъектов
                               ГДЕ КатегорииОбъектов.Категория.Наименование = "Поставщики"
                                   И ТекущаяТаблица.Ссылка = КатегорииОбъектов.Объект.Ссылка)
Может можно его как-нибудь изменить. Заранее благодарна.
33 zak555
 
10.08.11
14:21
КатегорииОбъектов.Категория.Наименование = "Поставщики"


убрать
34 Fragster
 
гуру
10.08.11
14:23
.Объект.Ссылка - нафиг,
(33)+100, заменить на ссылку
35 Fragster
 
гуру
10.08.11
14:24
а фоточка будет в личной карточке?
36 Лялечка
 
10.08.11
14:33
(33) Заменила на КатегорииОбъектов.Категория = ЗНАЧЕНИЕ(Справочник.КатегорииОбъектов.Постащики), .объект.Ссылка тоже заменила на .Объект (извиняюсь давно сделала,скопировала просто старый вариант). Толку ноль.
Как заментить КатегорииОбъектов.Категория.Наименование = "Поставщики" еще?
37 Лялечка
 
10.08.11
14:33
(35) это как всегда принципиально?:)
38 Fragster
 
гуру
10.08.11
14:35
(36) Замени "Выбрать 1" На "выбрать первые 1 1"
добавь индекс по Категория в РС.

(37) ага
39 Fragster
 
гуру
10.08.11
14:36
ну и ниндекс по объекту, если нет (хотя должен быть)
40 Лялечка
 
10.08.11
14:47
Индекс по категории добавила, "выбрать" уже тоже заменила. Все из-за этого объекта наверное, там тип данных составной и я не знаю как его проиндексировать:( Получилось вот так, но работает все равно долго:(
##Если &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей ##Тогда
ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица
   ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
       СоставГруппы.Ссылка КАК ГруппаПользователей
   ИЗ
       Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы
   ГДЕ
       СоставГруппы.Пользователь = &ТекущийПользователь
           ИЛИ СоставГруппы.Пользователь.Подразделение.Родитель = &ТекущееПодразделение
           ИЛИ СоставГруппы.Пользователь.Подразделение.Родитель.Родитель = &ТекущееПодразделение
           ИЛИ СоставГруппы.Пользователь.Подразделение.Родитель.Родитель.Родитель = &ТекущееПодразделение) КАК ГруппыПользователей
   ПО (&ИспользоватьОграниченияПравДоступаНаУровнеЗаписей)
ГДЕ (&ИспользоватьОграниченияПравДоступаНаУровнеЗаписей = ЛОЖЬ #Параметр(3)
           ИЛИ (НЕ 1 В
                   (ВЫБРАТЬ ПЕРВЫЕ 1
                       1 КАК ПолеОтбора
                   ИЗ
                       РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа
                   ГДЕ
                       НазначениеВидовОбъектовДоступа.ГруппаПользователей = ГруппыПользователей.ГруппаПользователей
                       И ВЫБОР
                           КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.#Параметр(1))
                               ТОГДА ВЫБОР
                                       КОГДА 1 В
                                               (ВЫБРАТЬ ПЕРВЫЕ 1
                                                   1
                                               ИЗ
                                                   РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
                                               ГДЕ
                                                   НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.#Параметр(2)
                                                   И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.#Параметр(1))
                                                   И (НастройкиПравДоступаПользователей.Пользователь = НазначениеВидовОбъектовДоступа.ГруппаПользователей
                                                       ИЛИ НастройкиПравДоступаПользователей.Пользователь = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи)))
                                           ТОГДА ИСТИНА        
                                       ИНАЧЕ ЛОЖЬ
                                     КОНЕЦ
                           ИНАЧЕ ИСТИНА
                       КОНЕЦ = ЛОЖЬ)
                       И (1 В
                           (ВЫБРАТЬ ПЕРВЫЕ 1
                                   1 КАК КатегорииОбъектов
                               ИЗ
                                   РегистрСведений.КатегорииОбъектов КАК КатегорииОбъектов
                               ГДЕ КатегорииОбъектов.Категория = ЗНАЧЕНИЕ(Справочник.КатегорииОбъектов.Поставщик)
                                   И ТекущаяТаблица.Ссылка = КатегорииОбъектов.Объект)))
                       И НЕ ГруппыПользователей.ГруппаПользователей ЕСТЬ NULL)
                                               
##КонецЕсли
41 Лялечка
 
10.08.11
14:47
(38) ну раз так принципиально:)
42 zak555
 
10.08.11
15:02
(41) в личке не ты
43 Лялечка
 
10.08.11
15:04
(42) Чего? А кто это интересно?:) И почему не я?:)
44 Лялечка
 
10.08.11
15:07
(42)Очень даже я;)
45 Fragster
 
гуру
10.08.11
15:08
а точно в (40) тормозит именно этот кусок?
46 Fragster
 
гуру
10.08.11
15:09
потому как на файловой базе вот это круто тормозит:         СоставГруппы.Пользователь = &ТекущийПользователь
           ИЛИ СоставГруппы.Пользователь.Подразделение.Родитель = &ТекущееПодразделение
           ИЛИ СоставГруппы.Пользователь.Подразделение.Родитель.Родитель = &ТекущееПодразделение
           ИЛИ СоставГруппы.Пользователь.Подразделение.Родитель.Родитель.Родитель = &ТекущееПодразделение) КАК
47 Fragster
 
гуру
10.08.11
15:09
есть решение, но много строк
48 Лялечка
 
10.08.11
15:11
(47) Если мой кусок убрать, то все прекрасно работает, а вот с ним нет:(
49 Лялечка
 
10.08.11
15:12
(47) какое решение?
50 Fragster
 
гуру
10.08.11
15:13
ВЫБРАТЬ
   СоставГруппы.Ссылка КАК ГруппаПользователей
ИЗ
   Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы
ГДЕ
   СоставГруппы.Пользователь = &ТекущийПользователь
Объединить все
ВЫБРАТЬ
   СоставГруппы.Ссылка КАК ГруппаПользователей
ИЗ
   Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы
ГДЕ
   СоставГруппы.Пользователь.Подразделение.Родитель = &ТекущееПодразделение
Объединить все
ВЫБРАТЬ
   СоставГруппы.Ссылка КАК ГруппаПользователей
ИЗ
   Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы
ГДЕ
   СоставГруппы.Пользователь.Подразделение.Родитель.Родитель = &ТекущееПодразделение
.....
51 Лялечка
 
10.08.11
15:15
(50) Быстрее думаешь будет? Ща попробую, спасибо
52 Fragster
 
гуру
10.08.11
15:15
(51) на файолвой - да
53 Aleks555
 
10.08.11
15:18
(36) В 34 говорилось о том чтобы заменить на ссылку, а ты пишешь, что поменяла на: "объект.Ссылка тоже заменила на .Объект"
54 Лялечка
 
10.08.11
15:23
(53) я ошиблась, скопировала кусок кода не оттуда.
55 Лялечка
 
10.08.11
15:24
(52) работает немного быстрее, но все-таки тупит:(
56 Fragster
 
гуру
10.08.11
15:27
опять же для файловой (на скуле нет разницы)

вместо

НастройкиПравДоступаПользователей.Пользователь = НазначениеВидовОбъектовДоступа.ГруппаПользователей
                                                       ИЛИ НастройкиПравДоступаПользователей.Пользователь = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи

написать

НастройкиПравДоступаПользователей.Пользователь В (НазначениеВидовОбъектовДоступа.ГруппаПользователей,ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи)
57 Nutsiiam
 
10.08.11
15:27
в (46) человек тебе показал кусок, который тебе для начала нужно переписать. Если ты заточилась в рлс по ИЕРАРХИЮ, то значит ограничение ты спроектировала не правильно.

Самый простой способ у тебя: в подразделение добавить реквизит и пролить его неким разделителем, на равенство которого уже сравнивать в ГДЕ.
58 Лялечка
 
10.08.11
15:33
(57) не поняла.
ограничение по Иерархии не я писала
59 Лялечка
 
10.08.11
15:34
(56) у меня не файловая
60 Nutsiiam
 
10.08.11
15:36
(58) ты заточилась на иерархию - раз родителей несколько раз проверяешь. Если бы был оператор в иерархии - то ты бы его использовала ;) А это не правильно, и из-за этого все костыли.
61 Лялечка
 
10.08.11
15:36
(61) мне обязательно надо проверять иерархию
62 Nutsiiam
 
10.08.11
15:39
(61) я тебе говорю, раз все настолько медленно что ппц, нужно упростить твой запрос или до простого ГДЕ = или до простого иннер джойна, который все посечет.

Вот такие строки у тебя  СоставГруппы.Пользователь.Подразделение.Родитель.Родитель.Родитель разворачиватся в джойны-переджойны-переджойны =)

А типовая конфа - УТ чтоль?
63 Aleks555
 
10.08.11
15:41
А что такое "ТекущееПодразделение", как оно с правами соотносится?
64 Fragster
 
гуру
10.08.11
15:42
(63) это параметр сеанса, судя по всему
65 Лялечка
 
10.08.11
15:43
(62) Нет, не УТ. Я не знаю как упростить запрос, поэтому и спрашиваю.
66 Лялечка
 
10.08.11
15:43
(63) да, параметр сеанса
67 Nutsiiam
 
10.08.11
15:43
я так полагаю это подразделение, в котором сидит пользователь. И именно по верхней группе, нужно фильтрить контрагентов :) Т.е. типа - этому подразделению видны эти чуваки, этому - эти.
68 Fragster
 
гуру
10.08.11
15:45
нужно сделать денормализацию - РС со всеми подразделеинями пользователя, ПриЗаписи обновлять....
69 Лялечка
 
10.08.11
15:47
(67) Проверка такая: если пользователь по иерархии выше, то он видит всех контрагентов, которых видят подчиненные, и в то же время видит контрагентов определенной категории
70 Лялечка
 
10.08.11
15:49
(68) это как?
71 Nutsiiam
 
10.08.11
15:51
а самый низжий пользователь что видит - только контрагентов определенной категории?
72 Aleks555
 
10.08.11
15:57
А нельзя это все сделать через Группу доступа контрагентов?, кот-я задается на вкладке "Прочее" элемента справочника контрагенты?
73 Лялечка
 
10.08.11
15:57
(72) есть реквизит "Регион", в зависимости от него определяются группы доступа, вот нижний видит только свой регион и определенную категорию, верхний - все регионы и определенную категорию
74 Лялечка
 
10.08.11
15:58
(72) группа доступа настроена в зависимости от региона
75 Лялечка
 
10.08.11
15:58
и вот проверяется группаДоступа, иерархия и категория
76 Aleks555
 
10.08.11
16:13
я бы всё-же вернулся к "В ИЕРАРХИИ (&Группа)" вместо родителя, либо вместо "Группа" указать результат запроса.
77 Лялечка
 
10.08.11
16:18
(76) так RLS же
78 acsent
 
10.08.11
16:24
(76) нету в рлс иерархии
79 Aleks555
 
10.08.11
16:31
а "есть Null" есть?
80 Лялечка
 
10.08.11
16:32
(79) ну как видишь есть:)
81 Aleks555
 
10.08.11
16:33
а чем они особо отличаются, тоже логический оператор..
82 Лялечка
 
10.08.11
16:38
(81) ох, не знаю...
83 Aleks555
 
10.08.11
17:04
Как вариант, еще можно было бы вот этот Родитель.Родитель загнать во временную таблицу, проиндексировать и в секции где уже сравнивать с результатом временной таблицы,по идее должно побыстрее работать.
84 Лялечка
 
10.08.11
17:15
еще вопросик: у меня шаблон ограничения стоит на поле <прочие поля>, родитель, ссылка, код - ограничений нет. Объясните, как определить куда ограничения, почему не ограничиваются поля родитель, ссылка, код? (это типовой вариант)
85 Nutsiiam
 
10.08.11
17:38
какая ирерахия в рлс, какие временные таблицы? :)
86 Aleks555
 
10.08.11
17:43
(85) где дельный совет от тебя? Скажи как правильно сделать:)