8.х Запрос в динамическом списке

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем TerANik, 7 июл 2015.

  1. TopicStarter Overlay
    TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    Пф.. уговорили..
    Как оптимизировать данный запрос в динамическом списке.. если будут предложения воспользуюсь.. параллельно переделываю на Таблицу значений с временными таблицами

    Код:
    ВЫБРАТЬ
        ВЫБОР
            КОГДА ВложенныйЗапрос.Распоряжение ССЫЛКА Документ.ЗаказКлиента
                    ИЛИ ВложенныйЗапрос.Распоряжение ССЫЛКА Документ.ВозвратТоваровПоставщику
                ТОГДА ВложенныйЗапрос.Распоряжение.Партнер
            КОГДА ВложенныйЗапрос.Распоряжение ССЫЛКА Документ.ЗаказНаВнутреннееПотребление
                ТОГДА "Внутреннее потребление"
            ИНАЧЕ ВложенныйЗапрос.Распоряжение.СкладПолучатель
        КОНЕЦ КАК Партнер,
        ВложенныйЗапрос.Распоряжение,
        ВложенныйЗапрос.Распоряжение.Организация КАК Организация,
        СУММА(ЕСТЬNULL(ВложенныйЗапрос.Резерв, 0)) КАК Резерв,
        СУММА(ВложенныйЗапрос.НадоСобрать) КАК НадоСобрать,
        СУММА(ЕСТЬNULL(ВложенныйЗапрос.КоличествоСобирается, 0)) КАК КоличествоСобирается,
        СУММА(ЕСТЬNULL(ВложенныйЗапрос.Собрано, 0)) КАК Собрано,
        СУММА(ВложенныйЗапрос.СобраноЛишнее) КАК СобраноЛишнее,
        ВложенныйЗапрос.Дата,
        ВложенныйЗапрос.Номер,
        ДополнительныеСведения.Значение КАК Статус
    ИЗ
        (ВЫБРАТЬ
            ЕСТЬNULL(Резервы.ЗаказКлиента, ОстаткиВЗонеКлиентскихЗаказов.ЗаказКлиента) КАК Распоряжение,
            ЕСТЬNULL(ОстаткиВЗонеКлиентскихЗаказов.Номенклатура, Резервы.Номенклатура) КАК Номенклатура,
            ОстаткиВЗонеКлиентскихЗаказов.КоличествоНабрано КАК Собрано,
            ВЫБОР
                КОГДА ЕСТЬNULL(Резервы.РезервОстаток, 0) - ЕСТЬNULL(ОстаткиВЗонеКлиентскихЗаказов.КоличествоНабрано, 0) + ЕСТЬNULL(ТоварыКОтгрузкеОстатки.КОтгрузкеОстаток, 0) > 0
                    ТОГДА ЕСТЬNULL(Резервы.РезервОстаток, 0) - ЕСТЬNULL(ОстаткиВЗонеКлиентскихЗаказов.КоличествоНабрано, 0) + ЕСТЬNULL(ТоварыКОтгрузкеОстатки.КОтгрузкеОстаток, 0)
                ИНАЧЕ 0
            КОНЕЦ КАК НадоСобрать,
            ЕСТЬNULL(Резервы.РезервОстаток, 0) + ЕСТЬNULL(ТоварыКОтгрузкеОстатки.КОтгрузкеОстаток, 0) КАК Резерв,
            ВЫБОР
                КОГДА ЕСТЬNULL(ТоварыКОтгрузкеОстатки.КОтгрузкеОстаток, 0) + ЕСТЬNULL(Резервы.РезервОстаток, 0) - ЕСТЬNULL(ОстаткиВЗонеКлиентскихЗаказов.КоличествоНабрано, 0) < 0
                    ТОГДА -ЕСТЬNULL(Резервы.РезервОстаток, 0) - ЕСТЬNULL(ТоварыКОтгрузкеОстатки.КОтгрузкеОстаток, 0) + ЕСТЬNULL(ОстаткиВЗонеКлиентскихЗаказов.КоличествоНабрано, 0)
                ИНАЧЕ 0
            КОНЕЦ КАК СобраноЛишнее,
            ОстаткиВЗонеКлиентскихЗаказов.КоличествоСобирается КАК КоличествоСобирается,
            ЕСТЬNULL(ОстаткиВЗонеКлиентскихЗаказов.ЗаказКлиента.Дата, Резервы.ЗаказКлиента.Дата) КАК Дата,
            ЕСТЬNULL(ОстаткиВЗонеКлиентскихЗаказов.ЗаказКлиента.Номер, Резервы.ЗаказКлиента.Номер) КАК Номер
        ИЗ
            (ВЫБРАТЬ
                СУММА(П_РезервыОстатки.РезервОстаток) КАК РезервОстаток,
                П_РезервыОстатки.ЗаказКлиента КАК ЗаказКлиента,
                П_РезервыОстатки.Номенклатура КАК Номенклатура
            ИЗ
                РегистрНакопления.П_Резервы.Остатки(, Склад = &Склад) КАК П_РезервыОстатки
           
            СГРУППИРОВАТЬ ПО
                П_РезервыОстатки.ЗаказКлиента,
                П_РезервыОстатки.Номенклатура) КАК Резервы
                ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                    Франч_ТоварыВЗонеКлиентскихЗаказовОстатки.ЗаказКлиента КАК ЗаказКлиента,
                    СУММА(Франч_ТоварыВЗонеКлиентскихЗаказовОстатки.ВНаличииОстаток * Франч_ТоварыВЗонеКлиентскихЗаказовОстатки.Упаковка.Коэффициент) КАК КоличествоНабрано,
                    Франч_ТоварыВЗонеКлиентскихЗаказовОстатки.Номенклатура КАК Номенклатура,
                    СУММА(Франч_ТоварыВЗонеКлиентскихЗаказовОстатки.КРазмещениюОстаток * Франч_ТоварыВЗонеКлиентскихЗаказовОстатки.Упаковка.Коэффициент) КАК КоличествоСобирается
                ИЗ
                    РегистрНакопления.Франч_ТоварыВЗонеКлиентскихЗаказов.Остатки(
                            ,
                            ЗаказКлиента <> НЕОПРЕДЕЛЕНО
                                И ЗаказКлиента <> ЗНАЧЕНИЕ(Документ.ЗаказКлиента.ПустаяСсылка)
                                И ЗаказКлиента <> ЗНАЧЕНИЕ(Документ.ЗаказНаПеремещение.ПустаяСсылка)) КАК Франч_ТоварыВЗонеКлиентскихЗаказовОстатки
               
                СГРУППИРОВАТЬ ПО
                    Франч_ТоварыВЗонеКлиентскихЗаказовОстатки.ЗаказКлиента,
                    Франч_ТоварыВЗонеКлиентскихЗаказовОстатки.Номенклатура) КАК ОстаткиВЗонеКлиентскихЗаказов
                    ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                        ТоварыКОтгрузкеОстатки.Номенклатура КАК Номенклатура,
                        СУММА(ВЫБОР
                                КОГДА ТоварыКОтгрузкеОстатки.ДокументОтгрузки ССЫЛКА Документ.ПеремещениеТоваров
                                        И ТоварыКОтгрузкеОстатки.ДокументОтгрузки.ЗаказНаПеремещение = ЗНАЧЕНИЕ(Документ.ЗаказНаПеремещение.ПустаяссылкА)
                                    ТОГДА ПеремещениеТоваровТовары.Количество
                                ИНАЧЕ ТоварыКОтгрузкеОстатки.КОтгрузкеОстаток
                            КОНЕЦ) КАК КОтгрузкеОстаток,
                        ВЫБОР
                            КОГДА ТоварыКОтгрузкеОстатки.ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг
                                ТОГДА ТоварыКОтгрузкеОстатки.ДокументОтгрузки.ЗаказКлиента
                            КОГДА ТоварыКОтгрузкеОстатки.ДокументОтгрузки ССЫЛКА Документ.ВнутреннееПотреблениеТоваров
                                ТОГДА ВЫБОР
                                        КОГДА ТоварыКОтгрузкеОстатки.ДокументОтгрузки.ЗаказНаВнутреннееПотребление = ЗНАЧЕНИЕ(Документ.ЗаказНаВнутреннееПотребление.ПустаяссылкА)
                                            ТОГДА ВнутреннееПотреблениеТоваровТовары.ЗаказНаВнутреннееПотребление
                                        ИНАЧЕ ТоварыКОтгрузкеОстатки.ДокументОтгрузки.ЗаказНаВнутреннееПотребление
                                    КОНЕЦ
                            КОГДА ТоварыКОтгрузкеОстатки.ДокументОтгрузки ССЫЛКА Документ.ВозвратТоваровПоставщику
                                ТОГДА ТоварыКОтгрузкеОстатки.ДокументОтгрузки
                            КОГДА ТоварыКОтгрузкеОстатки.ДокументОтгрузки ССЫЛКА Документ.ПеремещениеТоваров
                                ТОГДА ВЫБОР
                                        КОГДА ТоварыКОтгрузкеОстатки.ДокументОтгрузки.ЗаказНаПеремещение = ЗНАЧЕНИЕ(Документ.ЗаказНаПеремещение.ПустаяссылкА)
                                            ТОГДА ПеремещениеТоваровТовары.ЗаказНаПеремещение
                                        ИНАЧЕ ТоварыКОтгрузкеОстатки.ДокументОтгрузки.ЗаказНаПеремещение
                                    КОНЕЦ
                        КОНЕЦ КАК ЗаказКлиента
                    ИЗ
                        РегистрНакопления.ТоварыКОтгрузке.Остатки(, Склад = &Склад) КАК ТоварыКОтгрузкеОстатки
                            ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
                            ПО ТоварыКОтгрузкеОстатки.ДокументОтгрузки = ПеремещениеТоваровТовары.Ссылка
                                И ТоварыКОтгрузкеОстатки.Номенклатура = ПеремещениеТоваровТовары.Номенклатура
                                И ТоварыКОтгрузкеОстатки.Характеристика = ПеремещениеТоваровТовары.Характеристика
                            ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВнутреннееПотреблениеТоваров.Товары КАК ВнутреннееПотреблениеТоваровТовары
                            ПО ТоварыКОтгрузкеОстатки.ДокументОтгрузки = ВнутреннееПотреблениеТоваровТовары.Ссылка
                                И ТоварыКОтгрузкеОстатки.Номенклатура = ВнутреннееПотреблениеТоваровТовары.Номенклатура
                                И ТоварыКОтгрузкеОстатки.Характеристика = ВнутреннееПотреблениеТоваровТовары.Характеристика
                   
                    СГРУППИРОВАТЬ ПО
                        ТоварыКОтгрузкеОстатки.Номенклатура,
                        ВЫБОР
                            КОГДА ТоварыКОтгрузкеОстатки.ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг
                                ТОГДА ТоварыКОтгрузкеОстатки.ДокументОтгрузки.ЗаказКлиента
                            КОГДА ТоварыКОтгрузкеОстатки.ДокументОтгрузки ССЫЛКА Документ.ВнутреннееПотреблениеТоваров
                                ТОГДА ВЫБОР
                                        КОГДА ТоварыКОтгрузкеОстатки.ДокументОтгрузки.ЗаказНаВнутреннееПотребление = ЗНАЧЕНИЕ(Документ.ЗаказНаВнутреннееПотребление.ПустаяссылкА)
                                            ТОГДА ВнутреннееПотреблениеТоваровТовары.ЗаказНаВнутреннееПотребление
                                        ИНАЧЕ ТоварыКОтгрузкеОстатки.ДокументОтгрузки.ЗаказНаВнутреннееПотребление
                                    КОНЕЦ
                            КОГДА ТоварыКОтгрузкеОстатки.ДокументОтгрузки ССЫЛКА Документ.ВозвратТоваровПоставщику
                                ТОГДА ТоварыКОтгрузкеОстатки.ДокументОтгрузки
                            КОГДА ТоварыКОтгрузкеОстатки.ДокументОтгрузки ССЫЛКА Документ.ПеремещениеТоваров
                                ТОГДА ВЫБОР
                                        КОГДА ТоварыКОтгрузкеОстатки.ДокументОтгрузки.ЗаказНаПеремещение = ЗНАЧЕНИЕ(Документ.ЗаказНаПеремещение.ПустаяссылкА)
                                            ТОГДА ПеремещениеТоваровТовары.ЗаказНаПеремещение
                                        ИНАЧЕ ТоварыКОтгрузкеОстатки.ДокументОтгрузки.ЗаказНаПеремещение
                                    КОНЕЦ
                        КОНЕЦ) КАК ТоварыКОтгрузкеОстатки
                    ПО ОстаткиВЗонеКлиентскихЗаказов.Номенклатура = ТоварыКОтгрузкеОстатки.Номенклатура
                        И ОстаткиВЗонеКлиентскихЗаказов.ЗаказКлиента = ТоварыКОтгрузкеОстатки.ЗаказКлиента
                ПО Резервы.ЗаказКлиента = ОстаткиВЗонеКлиентскихЗаказов.ЗаказКлиента
                    И Резервы.Номенклатура = ОстаткиВЗонеКлиентскихЗаказов.Номенклатура) КАК ВложенныйЗапрос
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
            ПО ВложенныйЗапрос.Распоряжение = ДополнительныеСведения.Объект
                И (ДополнительныеСведения.Свойство = (ЗНАЧЕНИЕ(Справочник.П_РеквизитыОбъектов.СтатусЗаказаКлиента)).Значение)
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВЗонеПриемки.Остатки КАК ТоварыВЗонеПриемкиОстатки
            ПО ВложенныйЗапрос.Распоряжение = ТоварыВЗонеПриемкиОстатки.Заказ
    
    ГДЕ
        (ВложенныйЗапрос.СобраноЛишнее <> 0
                ИЛИ ВложенныйЗапрос.НадоСобрать <> 0)
    
    СГРУППИРОВАТЬ ПО
        ВложенныйЗапрос.Распоряжение,
        ВложенныйЗапрос.Распоряжение.Организация,
        ВложенныйЗапрос.Дата,
        ВложенныйЗапрос.Номер,
        ДополнительныеСведения.Значение,
        ВЫБОР
            КОГДА ВложенныйЗапрос.Распоряжение ССЫЛКА Документ.ЗаказКлиента
                    ИЛИ ВложенныйЗапрос.Распоряжение ССЫЛКА Документ.ВозвратТоваровПоставщику
                ТОГДА ВложенныйЗапрос.Распоряжение.Партнер
            КОГДА ВложенныйЗапрос.Распоряжение ССЫЛКА Документ.ЗаказНаВнутреннееПотребление
                ТОГДА "Внутреннее потребление"
            ИНАЧЕ ВложенныйЗапрос.Распоряжение.СкладПолучатель
        КОНЕЦ
    
    УПОРЯДОЧИТЬ ПО
        ВложенныйЗапрос.Распоряжение.Дата
    Запрос формируется порядка 4-6 минут, с времеными таблицами 15 секунд
  2. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Ну по идее надо левое убирать и делать Объединене, чуток подшаманив.
    Так быстрее работать будет т.к при левом соединени когда слева запрос скуль не всегда знает сколько там данных будет и не всегда строит оптимальный план запроса. и него там несколько варианций как посроить. когда с лева ВТ он знает сколько там записей и выьбирает более оптималный метод.
  3. TopicStarter Overlay
    TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    Ну там как не крути 3 вложенных пересвязанных между собой, в итоге в любом случае два вложенных связаны
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Я бы сделал таблицы:

    ОстаткиВЗонеКлиентскихЗаказов
    Резервы
    ТоварыКОтгрузке

    Объединил их и уже выводил группировку данных из этих двух таблиц.


    Левые соединнения к подзапросам и полное соединение - это ж убийство....
  5. Dem0lisher
    Offline

    Dem0lisher Профессионал в 1С

    Регистрация:
    4 авг 2009
    Сообщения:
    1.023
    Симпатии:
    51
    Баллы:
    54
    А что, уже разрешили временные таблицы в динамических списках с произвольным запросом? Давно?
  6. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    А х.з давно или нет., но запрос написать можно :)
    upload_2015-7-7_12-42-18.png
  7. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Нет не разрешили, вот и идет дискуссия как лучше запрос переделать. т.к на ВТ быстрее работает
    --- Объединение сообщений, 7 июл 2015 ---
    Запрос на создание ВТ в динамическом списке можно сделать только что потом. ты то с ней не поработаешь.

Поделиться этой страницей