Версия для печати темы (https://pro1c.org.ua/index.php?s=5b49214cef74c874d8a6e218170a7450&showtopic=61129)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Выборка документов по доп. характеристике номенклатуры

Автор: stajer 25.08.20, 10:03

Здравствуйте.
Платформа: 1С:Предприятие 8.3 (8.3.8.2322).
Конфигурация: Управление торговлей для Украины, редакция 3.1
Разработка конфигурации: "ABBYY Ukraine", 2005-2017 (3.1.5.1) (http://1c.ua/v8/RegionalSolutions_UA_UT.php)
Copyright © ДП "Еврософтпром", 2005-2017. Все права защищены
(http://www.1c.ua)



Прошу вашего совета. В документе Заказ покупателя среди прочих номенклатур есть номенклатуры с дополнительными характеристиками ( каталог и образец), необходимо выбрать все данные из документов заказ только по номенклатурам с характеристиками "каталог" и "образец" с 2017 года. В дальнейшем ищется оплата по ним (Приходный кассовый ордер) и возвраты. На основании этих данных расчитывается задолжность клиента.
Сложность в том что построенный запрос выполняется очень долго. Посоветуйте, пожалуйста, есть ли возможность хранить таблицы с данными где-то в отчете?

Автор: Vofka 25.08.20, 10:12

stajer, было бы не плохо, если бы вы показали запрос.

Автор: stajer 25.08.20, 10:39

Vofka @ Сегодня, 11:12 * ,
Вот запрос по поиску в документах номенклатуры с дополнительной характеристикой "Образец". Конкретно это делается во "Вложенный запрос". Точно такой же запрос для получение документов с номенклатурой с дополнительной характеристикой "Каталог".

ВЫБРАТЬ
    ВложенныйЗапрос.Ссылка КАК ЗаказПокупателя,
    ВложенныйЗапрос.СуммаДокумента КАК СуммаДокумента,
    ПриходныйКассовыйОрдерРасшифровкаПлатежа.Ссылка КАК ПКО,
    ПриходныйКассовыйОрдерРасшифровкаПлатежа.СуммаВзаиморасчетов КАК СуммаВзаиморасчетов,
    ВЫБОР
        КОГДА ПриходныйКассовыйОрдерРасшифровкаПлатежа.СуммаВзаиморасчетов ЕСТЬ NULL
            ТОГДА ВЫБОР
                    КОГДА ВЗВозвраты.Возврат ЕСТЬ NULL
                        ТОГДА ВложенныйЗапрос.СуммаДокумента
                    ИНАЧЕ ВЫБОР
                            КОГДА ВложенныйЗапрос.СуммаДокумента - ВЗВозвраты.СуммаВозврат <= 0
                                ТОГДА ВложенныйЗапрос.СуммаДокумента
                            ИНАЧЕ ВложенныйЗапрос.СуммаДокумента - ВЗВозвраты.СуммаВозврат
                        КОНЕЦ
                КОНЕЦ
        ИНАЧЕ ВЫБОР
                КОГДА ВложенныйЗапрос.СуммаДокумента - ПриходныйКассовыйОрдерРасшифровкаПлатежа.СуммаВзаиморасчетов <= 0
                    ТОГДА 0
                ИНАЧЕ ВЫБОР
                        КОГДА ВЗВозвраты.Возврат ЕСТЬ NULL
                            ТОГДА ВложенныйЗапрос.СуммаДокумента - ПриходныйКассовыйОрдерРасшифровкаПлатежа.СуммаВзаиморасчетов
                        ИНАЧЕ ВЫБОР
                                КОГДА ВложенныйЗапрос.СуммаДокумента - ПриходныйКассовыйОрдерРасшифровкаПлатежа.СуммаВзаиморасчетов - ВЗВозвраты.СуммаВозврат <= 0
                                    ТОГДА 0
                                ИНАЧЕ ВложенныйЗапрос.СуммаДокумента - ПриходныйКассовыйОрдерРасшифровкаПлатежа.СуммаВзаиморасчетов - ВЗВозвраты.СуммаВозврат
                            КОНЕЦ
                    КОНЕЦ
            КОНЕЦ
    КОНЕЦ КАК Разница,
    ВЗВозвраты.Возврат КАК Возврат,
    ВЗВозвраты.СуммаВозврат КАК СуммаВозврат,
    ВложенныйЗапрос.Контрагент КАК Контрагент,
    ВложенныйЗапрос.Валюта КАК Валюта
ИЗ
    (ВЫБРАТЬ
        ЗаказКлиентаТовары.Ссылка КАК Ссылка,
        СУММА(ЕСТЬNULL(ЗаказКлиентаТовары.Сумма, 0)) КАК СуммаДокумента,
        ЗаказКлиентаТовары.Ссылка.Валюта КАК Валюта,
        ЗаказКлиентаТовары.Ссылка.Контрагент КАК Контрагент,
        НоменклатураДополнительныеРеквизиты.Значение КАК Значение
    ИЗ
        Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
            ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
            ПО (ЗаказКлиентаТовары.Номенклатура = НоменклатураДополнительныеРеквизиты.Ссылка)
    ГДЕ
        ЗаказКлиентаТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
        И НоменклатураДополнительныеРеквизиты.Значение.Наименование = "Образец"
        И ЗаказКлиентаТовары.Ссылка.ПометкаУдаления = ЛОЖЬ
        И НоменклатураДополнительныеРеквизиты.Ссылка.ПометкаУдаления = ЛОЖЬ
    
    СГРУППИРОВАТЬ ПО
        ЗаказКлиентаТовары.Ссылка,
        ЗаказКлиентаТовары.Ссылка.Валюта,
        ЗаказКлиентаТовары.Ссылка.Контрагент,
        НоменклатураДополнительныеРеквизиты.Значение) КАК ВложенныйЗапрос
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриходныйКассовыйОрдер.РасшифровкаПлатежа КАК ПриходныйКассовыйОрдерРасшифровкаПлатежа
        ПО ВложенныйЗапрос.Ссылка = ПриходныйКассовыйОрдерРасшифровкаПлатежа.Заказ
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            РеализацияТоваровУслугТовары.ЗаказКлиента КАК ЗаказКлиента,
            ВложенныйЗапрос1.Сумма КАК СуммаВозврат,
            ВложенныйЗапрос1.Ссылка КАК Возврат
        ИЗ
            Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
                ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                    ВозвратТоваровОтКлиентаТовары.Ссылка КАК Ссылка,
                    СУММА(ВозвратТоваровОтКлиентаТовары.Сумма) КАК Сумма,
                    ВозвратТоваровОтКлиентаТовары.ДокументРеализации КАК ДокументРеализации
                ИЗ
                    Документ.ВозвратТоваровОтКлиента.Товары КАК ВозвратТоваровОтКлиентаТовары
                        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
                        ПО ВозвратТоваровОтКлиентаТовары.Номенклатура = НоменклатураДополнительныеРеквизиты.Ссылка
                ГДЕ
                    ВозвратТоваровОтКлиентаТовары.Ссылка.Проведен = ИСТИНА
                    И НоменклатураДополнительныеРеквизиты.Значение.Наименование = "Образец"
                    И ВозвратТоваровОтКлиентаТовары.Ссылка.ПометкаУдаления = ЛОЖЬ
                    И НоменклатураДополнительныеРеквизиты.Ссылка.ПометкаУдаления = ЛОЖЬ
                
                СГРУППИРОВАТЬ ПО
                    ВозвратТоваровОтКлиентаТовары.Ссылка,
                    ВозвратТоваровОтКлиентаТовары.ДокументРеализации) КАК ВложенныйЗапрос1
                ПО РеализацияТоваровУслугТовары.Ссылка = ВложенныйЗапрос1.ДокументРеализации
        ГДЕ
            РеализацияТоваровУслугТовары.Ссылка.Проведен = ИСТИНА
            И РеализацияТоваровУслугТовары.Ссылка.Проведен = ИСТИНА
            И РеализацияТоваровУслугТовары.Ссылка.ПометкаУдаления = ЛОЖЬ
        
        СГРУППИРОВАТЬ ПО
            РеализацияТоваровУслугТовары.ЗаказКлиента,
            ВложенныйЗапрос1.Ссылка,
            ВложенныйЗапрос1.Сумма) КАК ВЗВозвраты
        ПО ВложенныйЗапрос.Ссылка = ВЗВозвраты.ЗаказКлиента
ГДЕ
    ПриходныйКассовыйОрдерРасшифровкаПлатежа.Ссылка.ПометкаУдаления = ЛОЖЬ

Автор: TohaMonster 25.08.20, 11:56

Если это не запрос для получения динамического списка, то мои советы такие:
1. Попробуйте вместо вложенных запросов использовать временные таблицы
2. С временными таблицами используйте индексы по полям, которые потом будете соединять. Если есть составные поля (Документ.ПриходныйКассовыйОрдер.РасшифровкаПлатежа.Заказ итп), желательно во временной таблице их типизировать
3. Консолью запроса смотрите, сколько записей в каждой из временных таблиц и сколько времени они формируются. И пытаетесь понять, что не так. Возможно, для конкретно Вашей Базы ничего здесь оптимизацией запроса и не сделаешь: быть может, у Вас слишком много Номенклатуры и Заказов? Нужно анализировать

Временные таблицы:
ВТНоменклатураДополнительныеРеквизиты
ВТВложенныйЗапрос
ВТВложенныйЗапрос1
ВТВЗВозвраты
и финальный запрос, где все они соединяются с ПриходныйКассовыйОрдерРасшифровкаПлатежа

Автор: stajer 25.08.20, 12:00

TohaMonster @ Сегодня, 12:56 * ,
Спасибо за совет. Попробую переделать запрос и подумаю что еще можно сделать.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua