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




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

                 |    РасходнаяНакладнаяСостав.Количество - ISNULL(ПриходнаяНакладнаяСостав.Количество, 0) КАК Разница
                 |ИЗ
                 |    Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
                 |ЛЕВОЕ СОЕДИНЕНИЕ
                 |    Документ.ПриходнаяНакладная.Состав КАК ПриходнаяНакладнаяСостав
                 |ПО
                 |    РасходнаяНакладнаяСостав.Номенклатура = ПриходнаяНакладнаяСостав
2 Nemirov
 
29.01.20
10:08
(1)  Поле не найдено "ПриходнаяНакладнаяСостав"
РасходнаяНакладнаяСостав.Номенклатура = <<?>>ПриходнаяНакладнаяСостав
3 JeHer
 
29.01.20
10:23
(2) ну в (1) скорее всего накидал на коленке.

                 |    РасходнаяНакладнаяСостав.Количество - ISNULL(ПриходнаяНакладнаяСостав.Количество, 0) КАК Разница
                 |ИЗ
                 |    Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
                 |    Документ.ПриходнаяНакладная.Состав КАК ПриходнаяНакладнаяСостав
                 |ЛЕВОЕ СОЕДИНЕНИЕ
                 |    Документ.ПриходнаяНакладная.Состав КАК ПриходнаяНакладнаяСостав
                 |ПО
                 |    РасходнаяНакладнаяСостав.Номенклатура = ПриходнаяНакладнаяСостав.Номенклатура

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


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

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

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