Вход | Регистрация
 

Вопрос по реализации условия

Вопрос по реализации условия
Я
   Nemirov
 
29.01.20 - 09:27
Ребят есть запрос: выводятся все расходные накладные где они есть в основании у приходных. Так Же выведена колонка с разницей в количестве. Но загвоздка в том что в условии стоит Расх.Номенклатура = Приход.Номенклатура и в эти поля не входят те карточки номенклатуры "которые есть в расходной накладной" но нет "в приходе". Как сделать условие так что бы это тоже учитывалось, вычислив какой номенклатуры нет в приходе указав разницу в количестве, предполагаю условие с пустой ссылкой(Когда расх.номенкл = Прих.номенклат.пустаяссылка тогда...) но не пойму как это реализовать.  Заранее спасибо! Запрос может быть корявеньким я студент, не придирайтесь сильно(.




      Запрос=Новый Запрос();
    Запрос.Текст="ВЫБРАТЬ
                 |    РасходнаяНакладнаяСостав.Ссылка КАК Документ,
                 |    РасходнаяНакладнаяСостав.Номенклатура КАК Номенклатура,
                 |    РасходнаяНакладнаяСостав.Количество КАК Количество,
                 |    РасходнаяНакладнаяСостав.Коэффициент КАК Коэффициент,
                 |    ПриходнаяНакладнаяСостав.Количество - РасходнаяНакладнаяСостав.Количество КАК Разница,
                 |    РасходнаяНакладнаяСостав.Ссылка.Дата КАК Дата
                 |ИЗ
                 |    Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав,
                 |    Документ.ПриходнаяНакладная.Состав КАК ПриходнаяНакладнаяСостав
                 |ГДЕ
                 |    ПриходнаяНакладнаяСостав.Ссылка.ДокОснование = РасходнаяНакладнаяСостав.Ссылка
                 |    И РасходнаяНакладнаяСостав.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
                 |    И РасходнаяНакладнаяСостав.Ссылка.Проведен = ИСТИНА
                 |    И РасходнаяНакладнаяСостав.Номенклатура = ПриходнаяНакладнаяСостав.Номенклатура";
    
    //Запрос.УстановитьПараметр("МоментВремени",ТекущаяДатаСеанса());
    Запрос.УстановитьПараметр("ДатаНач",НачалоДня(ДатаНач));
    Запрос.УстановитьПараметр("ДатаКон",КонецДня(ДатаКон));
    //Запрос.УстановитьПараметр("Контрагент",Контрагент);
Документы=Запрос.Выполнить().Выгрузить();
    ЭлементыФормы.Документы.СоздатьКолонки();
   KolPecivanovich
 
1 - 29.01.20 - 09:55
используйте ЛЕВОЕ СОЕДИНЕНИЕ для связи таблиц, как то так:
                 |    РасходнаяНакладнаяСостав.Количество - ISNULL(ПриходнаяНакладнаяСостав.Количество, 0) КАК Разница
                 |ИЗ 
                 |    Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
                 |ЛЕВОЕ СОЕДИНЕНИЕ
                 |    Документ.ПриходнаяНакладная.Состав КАК ПриходнаяНакладнаяСостав 
                 |ПО
                 |    РасходнаяНакладнаяСостав.Номенклатура = ПриходнаяНакладнаяСостав
   Nemirov
 
2 - 29.01.20 - 10:08
(1)  Поле не найдено "ПриходнаяНакладнаяСостав"
РасходнаяНакладнаяСостав.Номенклатура = <<?>>ПриходнаяНакладнаяСостав
   JeHer
 
3 - 29.01.20 - 10:23
(2) ну в (1) скорее всего накидал на коленке.
                 |    РасходнаяНакладнаяСостав.Количество - ISNULL(ПриходнаяНакладнаяСостав.Количество, 0) КАК Разница
                 |ИЗ 
                 |    Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
                 |    Документ.ПриходнаяНакладная.Состав КАК ПриходнаяНакладнаяСостав
                 |ЛЕВОЕ СОЕДИНЕНИЕ
                 |    Документ.ПриходнаяНакладная.Состав КАК ПриходнаяНакладнаяСостав 
                 |ПО
                 |    РасходнаяНакладнаяСостав.Номенклатура = ПриходнаяНакладнаяСостав.Номенклатура 

Как-то так.
   Nemirov
 
4 - 29.01.20 - 10:35
(3) Скорей всего может и так, но вопрос не решен в плане того что Если номенклатура отсутствует в приходной накладной а в расходной она есть, вычисления не производятся эта строка пропускается и не выводится потому что условие стоит


|      РасходнаяНакладнаяСостав.Номенклатура = ПриходнаяНакладнаяСостав.Номенклатура

В вычисления попадает Номенклатура которая попадает под это условие
   catena
 
5 - 29.01.20 - 11:37
(4)Показывай, что получилось после исправления. И никогда больше не используй кросс-соединение.
   Nemirov
 
6 - 29.01.20 - 14:09
(5) Если ЭлементыФормы.Отметка.Значение = ИСТИНА Тогда
    Запрос=Новый Запрос();
    Запрос.Текст="ВЫБРАТЬ
                 |    РасходнаяНакладнаяСостав.Номенклатура КАК Номенклатура,
                 |    РасходнаяНакладнаяСостав.Количество - ЕСТЬNULL(ПриходнаяНакладнаяСостав.Количество, 0) КАК Разница,
                 |    РасходнаяНакладнаяСостав.Ссылка КАК Документ
                 |ИЗ
                 |    Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
                 |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриходнаяНакладная.Состав КАК ПриходнаяНакладнаяСостав
                 |        ПО РасходнаяНакладнаяСостав.Номенклатура = ПриходнаяНакладнаяСостав.Номенклатура
                 |            И РасходнаяНакладнаяСостав.Ссылка = ПриходнаяНакладнаяСостав.Ссылка.ДокОснование
                 |ГДЕ
                |    РасходнаяНакладнаяСостав.Количество - ЕСТЬNULL(ПриходнаяНакладнаяСостав.Количество, 0) <> 0
                 |     И РасходнаяНакладнаяСостав.Ссылка.Контрагент ССЫЛКА Справочник.СтруктурныеЕдиницы
                 |    И (&НеПроверятьДата
                 |            ИЛИ РасходнаяНакладнаяСостав.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон)
                 |    И (&НеПроверятьКонтрагент
                 |            ИЛИ РасходнаяНакладнаяСостав.Ссылка.Контрагент = &СтруктурнаяЕдиница)
                |    И РасходнаяНакладнаяСостав.Ссылка.Проведен = ИСТИНА
              //  |    И ПриходнаяНакладнаяСостав.Ссылка.Проведен = ИСТИНА

                 |";
    Если НЕ ПараметрыСеанса.ТекущаяСтруктурнаяЕдиница = Справочники.СтруктурныеЕдиницы.НайтиПоКоду("1")Тогда
        ЭлементыФормы.Контрагент.Значение = ПараметрыСеанса.ТекущаяСтруктурнаяЕдиница;
        ЭлементыФормы.Контрагент.Доступность = ЛОЖЬ;
    КонецЕсли;
    //Запрос.УстановитьПараметр("МоментВремени",ТекущаяДатаСеанса());

    Запрос.УстановитьПараметр("ДатаНач",НачалоДня(ДатаНач));
    Запрос.УстановитьПараметр("ДатаКон",КонецДня(ДатаКон));
    Запрос.УстановитьПараметр("СтруктурнаяЕдиница",Контрагент);
    
    Если Не ЗначениеЗаполнено(Контрагент) Тогда
        Запрос.УстановитьПараметр("НеПроверятьКонтрагент", Истина);

    Иначе
        Запрос.УстановитьПараметр("НеПроверятьКонтрагент", Ложь);
    КонецЕсли;    
    Если Не ЗначениеЗаполнено(ДатаНач) Тогда
        Запрос.УстановитьПараметр("НеПроверятьДата", Истина);
    Иначе
        Запрос.УстановитьПараметр("НеПроверятьДата", Ложь);
    КонецЕсли;    
    Если Не ЗначениеЗаполнено(ДатаКон) Тогда
        Запрос.УстановитьПараметр("НеПроверятьДата", Истина);
    Иначе
        Запрос.УстановитьПараметр("НеПроверятьДата", Ложь);
    КонецЕсли;
    Документы=Запрос.Выполнить().Выгрузить();
    ЭлементыФормы.Документы.СоздатьКолонки();
   catena
 
7 - 30.01.20 - 05:15
(4)Должно все выводиться. Может наоборот, потерял товар, который есть только в приходе?
   Nemirov
 
8 - 30.01.20 - 08:39
(7) Да все четко благодарю

Список тем форума
Рекламное место пустует  Рекламное место пустует
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.