Имя: Пароль:
1C
 
Хелп по вложенным запросам
0 Nemirov
 
27.01.20
10:55
Имеется запрос с вложенными запросами и виртуальной таблицей... (Студент) Дали задание вывести в таблицу значений Номенклатуру которая отсутствует в приходной накладной сравнивая с расходной(через флажок на форме). Я не прошу писать мне запрос просто помогите словом как правильно сделать? с этими вложенными запросами не могу разобраться в каком месте нужно обратить внимание и как сделать. Запрос корявый непонятный.
1 Nemirov
 
27.01.20
10:56
Процедура ВыполнитьЗапросРН()
    
    Текст = "ВЫБРАТЬ
    |    РасходнаяНакладная.Ссылка КАК Ссылка,
    |    РасходнаяНакладная.Дата КАК Дата,
    |    РасходнаяНакладная.Фирма КАК Фирма,
    |    РасходнаяНакладная.Контрагент КАК СтруктурнаяЕдиница,
    |    РасходнаяНакладная.Склад КАК Склад
    |ПОМЕСТИТЬ тРасходныеНакладные
    |ИЗ                                          
    |    Документ.РасходнаяНакладная КАК РасходнаяНакладная
    |ГДЕ
    |    РасходнаяНакладная.Контрагент ССЫЛКА Справочник.СтруктурныеЕдиницы
    |    И (&НеПроверятьДата
    |            ИЛИ РасходнаяНакладная.Дата МЕЖДУ &ДатаНач И &ДатаКон)
    |    И (&НеПроверятьКонтрагент
    |            ИЛИ РасходнаяНакладная.Контрагент = &Контрагент)
    |    И РасходнаяНакладная.Проведен
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    тРасходныеНакладные.Ссылка КАК Документ,
    |    тРасходныеНакладные.Фирма КАК Фирма,
    |    &СтруктурнаяЕдиница КАК Контрагент,
    |    тРасходныеНакладные.Дата КАК Дата
    |ИЗ
    ///////////////////////////////////////////////////////////ВЛОЖЕННЫЙ ЗАПРОС//////////////////////////////////////////////////////
    |    (ВЫБРАТЬ
    |        ВложенныйЗапрос.Ссылка КАК Ссылка,
    |        ВложенныйЗапрос.Номенклатура КАК Номенклатура,
    |        ВложенныйЗапрос.ХарактеристикаПартия КАК ХарактеристикаПартия,
    |        СУММА(ВложенныйЗапрос.Количество) КАК Количество
    |    ИЗ
    |        (ВЫБРАТЬ
    |            РасходнаяНакладнаяСостав.Ссылка КАК Ссылка,
    |            РасходнаяНакладнаяСостав.Номенклатура КАК Номенклатура,
    |            ВЫБОР
    |                КОГДА РасходнаяНакладнаяСостав.ХарактеристикаПартия = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
    |                        ИЛИ РасходнаяНакладнаяСостав.ХарактеристикаПартия = ЗНАЧЕНИЕ(Справочник.Партии.ПустаяСсылка)
    |                    ТОГДА НЕОПРЕДЕЛЕНО
    |                ИНАЧЕ РасходнаяНакладнаяСостав.ХарактеристикаПартия
    |            КОНЕЦ КАК ХарактеристикаПартия,
    |            РасходнаяНакладнаяСостав.Количество * РасходнаяНакладнаяСостав.Коэффициент КАК Количество
    |        ИЗ
    |            тРасходныеНакладные КАК тРасходныеНакладные
    |                ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
    |                ПО тРасходныеНакладные.Ссылка = РасходнаяНакладнаяСостав.Ссылка
    |        
    |        ОБЪЕДИНИТЬ ВСЕ
    |        
    |        ВЫБРАТЬ
    |            ПриходнаяНакладная.ДокОснование,
    |            ПриходнаяНакладнаяСостав.Номенклатура,
    |            ВЫБОР
    |                КОГДА ТИПЗНАЧЕНИЯ(ПриходнаяНакладнаяСостав.ХарактеристикаПартия) = ТИП(ДАТА)
    |                        ИЛИ ПриходнаяНакладнаяСостав.ХарактеристикаПартия = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
    |                        ИЛИ ПриходнаяНакладнаяСостав.ХарактеристикаПартия = ЗНАЧЕНИЕ(Справочник.Партии.ПустаяСсылка)
    |                    ТОГДА НЕОПРЕДЕЛЕНО
    |                ИНАЧЕ ПриходнаяНакладнаяСостав.ХарактеристикаПартия
    |            КОНЕЦ,
    |            -(ПриходнаяНакладнаяСостав.Количество * ПриходнаяНакладнаяСостав.Коэффициент)
    |        ИЗ
    |            Документ.ПриходнаяНакладная.Состав КАК ПриходнаяНакладнаяСостав
    |                ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПриходнаяНакладная КАК ПриходнаяНакладная
    |                    ВНУТРЕННЕЕ СОЕДИНЕНИЕ тРасходныеНакладные КАК тРасходныеНакладные
    |                    ПО ПриходнаяНакладная.ДокОснование = тРасходныеНакладные.Ссылка
    |                ПО ПриходнаяНакладнаяСостав.Ссылка = ПриходнаяНакладная.Ссылка
    |        ГДЕ
    |            ПриходнаяНакладная.Проведен) КАК ВложенныйЗапрос
    |    
    |    СГРУППИРОВАТЬ ПО
    |        ВложенныйЗапрос.Ссылка,
    |        ВложенныйЗапрос.Номенклатура,
    |        ВложенныйЗапрос.ХарактеристикаПартия
    |    
    |    ИМЕЮЩИЕ
    |        СУММА(ВложенныйЗапрос.Количество) > 0) КАК ВложенныйЗапрос
    |        ЛЕВОЕ СОЕДИНЕНИЕ тРасходныеНакладные КАК тРасходныеНакладные
    |        ПО ВложенныйЗапрос.Ссылка = тРасходныеНакладные.Ссылка
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    |    ВложенныйЗапрос.Документ.Ссылка,
    |    ВложенныйЗапрос.Документ.Фирма,
    |    ВложенныйЗапрос.Документ.СтруктурнаяЕдиницаПолучатель,
    |    ВложенныйЗапрос.Документ.Дата
    |ИЗ
    |    (ВЫБРАТЬ
    |        ВложенныйЗапрос.Ссылка КАК Документ
    |    ИЗ
    |        (ВЫБРАТЬ
    |            ПринятиеКУчетуСостав.Номенклатура КАК Номенклатура,
    |            МАКСИМУМ(ПринятиеКУчетуСостав.Количество) КАК КоличествоРасход,
    |            ПринятиеКУчетуСостав.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
    |            СУММА(ПриходнаяНакладнаяСостав.Количество) КАК КоличествоПриход,
    |            ПринятиеКУчетуСостав.Ссылка КАК Ссылка
    |        ИЗ
    |            Документ.ОжидаемаяПоставка.Состав КАК ПринятиеКУчетуСостав
    |                ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриходнаяНакладная.Состав КАК ПриходнаяНакладнаяСостав
    |                ПО ПринятиеКУчетуСостав.Ссылка = ПриходнаяНакладнаяСостав.Ссылка.ДокОснование
    |                    И (ПриходнаяНакладнаяСостав.Ссылка.Проведен)
    |        ГДЕ
    |            ПринятиеКУчетуСостав.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
    |            И ПринятиеКУчетуСостав.Ссылка.Проведен
    |            И ПринятиеКУчетуСостав.Ссылка.СтруктурнаяЕдиницаПолучатель = &СтруктурнаяЕдиница
    |        
    |        СГРУППИРОВАТЬ ПО
    |            ПринятиеКУчетуСостав.ЕдиницаИзмерения,
    |            ПринятиеКУчетуСостав.Номенклатура,
    |            ПринятиеКУчетуСостав.Ссылка) КАК ВложенныйЗапрос
    |    ГДЕ
    |        ЕСТЬNULL(ВложенныйЗапрос.КоличествоПриход, 0) = 0
    |    
    |    СГРУППИРОВАТЬ ПО
    |        ВложенныйЗапрос.Ссылка) КАК ВложенныйЗапрос
    |
    |УПОРЯДОЧИТЬ ПО
    |    Дата";
    
    
    
    Запрос=Новый Запрос();
    Запрос.Текст=Текст;
    
    Если НЕ ПараметрыСеанса.ТекущаяСтруктурнаяЕдиница = Справочники.СтруктурныеЕдиницы.НайтиПоКоду("1")Тогда
        ЭлементыФормы.Контрагент.Значение = ПараметрыСеанса.ТекущаяСтруктурнаяЕдиница;
        ЭлементыФормы.Контрагент.Доступность = ЛОЖЬ;
    КонецЕсли;
    
    Запрос.УстановитьПараметр("МоментВремени",ТекущаяДатаСеанса());
    Запрос.УстановитьПараметр("ДатаНач",НачалоДня(ДатаНач));
    Запрос.УстановитьПараметр("ДатаКон",КонецДня(ДатаКон));
    Запрос.УстановитьПараметр("Контрагент",Контрагент);
    Запрос.УстановитьПараметр("СтруктурнаяЕдиница",Контрагент);
    Если Не ЗначениеЗаполнено(Контрагент) Тогда
        Запрос.УстановитьПараметр("НеПроверятьКонтрагент", Истина);
    Иначе
        Запрос.УстановитьПараметр("НеПроверятьКонтрагент", Ложь);
    КонецЕсли;    
    Если Не ЗначениеЗаполнено(ДатаНач) Тогда
        Запрос.УстановитьПараметр("НеПроверятьДата", Истина);
    Иначе
        Запрос.УстановитьПараметр("НеПроверятьДата", Ложь);
    КонецЕсли;    
    Если Не ЗначениеЗаполнено(ДатаКон) Тогда
        Запрос.УстановитьПараметр("НеПроверятьДата", Истина);
    Иначе
        Запрос.УстановитьПараметр("НеПроверятьДата", Ложь);
    КонецЕсли;
    Документы=Запрос.Выполнить().Выгрузить();
    ЭлементыФормы.Документы.СоздатьКолонки();
КонецПроцедуры
2 Nemirov
 
27.01.20
11:01
Запрос показывает некорректные перемещения
3 fisher
 
27.01.20
11:16
Этот запрос дали для примера? Там внутри есть подходящий блок.
Одним подзапросом выбираются расходы (количество с плюсом), другим подзапросом приходы на основании расходов (количество с минусом).
Затем результаты этих подзапросов объединяются и полученное объединение группируется по документу расхода, при этом отбираются только те результаты группировки (ИМЕЮЩИЕ), для которых "схлопнутое" количество больше нуля (т.е. отсеиваются все приходы/расходы, где расход и приход на основании этого расхода имеют одинаковое количество. Остаются только те строки/документы расходов, которые "не покрыты" приходами на основании этих расходов).
4 fisher
 
27.01.20
11:19
Это аналогично тому, как засунуть в таблицу значений строки расходов с плюсом, затем строки приходов с минусом, выполнить "Свернуть" с итогами по количеству и отобрать из результата строки с положительным количеством.
5 Nemirov
 
27.01.20
11:30
(4) Про какой блок вы говорите? Да для примера.
6 Nemirov
 
27.01.20
11:31
Точнее этот запрос дали мне для того что бы я вывел номенклатуру (строки/документы расходов) которые не покрыты приходами на основании этих расходов как вы сказали.
7 Nemirov
 
27.01.20
11:32
То есть в таком виде мы видим только ссылки документов,а необходимо некорректные значения из документа выводить
8 Nemirov
 
27.01.20
11:35
ИМЕЮЩИЕ
    |        СУММА(ВложенныйЗапрос.Количество) > 0) КАК ВложенныйЗапрос


/////////////////Эти 2 блока?//////////////////////////


|    ГДЕ
    |        ЕСТЬNULL(ВложенныйЗапрос.КоличествоПриход, 0) = 0
9 fisher
 
27.01.20
11:45
(8) Второй анализирует расхождения приходов с ожидаемыми поставками. А тебе вроде ж сказано расходов с приходами. Я про первый блок, который заканчивается на ИМЕЮЩИЕ и группирует результат объединения подзапросов по приходам и по расходам. Ты говоришь "не прошу писать мне запрос", но похоже что к тому идет :)
10 Nemirov
 
27.01.20
11:56
(9) Да нет  зачем мне вас заморачивать.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой