Имя: Пароль:
1C
 
Помогите разобраться с запросом по остаткам и продажам УТ 10.3
0 Krasotka
 
04.05.22
11:24
Есть отчет, который работает правильно, я беру оттуда запрос, немного переделываю, вставляю в обработку и он начинает неправильно работать, показывает по каждой номенклатуре 5 строчек вместо 1. В чем может быть причина. Вот запрос из отчета
ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Номенклатура,
    ТоварыНаСкладахОстатки.Склад КАК СкладДоп,
    СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК Остаток
ПОМЕСТИТЬ Темп1
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(, {(Склад).* КАК СкладДоп}) КАК ТоварыНаСкладахОстатки

СГРУППИРОВАТЬ ПО
    ТоварыНаСкладахОстатки.Номенклатура,
    ТоварыНаСкладахОстатки.Склад
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Т.Номенклатура КАК Номенклатура,
    СУММА(Т.Остаток1) КАК Остаток1,
    СУММА(Т.Остаток2) КАК Остаток2,
    СУММА(Т.Остаток3) КАК Остаток3,
    СУММА(Т.Остаток4) КАК Остаток4,
    СУММА(Т.Остаток5) КАК Остаток5
ПОМЕСТИТЬ ОстаткиДоп
ИЗ
    (ВЫБРАТЬ
        Темп1.Номенклатура КАК Номенклатура,
        Темп1.Остаток КАК Остаток1,
        0 КАК Остаток2,
        0 КАК Остаток3,
        0 КАК Остаток4,
        0 КАК Остаток5
    ИЗ
        Темп1 КАК Темп1
    ГДЕ
        Темп1.СкладДоп = &СкладДоп1
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        Темп1.Номенклатура,
        0,
        Темп1.Остаток,
        0,
        0,
        0
    ИЗ
        Темп1 КАК Темп1
    ГДЕ
        Темп1.СкладДоп = &СкладДоп2
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        Темп1.Номенклатура,
        0,
        0,
        Темп1.Остаток,
        0,
        0
    ИЗ
        Темп1 КАК Темп1
    ГДЕ
        Темп1.СкладДоп = &СкладДоп3
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        Темп1.Номенклатура,
        0,
        0,
        0,
        Темп1.Остаток,
        0
    ИЗ
        Темп1 КАК Темп1
    ГДЕ
        Темп1.СкладДоп = &СкладДоп4
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        Темп1.Номенклатура,
        0,
        0,
        0,
        0,
        Темп1.Остаток
    ИЗ
        Темп1 КАК Темп1
    ГДЕ
        Темп1.СкладДоп = &СкладДоп5) КАК Т

СГРУППИРОВАТЬ ПО
    Т.Номенклатура

ИНДЕКСИРОВАТЬ ПО
    Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТоварыВРезервеНаСкладахОстатки.Склад КАК Склад,
    ТоварыВРезервеНаСкладахОстатки.Номенклатура КАК Номенклатура,
    ТоварыВРезервеНаСкладахОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    СУММА(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток) КАК КоличествоРезерв
ПОМЕСТИТЬ Резервы
ИЗ
    РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(, ) КАК ТоварыВРезервеНаСкладахОстатки

СГРУППИРОВАТЬ ПО
    ТоварыВРезервеНаСкладахОстатки.Склад,
    ТоварыВРезервеНаСкладахОстатки.Номенклатура,
    ТоварыВРезервеНаСкладахОстатки.ХарактеристикаНоменклатуры

ИНДЕКСИРОВАТЬ ПО
    Склад,
    Номенклатура,
    ХарактеристикаНоменклатуры
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТоварыНаСкладахОстаткиИОбороты.Склад,
    ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
    ТоварыНаСкладахОстаткиИОбороты.Номенклатура.ОсновнойПоставщик КАК ОсновнойПоставщик,
    ТоварыНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток,
    ЕСТЬNULL(Резервы.КоличествоРезерв, 0) КАК КоличествоРезерв,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток - ЕСТЬNULL(Резервы.КоличествоРезерв, 0) КАК КоличествоСвободныйОстаток
ПОМЕСТИТЬ Остатки
ИЗ
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , Авто, , ) КАК ТоварыНаСкладахОстаткиИОбороты
        ЛЕВОЕ СОЕДИНЕНИЕ Резервы КАК Резервы
        ПО ТоварыНаСкладахОстаткиИОбороты.Склад = Резервы.Склад
            И ТоварыНаСкладахОстаткиИОбороты.Номенклатура = Резервы.Номенклатура
            И ТоварыНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры = Резервы.ХарактеристикаНоменклатуры
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    НоменклатураКонтрагентов.Контрагент,
    НоменклатураКонтрагентов.Номенклатура,
    МАКСИМУМ(НоменклатураКонтрагентов.КодНоменклатурыКонтрагента) КАК Код
ПОМЕСТИТЬ Коды
ИЗ
    РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов

СГРУППИРОВАТЬ ПО
    НоменклатураКонтрагентов.Контрагент,
    НоменклатураКонтрагентов.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Спр.Ссылка КАК Номенклатура,
    Спр.МинимальнаяФасовка КАК МинимальнаяФасовка,
    Спр.ОсновнойПоставщик,
    Спр.Упаковка,
    Спр.ОтгрузкаУпаковками,
    Остатки.КоличествоНачальныйОстаток,
    Остатки.КоличествоПриход,
    Остатки.КоличествоРасход,
    Остатки.КоличествоКонечныйОстаток,
    Остатки.КоличествоРезерв,
    Остатки.КоличествоСвободныйОстаток,
    ОстаткиДоп.Остаток1,
    ОстаткиДоп.Остаток2,
    ОстаткиДоп.Остаток3,
    ОстаткиДоп.Остаток4,
    ОстаткиДоп.Остаток5,
    Коды.Код КАК КодПоставщика
ИЗ
    Справочник.Номенклатура КАК Спр
        ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки
        ПО Спр.Ссылка = Остатки.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиДоп КАК ОстаткиДоп
        ПО Спр.Ссылка = ОстаткиДоп.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ Коды КАК Коды
        ПО Спр.Ссылка = Коды.Номенклатура
            И Спр.ОсновнойПоставщик = Коды.Контрагент
ГДЕ
    НЕ Спр.ПометкаУдаления
    И НЕ Спр.ЭтоГруппа
{ГДЕ
    Спр.ОсновнойПоставщик.* КАК ОсновнойПоставщик}

А вот переделанный в обработке

    Запрос1=новый ЗАпрос;
    Запрос1.Текст="ВЫБРАТЬ
                  |    ТоварыНаСкладахОстатки.Номенклатура,
                  |    ТоварыНаСкладахОстатки.Склад КАК СкладДоп,
                  |    СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК Остаток
                  |ПОМЕСТИТЬ Темп1
                  |ИЗ
                  |    РегистрНакопления.ТоварыНаСкладах.Остатки(&КонецПериода, {(Склад).* КАК СкладДоп}) КАК ТоварыНаСкладахОстатки
                  |
                  |СГРУППИРОВАТЬ ПО
                  |    ТоварыНаСкладахОстатки.Номенклатура,
                  |    ТоварыНаСкладахОстатки.Склад
                  |;
                  |
                  |////////////////////////////////////////////////////////////////////////////////
                  |ВЫБРАТЬ
                  |    Т.Номенклатура КАК Номенклатура,
                  |    СУММА(Т.Остаток1) КАК Остаток1,
                  |    СУММА(Т.Остаток2) КАК Остаток2,
                  |    СУММА(Т.Остаток3) КАК Остаток3,
                  |    СУММА(Т.Остаток4) КАК Остаток4,
                  |    СУММА(Т.Остаток5) КАК Остаток5
                  |ПОМЕСТИТЬ ОстаткиДоп
                  |ИЗ
                  |    (ВЫБРАТЬ
                  |        Темп1.Номенклатура КАК Номенклатура,
                  |        Темп1.Остаток КАК Остаток1,
                  |        0 КАК Остаток2,
                  |        0 КАК Остаток3,
                  |        0 КАК Остаток4,
                  |        0 КАК Остаток5
                  |    ИЗ
                  |        Темп1 КАК Темп1
                  |    ГДЕ
                  |        Темп1.СкладДоп = &СкладДоп1
                  |    
                  |    ОБЪЕДИНИТЬ ВСЕ
                  |    
                  |    ВЫБРАТЬ
                  |        Темп1.Номенклатура,
                  |        0,
                  |        Темп1.Остаток,
                  |        0,
                  |        0,
                  |        0
                  |    ИЗ
                  |        Темп1 КАК Темп1
                  |    ГДЕ
                  |        Темп1.СкладДоп = &СкладДоп2
                  |    
                  |    ОБЪЕДИНИТЬ ВСЕ
                  |    
                  |    ВЫБРАТЬ
                  |        Темп1.Номенклатура,
                  |        0,
                  |        0,
                  |        Темп1.Остаток,
                  |        0,
                  |        0
                  |    ИЗ
                  |        Темп1 КАК Темп1
                  |    ГДЕ
                  |        Темп1.СкладДоп = &СкладДоп3
                  |    
                  |    ОБЪЕДИНИТЬ ВСЕ
                  |    
                  |    ВЫБРАТЬ
                  |        Темп1.Номенклатура,
                  |        0,
                  |        0,
                  |        0,
                  |        Темп1.Остаток,
                  |        0
                  |    ИЗ
                  |        Темп1 КАК Темп1
                  |    ГДЕ
                  |        Темп1.СкладДоп = &СкладДоп4
                  |    
                  |    ОБЪЕДИНИТЬ ВСЕ
                  |    
                  |    ВЫБРАТЬ
                  |        Темп1.Номенклатура,
                  |        0,
                  |        0,
                  |        0,
                  |        0,
                  |        Темп1.Остаток
                  |    ИЗ
                  |        Темп1 КАК Темп1
                  |    ГДЕ
                  |        Темп1.СкладДоп = &СкладДоп5) КАК Т
                  |
                  |СГРУППИРОВАТЬ ПО
                  |    Т.Номенклатура
                  |
                  |ИНДЕКСИРОВАТЬ ПО
                  |    Номенклатура
                  |;
                  |
                  |////////////////////////////////////////////////////////////////////////////////
                  |ВЫБРАТЬ
                  |    ТоварыВРезервеНаСкладахОстатки.Склад КАК Склад,
                  |    ТоварыВРезервеНаСкладахОстатки.Номенклатура КАК Номенклатура,
                  |    ТоварыВРезервеНаСкладахОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
                  |    СУММА(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток) КАК КоличествоРезерв
                  |ПОМЕСТИТЬ Резервы
                  |ИЗ
                  |    РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&КонецПериода, ) КАК ТоварыВРезервеНаСкладахОстатки
                  |
                  |СГРУППИРОВАТЬ ПО
                  |    ТоварыВРезервеНаСкладахОстатки.Склад,
                  |    ТоварыВРезервеНаСкладахОстатки.Номенклатура,
                  |    ТоварыВРезервеНаСкладахОстатки.ХарактеристикаНоменклатуры
                  |
                  |ИНДЕКСИРОВАТЬ ПО
                  |    Склад,
                  |    Номенклатура,
                  |    ХарактеристикаНоменклатуры
                  |;
                  |
                  |////////////////////////////////////////////////////////////////////////////////
                  |ВЫБРАТЬ
                  |    ТоварыНаСкладахОстаткиИОбороты.Склад,
                  |    ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
                  |    ТоварыНаСкладахОстаткиИОбороты.Номенклатура.ОсновнойПоставщик КАК ОсновнойПоставщик,
                  |    ТоварыНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры,
                  |    ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток,
                  |    ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход,
                  |    ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход,
                  |    ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток,
                  |    ЕСТЬNULL(Резервы.КоличествоРезерв, 0) КАК КоличествоРезерв,
                  |    ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток - ЕСТЬNULL(Резервы.КоличествоРезерв, 0) КАК КоличествоСвободныйОстаток
                  |ПОМЕСТИТЬ Остатки
                  |ИЗ
                  |    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК ТоварыНаСкладахОстаткиИОбороты
                  |        ЛЕВОЕ СОЕДИНЕНИЕ Резервы КАК Резервы
                  |        ПО ТоварыНаСкладахОстаткиИОбороты.Склад = Резервы.Склад
                  |            И ТоварыНаСкладахОстаткиИОбороты.Номенклатура = Резервы.Номенклатура
                  |            И ТоварыНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры = Резервы.ХарактеристикаНоменклатуры
                  |;
                  |
                  |////////////////////////////////////////////////////////////////////////////////
                  |ВЫБРАТЬ
                  |    НоменклатураКонтрагентов.Контрагент,
                  |    НоменклатураКонтрагентов.Номенклатура,
                  |    МАКСИМУМ(НоменклатураКонтрагентов.КодНоменклатурыКонтрагента) КАК Код
                  |ПОМЕСТИТЬ Коды
                  |ИЗ
                  |    РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
                  |
                  |СГРУППИРОВАТЬ ПО
                  |    НоменклатураКонтрагентов.Контрагент,
                  |    НоменклатураКонтрагентов.Номенклатура
                  |;
                  |
                  |////////////////////////////////////////////////////////////////////////////////
                  |ВЫБРАТЬ
                  |    Спр.Ссылка КАК Номенклатура,
                  |    Спр.МинимальнаяФасовка КАК МинимальнаяФасовка,
                  |    Спр.ОсновнойПоставщик,
                  |    Спр.Упаковка,
                  |    Спр.ОтгрузкаУпаковками,
                  |    Остатки.КоличествоНачальныйОстаток,
                  |    Остатки.КоличествоПриход,
                  |    Остатки.КоличествоРасход,
                  |    Остатки.КоличествоКонечныйОстаток,
                  |    Остатки.КоличествоРезерв,
                  |    Остатки.КоличествоСвободныйОстаток,
                  |    ОстаткиДоп.Остаток1,
                  |    ОстаткиДоп.Остаток2,
                  |    ОстаткиДоп.Остаток3,
                  |    ОстаткиДоп.Остаток4,
                  |    ОстаткиДоп.Остаток5,
                  |    Коды.Код КАК КодПоставщика
                  |ИЗ
                  |    Справочник.Номенклатура КАК Спр
                  |        ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки
                  |        ПО Спр.Ссылка = Остатки.Номенклатура
                  |        ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиДоп КАК ОстаткиДоп
                  |        ПО Спр.Ссылка = ОстаткиДоп.Номенклатура
                  |        ЛЕВОЕ СОЕДИНЕНИЕ Коды КАК Коды
                  |        ПО Спр.Ссылка = Коды.Номенклатура
                  |            И Спр.ОсновнойПоставщик = Коды.Контрагент
                  |ГДЕ
                  |    НЕ Спр.ПометкаУдаления
                  |    И НЕ Спр.ЭтоГруппа
                  |    И Спр.ОсновнойПоставщик = &ОсновнойПоставщик
                  |{ГДЕ
                  |    (Спр.ОсновнойПоставщик = &ОсновнойПоставщик) КАК ОсновнойПоставщик}
                  |
                  |УПОРЯДОЧИТЬ ПО
                  |    КодПоставщика";

                 // |    Спр.ОсновнойПоставщик.* КАК ОсновнойПоставщик}";
    Запрос1.УстановитьПараметр("НачалоПериода",этотобъект.НачалоПериода);
    Запрос1.УстановитьПараметр("КонецПериода",этотобъект.КонецПериода);
    //Запрос1.УстановитьПараметр("НачалоПериода1",этотобъект.НачалоПериода1);
    //Запрос1.УстановитьПараметр("КонецПериода1",этотобъект.КонецПериода1);
    //Запрос1.УстановитьПараметр("Период",этотобъект.Период);
    Запрос1.УстановитьПараметр("Склад",этотобъект.Склад);
    Запрос1.УстановитьПараметр("СкладДоп",этотобъект.СкладДоп);
    Запрос1.УстановитьПараметр("СкладДоп1",этотобъект.СкладДоп1);
    Запрос1.УстановитьПараметр("СкладДоп2",этотобъект.СкладДоп2);
    Запрос1.УстановитьПараметр("СкладДоп3",этотобъект.СкладДоп3);
    Запрос1.УстановитьПараметр("СкладДоп4",этотобъект.СкладДоп4);
    Запрос1.УстановитьПараметр("СкладДоп5",этотобъект.СкладДоп5);
    Запрос1.УстановитьПараметр("ОсновнойПоставщик",этотобъект.Поставщик);
    ИтогЗапрос1=Запрос1.Выполнить().Выгрузить();
1 VladZ
 
04.05.22
11:47
В консоле запросов запусти и проверь.
2 Krasotka
 
04.05.22
12:03
Что интересно, в консоле оба запроса дают лишние строчки. Как то в настройках отчета они значит фильтруются. А что сделать, чтобы в запросе фильтровались?
3 Ryzeman
 
04.05.22
12:07
Процентов на 99 уверен, что тебе достаточно сгруппировать остатки. У тебя финальный запрос собирается из 4 таблиц, с левым соединением. Ты можешь отдельно в консоли выполнить эти запросы и посмотреть где получаешь задвоение строк, там и сгруппировать нужным тебе образом.

А ещё можешь зайти в схему СКД и посмотреть как там группируются ресурсы.
4 Krasotka
 
04.05.22
12:24
В отчете в параметрах склад задавался, причина была в этом
5 OldCondom
 
04.05.22
12:25
Зачем лишняя обработка? Ты можешь получить результат скд в ТЗ.
6 Krasotka
 
04.05.22
12:26
Обработка для автоматического формирования заказов поставщикам
7 OldCondom
 
04.05.22
12:29
здорово. Так зачем лишняя обработка?  Формируй заказы из отчета.
8 Krasotka
 
04.05.22
12:36
(7)
Отчеты не должны ничего формировать, это неправильно
9 Kassern
 
04.05.22
12:38
(8) тогда и перепишите под нужды автосоздания заказов поставщиков ваш запрос, смысл туда пихать вот это?

                  |    Остатки.КоличествоПриход,
                  |    Остатки.КоличествоРасход,
10 Kassern
 
04.05.22
12:39
более чем уверен, что большая часть полей вам не нужна для этой задачи и можно написать простой запрос. Для отчета же нужна аналитика и т.д. поэтому поля могут быть уместны
11 OldCondom
 
04.05.22
15:32
(8) а АРМ с полями скд и кнопками от создания документов до прямой записи в субд тоже неправильно?
Ну создайте обработку, запихните в нее макет, выгрузите результат в ТЗ. Эффект такой же.

(10) да там запрос весь выкинуть к чертям. Остатки по складам сделаны через объединение.
Основная теорема систематики: Новые системы плодят новые проблемы.