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

Количество остаток равно null

Количество остаток равно null
Я
   TolstiyBeremenniy
 
20.12.18 - 12:21
Почему в переборе идет количество остаток null первой, как правильно переделать запрос? Там же идет преобразование ЕСТЬNULL !


    Запрос.Текст = "
        |ВЫБРАТЬ
        |    ПеремещениеТоваровСписокНоменклатуры.Номенклатура КАК Номенклатура,
        |    ПеремещениеТоваровСписокНоменклатуры.Партия КАК Партия,
        |    ПеремещениеТоваровСписокНоменклатуры.Цена КАК Цена,
        |    СУММА(ПеремещениеТоваровСписокНоменклатуры.Количество) КАК Количество,
        |    ПеремещениеТоваровСписокНоменклатуры.Ссылка КАК Ссылка
        |ПОМЕСТИТЬ ВТ_ДокТч
        |ИЗ
        |    Документ.ПеремещениеТоваров.СписокНоменклатуры КАК ПеремещениеТоваровСписокНоменклатуры
        |ГДЕ
        |    ПеремещениеТоваровСписокНоменклатуры.Ссылка = &Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |    ПеремещениеТоваровСписокНоменклатуры.Номенклатура,
        |    ПеремещениеТоваровСписокНоменклатуры.Партия,
        |    ПеремещениеТоваровСписокНоменклатуры.Цена,
        |    ПеремещениеТоваровСписокНоменклатуры.Ссылка
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ВТ_ДокТч.Номенклатура КАК Номенклатура,
        |    ВТ_ДокТч.Партия КАК Партия,
        |    МАКСИМУМ(ВТ_ДокТч.Количество) КАК Количество,
        |    СУММА(ЕСТЬNULL(ПродуктыНаСкладахОстатки.КоличествоОстаток, 0)) КАК КоличествоОстаток
        |ИЗ
        |    ВТ_ДокТч КАК ВТ_ДокТч
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПродуктыНаСкладах.Остатки(
        |                &Период,
        |                Номенклатура В
        |                        (ВЫБРАТЬ РАЗЛИЧНЫЕ
        |                            ВТ_ДокТч.Номенклатура
        |                        ИЗ
        |                            ВТ_ДокТч КАК ВТ_ДокТч)
        |                    И Партия В
        |                        (ВЫБРАТЬ РАЗЛИЧНЫЕ
        |                            ВТ_ДокТч.Партия
        |                        ИЗ
        |                            ВТ_ДокТч КАК ВТ_ДокТч)
        |                    И Склад = &СкладИсточник) КАК ПродуктыНаСкладахОстатки
        |        ПО ВТ_ДокТч.Номенклатура = ПродуктыНаСкладахОстатки.Номенклатура
        |            И ВТ_ДокТч.Партия = ПродуктыНаСкладахОстатки.Партия
        |
        |СГРУППИРОВАТЬ ПО
        |    ВТ_ДокТч.Номенклатура,
        |    ВТ_ДокТч.Партия
        |ИТОГИ
        |    СУММА(Количество)
        |ПО
        |    Номенклатура,
        |    Партия";
    Запрос.УстановитьПараметр("Период",        Дата);
    Запрос.УстановитьПараметр("Ссылка",        Ссылка);
    Запрос.УстановитьПараметр("СкладИсточник", СкладИсточник);
    Результат             = Запрос.Выполнить();
    ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаНоменклатура.Следующий() Цикл
        Если ВыборкаНоменклатура.Количество > ВыборкаНоменклатура.КоличествоОстаток Тогда
 
 
   Кир Пластелинин
 
1 - 20.12.18 - 12:24
а в общие итоги кто будет добавлять КоличествоОстаток?
   TolstiyBeremenniy
 
2 - 20.12.18 - 12:38
Как ещё можно сделать, если в тч указана партия что бы списывалось сначала с неё, а потом с других?
   Alexandr_U1982
 
3 - 20.12.18 - 12:47
Попробуй, вот так:

        |ВЫБРАТЬ
        |    ВТ_ДокТч.Номенклатура КАК Номенклатура,
        |    ВТ_ДокТч.Партия КАК Партия,
        |    МАКСИМУМ(ВТ_ДокТч.Количество) КАК Количество,
        |    СУММА(ЕСТЬNULL(ПродуктыНаСкладахОстатки.КоличествоОстаток, 0)) КАК КоличествоОстаток
        |ИЗ
        |    ВТ_ДокТч КАК ВТ_ДокТч
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПродуктыНаСкладах.Остатки(
        |                &Период,
        |                 Склад = &СкладИсточник
        |                И (Номенклатура, Партия) В
        |                        (ВЫБРАТЬ РАЗЛИЧНЫЕ
        |                            ВТ_ДокТч.Номенклатура,
        |                             ВТ_ДокТч.Партия
        |                        ИЗ
        |                            ВТ_ДокТч КАК ВТ_ДокТч)
        |                    ) КАК ПродуктыНаСкладахОстатки
        |        ПО ВТ_ДокТч.Номенклатура = ПродуктыНаСкладахОстатки.Номенклатура
        |            И ВТ_ДокТч.Партия = ПродуктыНаСкладахОстатки.Партия
        |
        |СГРУППИРОВАТЬ ПО
        |    ВТ_ДокТч.Номенклатура,
        |    ВТ_ДокТч.Партия
        |ИТОГИ
        |    СУММА(Количество),
        |     СУММА(КоличествоОстаток)
        |ПО
        |    Номенклатура,
        |    Партия";
   TolstiyBeremenniy
 
4 - 20.12.18 - 12:50
(3) Это скомпонованный вариант (0) ?

А как списывать с партии что в тч документа? А потом по остальным?
   Ненавижу 1С
 
5 - 20.12.18 - 12:50
конструкция типа СУММА(ЕСТЬNULL(Чтото, 0)) бессмысленна
надо так: ЕСТЬNULL(СУММА(Чтото), 0)
   RomanYS
 
6 - 20.12.18 - 12:55
(5) почему? Оба варианта рабочие
   Ненавижу 1С
 
7 - 20.12.18 - 13:45
(6) они разные
   VladZ
 
8 - 20.12.18 - 13:58
(5) ЕСТЬNULL(СУММА(Чтото), 0) - так не надо. Если в какой то записи в "Что-то" будет null - весь итог у нас будет null.
   Ненавижу 1С
 
9 - 20.12.18 - 14:36
(8) зачем говоришь неправду?
   RomanYS
 
10 - 20.12.18 - 14:39
(8) нет.
 
 Рекламное место пустует
   RomanYS
 
11 - 20.12.18 - 14:47
(7) это понятно, почему "бессмысленна"?
Написал и сам осознал:
СУММА(ЕСТЬNULL(Чтото, 0)) == СУММА(Чтото)
   Ненавижу 1С
 
12 - 20.12.18 - 15:17
(11) кстати нет, например если всего одна запись со значением NULL:
СУММА(ЕСТЬNULL(Чтото, 0)) => 0
СУММА(Чтото) => NULL
   RomanYS
 
13 - 20.12.18 - 15:23
(12)
ХЗ у меня в такой ситуации (всего одна запись со значением NULL) стабильно падает 8.3.9.2170:
Ошибка SDBL: Недопустимое преобразование типов.
   RomanYS
 
14 - 20.12.18 - 15:27
(13) падает СУММА(ЕСТЬNULL(Чтото, 0)), 
а СУММА(Чтото) - да возвращает NULL
   TolstiyBeremenniy
 
