Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Можно переписать запрос?

Можно переписать запрос?
Я
   St-Anger
 
22.03.19 - 13:08
Можно ли переписать часть запроса, где идет связь по родителю?

ВЫБРАТЬ
    СкидкиНаценкиСегментНоменклатуры.Номенклатура,
    СкидкиНаценкиСегментНоменклатуры.Ссылка КАК СкидкаНаценка,
    ДействиеСкидокНаценокСрезПоследних.Период,
    ДействиеСкидокНаценокСрезПоследних.ТипЦен,
    ДействиеСкидокНаценокСрезПоследних.ДатаОкончания
ПОМЕСТИТЬ вт
ИЗ
    РегистрСведений.ДействиеСкидокНаценок.СрезПоследних(
            &Завтра,
            ДатаОкончания = &ПустаяДата
                ИЛИ КОНЕЦПЕРИОДА(ДатаОкончания, ДЕНЬ) >= &Завтра) КАК ДействиеСкидокНаценокСрезПоследних
        ПОЛНОЕ СОЕДИНЕНИЕ Справочник.СкидкиНаценки.СегментНоменклатуры КАК СкидкиНаценкиСегментНоменклатуры
        ПО ДействиеСкидокНаценокСрезПоследних.СкидкаНаценка = СкидкиНаценкиСегментНоменклатуры.Ссылка
ГДЕ
    ДействиеСкидокНаценокСрезПоследних.СкидкаНаценка.СтатусДействия = &Действует
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЗаказПокупателяТовары.Номенклатура
ПОМЕСТИТЬ втЗаказы
ИЗ
    Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
ГДЕ
    ЗаказПокупателяТовары.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
    И ЗаказПокупателяТовары.Ссылка.Проведен
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    вт.СкидкаНаценка КАК СкидкаНаценка
ИЗ
    втЗаказы КАК втЗаказы
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ вт КАК вт
        ПО (ВЫБОР
                КОГДА вт.Номенклатура = втЗаказы.Номенклатура
                        ИЛИ вт.Номенклатура = втЗаказы.Номенклатура.Родитель
                        ИЛИ вт.Номенклатура = втЗаказы.Номенклатура.Родитель.Родитель
                        ИЛИ вт.Номенклатура = втЗаказы.Номенклатура.Родитель.Родитель.Родитель
                        ИЛИ вт.Номенклатура = втЗаказы.Номенклатура.Родитель.Родитель.Родитель.Родитель
                        ИЛИ вт.Номенклатура = втЗаказы.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель
                        ИЛИ вт.Номенклатура = втЗаказы.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель
                        ИЛИ вт.Номенклатура = втЗаказы.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель
                        ИЛИ вт.Номенклатура = втЗаказы.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель
                        ИЛИ вт.Номенклатура = втЗаказы.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель
                        ИЛИ вт.Номенклатура = втЗаказы.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель
                    ТОГДА ИСТИНА
            КОНЕЦ)
 
 
   St-Anger
 
1 - 22.03.19 - 13:11
В скидках номенклатура может быть как элементом так и группой и нужно понять, входит ли номенклатура в заказе в номенклатуру в скидках.
   H A D G E H O G s
 
2 - 22.03.19 - 13:11
Милота какая
   St-Anger
 
3 - 22.03.19 - 13:12
(2) да не то слово, но пока ничего умнее не придумал((
   НЕА123
 
4 - 22.03.19 - 13:28
В ИЕРАРХИИ
?
   Buster007
 
5 - 22.03.19 - 13:30
возьми самый верхний уровень из справочника номенклатуры, определи в каком из них лежит номенклатура втЗаказы.Номенклатура, и потом сделаешь в Иерархии 1 элемент верхнего уровня
   palsergeich
 
6 - 22.03.19 - 13:35
(0) можно, переписывать.
   Garykom
 
7 - 22.03.19 - 13:36
Если "вт" сделать правильную (перебрать группы верхнего уровня и все подчиненные засунуть) то можно.
   sqr4
 
8 - 22.03.19 - 13:37
(4) (5) не работает виерархии в связи помоему
   palsergeich
 
9 - 22.03.19 - 13:38
(8) В иерархии на связь таблиц уже звучит не очень
   AquaMan
 
10 - 22.03.19 - 13:39
В ИЕРАРХИИ тут не поможет. Подключаешь менеджер ВТ и в цикле заполняешь таблицу вт, на каждого родителя в этой таблице будет по записи.
 
 Рекламное место пустует
   Сияющий в темноте
 
11 - 22.03.19 - 13:39
Кстати вопрос
если в группу А вложена группа Б товар в группе Б
скидка 1 на группу А,а скидка 2 на группу Б
то какая скидка в товаре должна сработать?

просто,выбрать номенклатуру из заказа и определить для нее всевозможные скидки,потом выбрать одну и добавить в результирующую таблицу.

я для скидок на группы делал регистр сведений,где скидки для элементов автоматом задавались по группам,и можно было во Фронтол без иерархии выгружать.
   sqr4
 
12 - 22.03.19 - 13:42
http://catalog.mista.ru/public/158512/
Транзитивное замыкание запросом
   St-Anger
 
13 - 22.03.19 - 13:43
Хотелось все сделать одним запросом. Не будет ли менеджер ВТ отрабатывать дольше, чем текущий запрос?
   arsik
 
14 - 22.03.19 - 13:44
(11) Я так понимаю, что чем глубже уровень, тем больше приоритет. У нас такие запросы тоже используются и для справочника номенклатура добавлен реквизит "Уровень", хранит уровень вложенности элемента.
   sqr4
 
15 - 22.03.19 - 13:44
+(12) наверно с помощью этого можно определить всех родителей элемента, а уж потом соединиться по нормальному.
   St-Anger
 
16 - 22.03.19 - 13:51
(11) на этом первом этапе нужно просто понять, какие скидки могут быть применины для данного заказа. Потом идет уже более глубокий расчет.
   St-Anger
 
17 - 22.03.19 - 13:57
(12) если уже городить такое, то мне кажется легче сделать выборку номенклатуры с заказа с итогами по иерархии и засунуть ее опять в запрос как таблицу.
   sqr4
 
18 - 22.03.19 - 14:01
+ (12) тут как я понял уже решено.
https://forum.infostart.ru/forum9/topic125683/#message1306905
   sqr4
 
19 - 22.03.19 - 14:03
(17) ты уже нагородил, дольше этого работать ничего точно не будет
   sqr4
 
20 - 22.03.19 - 14:03
+(19) хотя я не проверял
   St-Anger
 
21 - 22.03.19 - 14:05
(20) не хилый такой запросик выростает. И все таки чем он лучше, чем связь по родителю, если известно количество уровней? Быстрее будет работать?
   vi0
 
22 - 22.03.19 - 14:15
(17) на самом деле там не сильно и сложно, ты попробуй
просто у автора статьи склонность использовать непонятные слова и писать нечитабельный код
   St-Anger
 
23 - 22.03.19 - 14:19
(22) Уже разобрался, сначала подумал, что нужно запрос собирать циклом, но спасибо (18) тут готовое решение.
Спасибо!
   sqr4
 
24 - 22.03.19 - 14:20
(21) Проверяй на своих данных, я не эксперементировал. ПРосто если нужен голый запрос, то это явно лучше чем в (0)
   St-Anger
 
25 - 22.03.19 - 14:39
(24) Проверил, отрабатывает намного дольше, чем через родителя. Видно даже без замеров.Причем оставил глубину иерархии 16.
   sqr4
 
26 - 22.03.19 - 14:44
(25) пали сюда запрос
   St-Anger
 
27 - 22.03.19 - 14:59
ВЫБРАТЬ
    Номенклатура.Родитель КАК НачалоДуги,
    Номенклатура.Ссылка КАК КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины1
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Родитель <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    Номенклатура.Ссылка,
    Номенклатура.Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПерваяДуга.НачалоДуги,
    ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины2
ИЗ
    ЗамыканияДлины1 КАК ПерваяДуга
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины1 КАК ВтораяДуга
        ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПерваяДуга.НачалоДуги,
    ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины4
ИЗ
    ЗамыканияДлины2 КАК ПерваяДуга
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины2 КАК ВтораяДуга
        ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПерваяДуга.НачалоДуги,
    ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины8
ИЗ
    ЗамыканияДлины4 КАК ПерваяДуга
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины4 КАК ВтораяДуга
        ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПерваяДуга.НачалоДуги,
    ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины16
ИЗ
    ЗамыканияДлины8 КАК ПерваяДуга
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины8 КАК ВтораяДуга
        ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ЗаказПокупателяТовары.Номенклатура
ПОМЕСТИТЬ втЗаказы
ИЗ
    Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
ГДЕ
    ЗаказПокупателяТовары.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
    И ЗаказПокупателяТовары.Ссылка.Проведен
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    СкидкиНаценкиСегментНоменклатуры.Номенклатура,
    СкидкиНаценкиСегментНоменклатуры.Ссылка КАК СкидкаНаценка,
    ДействиеСкидокНаценокСрезПоследних.Период,
    ДействиеСкидокНаценокСрезПоследних.ТипЦен,
    ДействиеСкидокНаценокСрезПоследних.ДатаОкончания
ИЗ
    РегистрСведений.ДействиеСкидокНаценок.СрезПоследних(
            &Завтра,
            ДатаОкончания = &ПустаяДата
                ИЛИ КОНЕЦПЕРИОДА(ДатаОкончания, ДЕНЬ) >= &Завтра) КАК ДействиеСкидокНаценокСрезПоследних
        ПОЛНОЕ СОЕДИНЕНИЕ Справочник.СкидкиНаценки.СегментНоменклатуры КАК СкидкиНаценкиСегментНоменклатуры
            ЛЕВОЕ СОЕДИНЕНИЕ ЗамыканияДлины16 КАК ЗамыканияДлины16
            ПО СкидкиНаценкиСегментНоменклатуры.Номенклатура = ЗамыканияДлины16.НачалоДуги
        ПО ДействиеСкидокНаценокСрезПоследних.СкидкаНаценка = СкидкиНаценкиСегментНоменклатуры.Ссылка
ГДЕ
    ДействиеСкидокНаценокСрезПоследних.СкидкаНаценка.СтатусДействия = &Действует
   St-Anger
 
28 - 22.03.19 - 15:00
Это даже без выборки номенклатуры с заказа. Но там будет разница минимальная т.к. это тестовая база и там всего 3 акции,а с заказа выбирает 2.
   тарам пам пам
 
29 - 22.03.19 - 15:07
(27) у ильдаровича строится по сути полная таблица по всему справочнику, кто кому подчинен => из-за этого и тормозит. Проверь в консоли размер таблицы ЗамыканияДлины16. Чтобы оно шевелилось, как минимум нужно добавить индекс по номенклатуре в таблицу ЗамыканияДлины16.
   sqr4
 
30 - 22.03.19 - 15:08
да может сначала все же номенклатуру из заказов получить?
   sqr4
 
31 - 22.03.19 - 15:08
а потом ограничить получение родителей по ней?
   sqr4
 
32 - 22.03.19 - 15:09
вообщем дело не в бобине
   St-Anger
 
33 - 22.03.19 - 15:10
(32) да, уже понял, что не с той таблицей связал. Сейчас с заказами пробую связать.
 
 
   St-Anger
 
34 - 22.03.19 - 15:25
Вот так работает. Сначала ограничиваем номенклатуру для построения родителей, а потом уже связываем основную таблицу по номенклатуре.

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ЗаказПокупателяТовары.Номенклатура
ПОМЕСТИТЬ втЗаказы
ИЗ
    Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
ГДЕ
    ЗаказПокупателяТовары.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
    И ЗаказПокупателяТовары.Ссылка.Проведен
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    Номенклатура.Родитель КАК НачалоДуги,
    Номенклатура.Ссылка КАК КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины1
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Родитель <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
    И Номенклатура.Ссылка В
            (ВЫБРАТЬ
                втЗаказы.Номенклатура
            ИЗ
                втЗаказы)

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    Номенклатура.Ссылка,
    Номенклатура.Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка В
            (ВЫБРАТЬ
                втЗаказы.Номенклатура
            ИЗ
                втЗаказы)
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПерваяДуга.НачалоДуги,
    ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины2
ИЗ
    ЗамыканияДлины1 КАК ПерваяДуга
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины1 КАК ВтораяДуга
        ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПерваяДуга.НачалоДуги,
    ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины4
ИЗ
    ЗамыканияДлины2 КАК ПерваяДуга
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины2 КАК ВтораяДуга
        ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПерваяДуга.НачалоДуги,
    ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины8
ИЗ
    ЗамыканияДлины4 КАК ПерваяДуга
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины4 КАК ВтораяДуга
        ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПерваяДуга.НачалоДуги,
    ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины16
ИЗ
    ЗамыканияДлины8 КАК ПерваяДуга
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины8 КАК ВтораяДуга
        ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    СкидкиНаценкиСегментНоменклатуры.Номенклатура,
    СкидкиНаценкиСегментНоменклатуры.Ссылка КАК СкидкаНаценка,
    ДействиеСкидокНаценокСрезПоследних.Период,
    ДействиеСкидокНаценокСрезПоследних.ТипЦен,
    ДействиеСкидокНаценокСрезПоследних.ДатаОкончания
ИЗ
    РегистрСведений.ДействиеСкидокНаценок.СрезПоследних(
            &Завтра,
            ДатаОкончания = &ПустаяДата
                ИЛИ КОНЕЦПЕРИОДА(ДатаОкончания, ДЕНЬ) >= &Завтра) КАК ДействиеСкидокНаценокСрезПоследних
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СкидкиНаценки.СегментНоменклатуры КАК СкидкиНаценкиСегментНоменклатуры
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины16 КАК ЗамыканияДлины16
            ПО СкидкиНаценкиСегментНоменклатуры.Номенклатура = ЗамыканияДлины16.НачалоДуги
        ПО ДействиеСкидокНаценокСрезПоследних.СкидкаНаценка = СкидкиНаценкиСегментНоменклатуры.Ссылка
ГДЕ
    ДействиеСкидокНаценокСрезПоследних.СкидкаНаценка.СтатусДействия = &Действует
   sqr4
 
35 - 22.03.19 - 15:26
(34) НУ как норм? Пушка?
   St-Anger
 
36 - 22.03.19 - 15:27
(35) ага, быстро отрабатывает. Спасибо!
   St-Anger
 
37 - 22.03.19 - 15:44
Только нужно оставить условие только в одном подзапросе, иначе не все верхние группы выбирает
////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    Номенклатура.Родитель КАК НачалоДуги,
    Номенклатура.Ссылка КАК КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины1
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Родитель <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    Номенклатура.Ссылка,
    Номенклатура.Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка В
            (ВЫБРАТЬ
                втЗаказы.Номенклатура
            ИЗ
                втЗаказы)
;


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует