Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Остатки по двум регистрам
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
maxst22
Доброе время суток. Конфигурация УТ. Хочу получить остаток по регистрам "Партии" и "Заказы", - цель: получить итоговое количество товара необходимого для закупки (заказано ХХ на складе УУ , докупить ХХ-УУ)
Проблема в получении остатков по нескольким складам

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

В этом случае получаем остатки по всем складам, хотя в список значений добавлено только 2 склада
Если поставить условие
    |ГДЕ
    |    ЗаказыПокупателейОстатки.ЗаказПокупателя = &ЗаказПокупателя
    |    И Склад = &Склад1 ИЛИ Склад = &Склад2

то запрос не выводит товары которых нет в остатках на складе, даже если они заказаны


 ! 

Правила, п. 12!!!
 
sava1
Запросы разнести отдельно и объединить или
выборка из справочника с левым соединением обеих ВТ
maxst22
Спасибо, попробую.
Я так понимаю все будет в одном запросе, но конструкция будет выглядеть как-то так:
"ВЫБРАТЬ
    |    ЗаказыПокупателейОстатки.Номенклатура КАК Номенклатура,
    |    ЗаказыПокупателейОстатки.КоличествоОстаток КАК Отгрузить,
                   .......

|ЛЕВОЕ СОЕДИНЕНИЕ

|ВЫБРАТЬ
РегистрНакопления.ПартииТоваровНаСкладах.Остатки(
    |                , Склад в (&Склады)) КАК ПартииТоваровНаСкладахОстатки
    |        ПО ЗаказыПокупателейОстатки.Номенклатура = ПартииТоваровНаСкладахОстатки.Номенклатура




 ! 

Ознакомьтесь с правилами форума, п.12 в частности.
Следующие сообщения оформленные не по правилам будут удалятся.
 


Сори, исправлюсь
sava1
Вместо
Цитата(maxst22 @ 12.06.12, 17:59) необходимо зарегистрироваться для просмотра ссылки
|ЛЕВОЕ СОЕДИНЕНИЕ


ОБъЕДИНИТЬ

Структура полей обеих запросов должна быть одинакова
maxst22
Цитата(sava1 @ 12.06.12, 18:55) необходимо зарегистрироваться для просмотра ссылки
ОБъЕДИНИТЬ

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


НО, Берутся все остаки и почему-то по ВСЕМ складам
Интересуют только те товары, которые не были еще отгружены клиенту. (остаток по регистру "ЗаказыПокупателей")

Может сделать 2 разных запроса, выгрузить их в ТЗ-шки и по первой смотреть остаток из второй на складе?
(просто одним запросом почему-то никак не получается sad.gif )
maxst22
УРА, получилось!!! Кому интересно - вот текст запроса
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ЗаказыПокупателейОстатки.Номенклатура КАК Номенклатура,
    |    ЗаказыПокупателейОстатки.КоличествоОстаток КАК Отгрузить,
    |    ЕСТЬNULL(ПартииТоваровНаСкладахОстатки.КоличествоОстаток, 0) КАК Остаток,
    |    ЗаказыПокупателейОстатки.Номенклатура.ОсновнойПоставщик КАК ОсновнойПоставщик,
    |    СУММА(ЗаказыПокупателейОстатки.КоличествоОстаток) - ЕСТЬNULL(СУММА(ПартииТоваровНаСкладахОстатки.КоличествоОстаток), 0) КАК Докупить,
    |    ЗаказыПокупателейОстатки.Номенклатура.Наименование КАК НоменклатураНаименование
    |ИЗ
    |    РегистрНакопления.ЗаказыПокупателей.Остатки КАК ЗаказыПокупателейОстатки
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(
    |                , Склад в (&Склады)) КАК ПартииТоваровНаСкладахОстатки
    |        ПО ЗаказыПокупателейОстатки.Номенклатура = ПартииТоваровНаСкладахОстатки.Номенклатура
    |ГДЕ
    |    ЗаказыПокупателейОстатки.ЗаказПокупателя = &ЗаказПокупателя
    |
    |СГРУППИРОВАТЬ ПО
    |    ЗаказыПокупателейОстатки.Номенклатура.ОсновнойПоставщик,
    |    ЗаказыПокупателейОстатки.Номенклатура,
    |    ЗаказыПокупателейОстатки.ЗаказПокупателя,
    |    ЗаказыПокупателейОстатки.КоличествоОстаток,
    |    ПартииТоваровНаСкладахОстатки.Номенклатура,
    |    ЕСТЬNULL(ПартииТоваровНаСкладахОстатки.КоличествоОстаток, 0),
    |    ЗаказыПокупателейОстатки.Номенклатура.Наименование
    |
    |ИМЕЮЩИЕ
    |    СУММА(ЗаказыПокупателейОстатки.КоличествоОстаток) - ЕСТЬNULL(СУММА(ПартииТоваровНаСкладахОстатки.КоличествоОстаток),0) > 0
    |
    |УПОРЯДОЧИТЬ ПО
    |    ОсновнойПоставщик,
    |    НоменклатураНаименование
    |ИТОГИ
    |    СУММА(Отгрузить),
    |    СУММА(Остаток)
    |ПО
    |    ОсновнойПоставщик";
    
    Запрос.УстановитьПараметр("ЗаказПокупателя",ЗаказПокупателя);  // в дальнейшем список ранее отобранныхзаказов
    Запрос.УстановитьПараметр("Склады",Склады);  // Склады - список значений


Только нужно обращать внимание на то, что в запросе остаток берется из регистра "Партии", а не "Остатки"
Вот это меня и сбило при проверке правильности формирования запроса smile.gif

Всем спасибо, кто пытался помочь!!!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.