15 - 21.12.18 - 04:01
Почему вот в этой выборке задваивается движение списания?
Почему 2 раза????

    Движения.ПродуктыНаСкладах.Записывать = Истина;
    Запрос                                 = Новый Запрос;
    Запрос.Текст                           = "
        |ВЫБРАТЬ
        |    ПеремещениеТоваровСписокНоменклатуры.Номенклатура        КАК Номенклатура,
        |    ПеремещениеТоваровСписокНоменклатуры.Партия            КАК Партия,
        |    ПеремещениеТоваровСписокНоменклатуры.Цена                КАК Цена,
        |    СУММА(ПеремещениеТоваровСписокНоменклатуры.Количество) КАК Количество,
        |    ПеремещениеТоваровСписокНоменклатуры.Ссылка            КАК Ссылка
        |ПОМЕСТИТЬ ВТ_ДокТч
        |ИЗ
        |    Документ.ПеремещениеТоваров.СписокНоменклатуры КАК ПеремещениеТоваровСписокНоменклатуры
        |ГДЕ
        |    ПеремещениеТоваровСписокНоменклатуры.Ссылка = &Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |    ПеремещениеТоваровСписокНоменклатуры.Номенклатура,
        |    ПеремещениеТоваровСписокНоменклатуры.Партия,
        |    ПеремещениеТоваровСписокНоменклатуры.Цена,
        |    ПеремещениеТоваровСписокНоменклатуры.Ссылка
        |;
        |
        ////////////////////////////////////////////////////////////////////////////////

        |ВЫБРАТЬ
        |    ВТ_ДокТч.Номенклатура                                    КАК Номенклатура,
        |    ВТ_ДокТч.Партия                                         КАК Партия,
        |    ВТ_ДокТч.Цена                                             КАК Цена,
        |    ВТ_ДокТч.Количество                                     КАК Количество,
        |    ЕСТЬNULL(ПродуктыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток
        |ИЗ
        |    ВТ_ДокТч КАК ВТ_ДокТч
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПродуктыНаСкладах.Остатки(
        |                &Период,
        |                Номенклатура В
        |                        (ВЫБРАТЬ РАЗЛИЧНЫЕ
        |                            ВТ_ДокТч.Номенклатура
        |                        ИЗ
        |                            ВТ_ДокТч КАК ВТ_ДокТч)
        |                        И Партия В
        |                        (ВЫБРАТЬ РАЗЛИЧНЫЕ
        |                            ВТ_ДокТч.Партия
        |                        ИЗ
        |                            ВТ_ДокТч КАК ВТ_ДокТч)
        |                    И Склад = &СкладИсточник) КАК ПродуктыНаСкладахОстатки
        |        ПО ВТ_ДокТч.Номенклатура = ПродуктыНаСкладахОстатки.Номенклатура
        |            И ВТ_ДокТч.Партия = ПродуктыНаСкладахОстатки.Партия
        |
        |УПОРЯДОЧИТЬ ПО
        |    ВТ_ДокТч.Номенклатура
        |ИТОГИ
        |    СУММА(Количество),
        |    СУММА(КоличествоОстаток)
        |ПО
        |    Номенклатура,
        |    Партия";
    Запрос.УстановитьПараметр("Период",        Дата);
    Запрос.УстановитьПараметр("Ссылка",        Ссылка);
    Запрос.УстановитьПараметр("СкладИсточник", СкладИсточник);
    Результат             = Запрос.Выполнить();
    ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаНоменклатура.Следующий() Цикл
        Если ВыборкаНоменклатура.Количество > ВыборкаНоменклатура.КоличествоОстаток Тогда
             Сообщение       = Новый СообщениеПользователю;
             Сообщение.Текст = "Товара " + ВыборкаНоменклатура.Номенклатура + " на складе " + СкладИсточник + " недостаточно. На остатке:"+ ВыборкаНоменклатура.КоличествоОстаток;
             Сообщение.Сообщить();
             Отказ = Истина;
             Продолжить;
        КонецЕсли; 
        Выборка = ВыборкаНоменклатура.Выбрать();
        Пока Выборка.Следующий()  цикл
            Движение              = Движения.ПродуктыНаСкладах.Добавить();
            Движение.ВидДвижения  = ВидДвиженияНакопления.Расход;
            Движение.Период       = Дата;
            Движение.Склад        = СкладИсточник;
            Движение.Номенклатура = Выборка.Номенклатура;
            Движение.Партия       = Выборка.Партия;
            Движение.Количество   = Выборка.Количество;
            Движение.Цена         = Выборка.Цена;
        КонецЦикла;
        //

        Движение              = Движения.ПродуктыНаСкладах.Добавить();
        Движение.ВидДвижения  = ВидДвиженияНакопления.Приход;
        Движение.Период       = Дата;
        Движение.Склад        = СкладПриемник;
        Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура;
        Движение.Партия       = ВыборкаНоменклатура.Партия;
        Движение.Количество   = ВыборкаНоменклатура.Количество;
        Движение.Цена         = ВыборкаНоменклатура.Цена;
    КонецЦикла;
    //
   TolstiyBeremenniy
 
16 - 21.12.18 - 04:21
(15) Что то с запросом не то ((((((
   TolstiyBeremenniy
 
17 - 21.12.18 - 04:31
Из за чего такая дурная выборка. запросом (15) ?

http://joxi.ru/Dr8XEbyU40xwJr
   TolstiyBeremenniy
 
18 - 21.12.18 - 04:42
Как обходить такую выборку, что бы записи не задваивались
по партии?????

http://joxi.ru/E2pjgl1i9Q5ler
   TolstiyBeremenniy
 
19 - 21.12.18 - 04:50
(18) Как избавиться от задвоенных записей?
Или как их так отбирать без задвоения?
   TolstiyBeremenniy
 
20 - 21.12.18 - 04:59
Так не задваивает.

        |ВЫБРАТЬ
        |    ПеремещениеТоваровСписокНоменклатуры.Номенклатура КАК Номенклатура,
        |    ПеремещениеТоваровСписокНоменклатуры.Партия КАК Партия,
        |    МАКСИМУМ(ПеремещениеТоваровСписокНоменклатуры.Цена) КАК Цена,
        |    МАКСИМУМ(ПеремещениеТоваровСписокНоменклатуры.Количество) КАК Количество
        |ПОМЕСТИТЬ ВТ_ДокТч
        |ИЗ
        |    Документ.ПеремещениеТоваров.СписокНоменклатуры КАК ПеремещениеТоваровСписокНоменклатуры
        |ГДЕ
        |    ПеремещениеТоваровСписокНоменклатуры.Ссылка = &Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |    ПеремещениеТоваровСписокНоменклатуры.Номенклатура,
        |    ПеремещениеТоваровСписокНоменклатуры.Партия
        |;
        |
        ////////////////////////////////////////////////////////////////////////////////

        |ВЫБРАТЬ
        |    ВТ_ДокТч.Номенклатура КАК Номенклатура,
        |    ВТ_ДокТч.Партия КАК Партия,
        |    МАКСИМУМ(ВТ_ДокТч.Цена) КАК Цена,
        |    МАКСИМУМ(ВТ_ДокТч.Количество) КАК Количество,
        |    СУММА(ЕСТЬNULL(ПродуктыНаСкладахОстатки.КоличествоОстаток, 0)) КАК КоличествоОстаток
        |ИЗ
        |    ВТ_ДокТч КАК ВТ_ДокТч
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПродуктыНаСкладах.Остатки(
        |                &Период,
        |                Номенклатура В
        |                        (ВЫБРАТЬ РАЗЛИЧНЫЕ
        |                            ВТ_ДокТч.Номенклатура
        |                        ИЗ
        |                            ВТ_ДокТч КАК ВТ_ДокТч)
        |                    И Партия В
        |                        (ВЫБРАТЬ РАЗЛИЧНЫЕ
        |                            ВТ_ДокТч.Партия
        |                        ИЗ
        |                            ВТ_ДокТч КАК ВТ_ДокТч)
        |                    И Склад = &СкладИсточник) КАК ПродуктыНаСкладахОстатки
        |        ПО ВТ_ДокТч.Номенклатура = ПродуктыНаСкладахОстатки.Номенклатура
        |            И ВТ_ДокТч.Партия = ПродуктыНаСкладахОстатки.Партия
        |
        |СГРУППИРОВАТЬ ПО
        |    ВТ_ДокТч.Номенклатура,
        |    ВТ_ДокТч.Партия
        |
        |УПОРЯДОЧИТЬ ПО
        |    ВТ_ДокТч.Номенклатура
        |ИТОГИ
        |    МАКСИМУМ(Количество),
        |    СУММА(КоличествоОстаток)
        |ПО
        |    Номенклатура";
   Jokerman
 
21 - 21.12.18 - 07:51
Выборка = ВыборкаНоменклатура.Выбрать();
здеся тоже ОбходРезультатаЗапроса.ПоГруппировкам добавь


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует