Имя: Пароль:
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) угу. темная. как афродыра. не все это знают. вернее знать могут не только лишь все, но мало кто знает это)
Программист всегда исправляет последнюю ошибку.