Имя: Пароль:
1C
1С v8
Оптимизация запроса
0 Dermidont2006
 
03.10.14
09:32
1. Можно оптимизировать 100% (2)
2. Нельзя оптимизировать 0% (0)
Всего мнений: 2

Доброе утро, парни и девушки! Имеется в наличии запрос

ВЫБРАТЬ
    Контрагенты.Ссылка
ИЗ
    Справочник.Контрагенты КАК Контрагенты
ГДЕ
    (Контрагенты.Родитель = &ВыбГруппа
            ИЛИ Контрагенты.Родитель.Родитель = &ВыбГруппа
            ИЛИ Контрагенты.Родитель.Родитель.Родитель = &ВыбГруппа
            ИЛИ Контрагенты.Родитель.Родитель.Родитель.Родитель.Родитель = &ВыбГруппа
            ИЛИ Контрагенты.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = &ВыбГруппа)

Однако, если в справочнике контрагенты присутствуют несколько тысяч элементов, этот запрос работает очень медленно. Никто не подскажет, как можно оптимизировать данный запрос?
1 Fragster
 
гуру
03.10.14
09:33

Можно оптимизировать
2 Fragster
 
гуру
03.10.14
09:34
чтобы было быстрее обновление данных - доп регистр только для групп можно строить
3 Dermidont2006
 
03.10.14
09:38
Самый верхний родитель не нужен. Тут подразумевается, что в справочнике может быть большое количество уровней иерархии, и пользователь может выбрать группу контрагентов, находящуюся на любом уровне иерархии.
4 Maxus43
 
03.10.14
09:41
(3) не суть, никак в запросе не сделать, кроме как в (0), надо дополнительные сущности добавлять чтобы было красивей, типа (1), тем более если количество уровней не фиксировано.

Хотя как вариант - наложить условие (0) только для выбора Групп, помещаем получившиеся группы в ВТ, а по элементам уже ГДЕ КОНТРАГЕНТ.Родитель В (втГРУППЫ)
5 Maxus43
 
03.10.14
09:47
не то?
ВЫБРАТЬ
    Контрагенты.Ссылка
ПОМЕСТИТЬ втГруппы
ИЗ
    Справочник.Контрагенты КАК Контрагенты
ГДЕ
    Контрагенты.ЭтоГруппа
    И (Контрагенты.Ссылка = &Родитель
            ИЛИ Контрагенты.Родитель = &Родитель
            ИЛИ Контрагенты.Родитель.Родитель = &Родитель)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Контрагенты.Ссылка,
    втГруппы.Ссылка КАК Ссылка1
ИЗ
    втГруппы КАК втГруппы
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
        ПО втГруппы.Ссылка = Контрагенты.Родитель
6 Maxus43
 
03.10.14
09:47
ну проиндексировать, понять надо ли соединение, или тупо условие и прочие мелочи
7 Maxus43
 
03.10.14
09:48
Суть в том что не будет проверятся условие на мильёнах записей. Сиречь оптимизация
8 Maxus43
 
03.10.14
09:49
тыдыЩ!

Можно оптимизировать
9 Defender aka LINN
 
03.10.14
09:49
(0) Про "В Иерархии" когда-нибудь слышали?
10 Maxus43
 
03.10.14
09:51
(9) я тоже так хотел написать, пок ане понял задачу. Утром пятницы видимо туго идёт
11 cons74
 
03.10.14
09:52
(0) а почему бы не зайти с другого входа?

СправочникМенеджер.<Имя справочника> (CatalogManager.<Имя справочника>)
Выбрать (Select)
Синтаксис:

Выбрать(<Родитель>, <Владелец>, <Отбор>, <Порядок>)
Параметры:

<Родитель> (необязательный)

Тип: СправочникСсылка.
Отбор по родителю. Имеет смысл только для многоуровневых справочников. Если параметр не задан, то отбор по родителю не производится. Чтобы отобрать элементы верхнего уровня, нужно в качестве данного параметра указать пустую ссылку на элемент справочника.
12 cons74
 
03.10.14
09:53
и никакого высчитывания кол-ва уровней групп
13 MrStomak
 
03.10.14
09:54
Запрос выбирает всех контрагентов, находящихся в пределах 6 уровни вложенности к указанной группе.
Скорее всего, обычное В ИЕРАРХИИ вполне удовлетворит.
14 1dvd
 
03.10.14
09:55
(10) поясни, почему В ИЕРАРХИИ не подходит?
15 Maxus43
 
03.10.14
09:56
(13)(14) уровни вложенности "ВВЕРХ" проверяются. Т.е. выбрав вложенную группу, мы получим и элементы в вышестоящих группах.

В ИЕРАРХИИ в другую сторону смотрит, вложенность "ВНИЗ".

Автор, сам объясняй, тебя не понимают
16 Heckfy
 
03.10.14
09:56
(0) На 9 уровне сдохнет.
17 Dermidont2006
 
03.10.14
09:56
cons74, данные нужно отобрать запросом.  

В иерархии наверное подходит, только я про него не слышал, если честно. А как запрос написать с использованием в иерархии?
18 Maxus43
 
03.10.14
09:57
пля. я чо зря воображение включал?

Задачу обрисуй, тебе вложенные надо элементы, или вплоть до родителя верхнего уровня?
19 Dermidont2006
 
03.10.14
09:58
Как раз вниз и надо. Выбрал пользователь группу контрагентов, надо обработать все элементы, которые в эту группу входят, неважно на каком уровне иерархии выбранная группа находится.
20 Dermidont2006
 
03.10.14
09:58
Вверх не надо
21 1dvd
 
03.10.14
09:59
(15) судя по (0) ему нужны кокрастыке © вниз проверять
22 Maxus43
 
03.10.14
09:59
(20) у тебя в запросе - вверх, а не вниз, ты неправильные результаты получаешь
23 Dermidont2006
 
03.10.14
10:00
Результаты правильные, только медленно работает.
24 1dvd
 
03.10.14
10:01
(23) зайди в кнофигураторе Помощь - Содержание и найди там всё по запросу
25 Maxus43
 
03.10.14
10:01
тьфу.
В ИЕРАРХИИ.
Посыпал голову пеплом, ушёл пить кофе.
26 Dermidont2006
 
03.10.14
10:02
Heckfy, кто сдохнет на 9 уровне?
27 Dermidont2006
 
03.10.14
10:02
Maxus43, спасибо за помощь, приятного кофепития
28 Defender aka LINN
 
03.10.14
10:13
(26) Марио
29 Fragster
 
гуру
03.10.14
10:14
(3) а там решение не только для верхнего уровня, а в принципе для ускорения и упрощения соединений и "Выбор когда тогда" по иерархии
30 Fragster
 
гуру
03.10.14
10:17
(29)+ можно получить цепочку родителей, нужный уровень родителя, всех потомков и прочее
31 lapinio
 
03.10.14
10:25
Но как минимум

ИЛИ Контрагенты.Родитель.Родитель = &ВыбГруппа
            ИЛИ Контрагенты.Родитель.Родитель.Родитель = &ВыбГруппа
            ИЛИ Контрагенты.Родитель.Родитель.Родитель.Родитель.Родитель = &ВыбГруппа
            ИЛИ Контрагенты.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = &ВыбГруппа)

Надо заменить на объединение!!
32 VladZ
 
03.10.14
10:40
(0) ИЛИ Контрагенты.Родитель.Родитель = &ВыбГруппа
            ИЛИ Контрагенты.Родитель.Родитель.Родитель = &ВыбГруппа
            ИЛИ Контрагенты.Родитель.Родитель.Родитель.Родитель.Родитель = &ВыбГруппа
            ИЛИ Контрагенты.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = &ВыбГруппа)

гы-гы-гы... Что за деревенщина писала ЭТО???
33 Кир Пластелинин
 
03.10.14
10:45
просто адский писец...
34 cons74
 
03.10.14
10:45
(17) мы можем получить выборку этим методом, потом выгрузить её в ТЗ, и обращаться к этой ТЗ через запрос, метод менеджер временных таблиц
35 Кир Пластелинин
 
03.10.14
10:50
у меня разрыв шаблонов... у тс в профиле написано "Опыт работы 10 лет" и "Программист 1С" и вместе с тем он пишет, что "В иерархии наверное подходит, только я про него не слышал, если честно. А как запрос написать с использованием в иерархии?"
36 Крошка Ру
 
03.10.14
10:52
(35) Там же не написано, что именно 1Сником 10 лет.
37 Крошка Ру
 
03.10.14
10:58
(35) К тому же В ИЕРАРХИИ - темная сторона Силы это, её истинный джедай избегает использовать.
38 Кир Пластелинин
 
03.10.14
10:59
(36) не исключено. но за такой запрос - расстреливать на месте
39 Лохматые Уши
 
03.10.14
11:00
(32) Почему деревенщина? Если ограничить количество групп. то вполне рабочий код.
В ИЕРАРХИИ действительно работает не оптимально. И что быстрее - тут еще вопрос.
40 Кир Пластелинин
 
03.10.14
11:08
(39) о даа) представляю диалог: - Вась, у нас там новый уровень справочника добавлся. Отчет не работает. - ок. сейчас конфу обновим (* если встроенный). а уж про "ИЛИ" в условиях промолчу.
(37) угу. темная. как афродыра. не все это знают. вернее знать могут не только лишь все, но мало кто знает это)
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн