Имя: Пароль:
1C
 
Количество остаток равно null
0 Tolstiy Beremenniy
 
20.12.18
12:21
Почему в переборе идет количество остаток null первой, как правильно переделать запрос? Там же идет преобразование ЕСТЬNULL !


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

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

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

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

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

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

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