Имя: Пароль:
1C
1С v8
Можно переписать запрос?
0 St-Anger
 
22.03.19
13:08
Можно ли переписать часть запроса, где идет связь по родителю?

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

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

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

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

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

ОБЪЕДИНИТЬ

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

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

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

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

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

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

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

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

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

ОБЪЕДИНИТЬ

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

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

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

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

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

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

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

ОБЪЕДИНИТЬ

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