8.х Запрос на предыдуий заказ

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Zeta, 3 авг 2010.

  1. TopicStarter Overlay
    Zeta
    Offline

    Zeta Опытный в 1С

    Регистрация:
    8 ноя 2009
    Сообщения:
    87
    Симпатии:
    0
    Баллы:
    26
    Здравствуйте! Необходимо написать запрос который получает количество заказанной продукции в текущем и предыдущем заказах. Данные беру из рн Заказы.Обороты. Вот такой код дает не совсем правильный результат:
    Код:
    ВЫБРАТЬ
    ЗаказыОбороты.ДатаЗаказа КАК ДатаЗаказа,
    ЗаказыОбороты.ТорговаяТочка.Владелец КАК Контрагент,
    ЗаказыОбороты.ТорговаяТочка КАК ТорговаяТочка,
    ЗаказыОбороты.Номенклатура КАК Номенклатура,
    СУММА(ЗаказыОбороты.КоличествоПриход) КАК КоличествоПриход,	
    СУММА(ПредыдущийЗаказ.КоличествоПриход) КАК КоличествоВПредыдущем
    ИЗ
    РегистрНакопления.Заказы.Обороты(
    &ДатаПриемаНачало,
    &ДатаПриемаОкончание,
    ,
    ДатаЗаказа >= &ДатаЗаказаНачало
    И ДатаЗаказа <= &ДатаЗаказаОкончание) КАК ЗаказыОбороты	
    ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 
    ЗаказыОбороты.ТорговаяТочка КАК ТорговаяТочка,
    ЗаказыОбороты.ДатаЗаказа КАК ДатаЗаказа,
    ЗаказыОбороты.Договор КАК Договор,
    ЗаказыОбороты.Номенклатура КАК Номенклатура,
    ЗаказыОбороты.КоличествоПриход КАК КоличествоПриход
    ИЗ
    РегистрНакопления.Заказы.Обороты(
    &ДатаПриемаНачало,
    &ДатаПриемаОкончание,
    ,
    ДатаЗаказа >= &ДатаЗаказаНачало
    И ДатаЗаказа <= &ДатаЗаказаОкончание) КАК ЗаказыОбороты
    
    ) КАК ПредыдущийЗаказ
    ПО ЗаказыОбороты.ТорговаяТочка = ПредыдущийЗаказ.ТорговаяТочка
    И ЗаказыОбороты.Договор = ПредыдущийЗаказ.Договор
    И ЗаказыОбороты.Номенклатура = ПредыдущийЗаказ.Номенклатура
    И ЗаказыОбороты.ДатаЗаказа > ПредыдущийЗаказ.ДатаЗаказа
    
    СГРУППИРОВАТЬ <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/по')">ПО			</span>
    ЗаказыОбороты.ТорговаяТочка,	
    ЗаказыОбороты.ДатаЗаказа,
    ЗаказыОбороты.ТорговаяТочка.Владелец,
    ЗаказыОбороты.Номенклатура
    УПОРЯДОЧИТЬ ПО
    ДатаЗаказа УБЫВ,
    Контрагент,
    ТорговаяТочка,
    Номенклатура
    
    
    По идее, если в предыдущем заказе нет номенклатуры текущего заказа, то в предыдущем должен стоять 0, а он смотрит любой следующий, где есть эта номенклатура и ставит это количество. Подскажите способ получения кол-ва номенклатуры из предыдущего по дате заказа.
  2. x_under
    Offline

    x_under Модераторы Команда форума Модератор

    Регистрация:
    25 апр 2007
    Сообщения:
    2.576
    Симпатии:
    13
    Баллы:
    29
    А может проще взять просто таблицу документов. В любом случае так как вы берете соединение по номенклатуре, система найдет вам заказ и не обязательно предыдущий. Зачем соединение по номенклатуре вообще?
  3. TopicStarter Overlay
    Zeta
    Offline

    Zeta Опытный в 1С

    Регистрация:
    8 ноя 2009
    Сообщения:
    87
    Симпатии:
    0
    Баллы:
    26
    Если убрать условие на номенклатуру вообще ерунда получается. А если по документам запрос, то как определить предыдущий?
  4. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    Предыдущий документ это самый старший из тех, у кого дата МЕНЬШЕ даты текущего.
    Т.е. строим два запроса (не люблю я вложенные)
    Код:
    
    |ВЫБРАТЬ
    |    НашРегистр.Регистратор.
    |    НашРегистр.Номенклатура,
    |    СУММА(НашРегистр.Количество) КАК Колво,
    |    Максимум(НашРегистр.Регистратор.Дата)
    |ПОМЕСТИТЬ ПредыдущийЗаказ_
    |ИЗ
    |   .... КАК НашРегистр
    |ГДЕ
    |   НашРегистр.Контрагент = Контрагент
    |   И НашРегистр.Номенклатура В(&сзСписокНоменклатурыТекущегоЗаказа)
    |   И НашРегистр.Регистратор.Дата < &ДатаТекущегоЗаказа
    |СГРУППИРОВАТЬ ПО
    |     НашРегистр.Регистратор,
    |     НашРегистр.Номенклатура
    |;
    |ВЫБРАТЬ
    |   ....
    |   ЕСТЬNULL(ПредыдущийЗаказ.Колво, 0) КАК КолвоПредыдущегоЗаказа
    |ИЗ
    |   .... КАК ТекущийЗаказ
    |   ЛЕВОЕ СОЕДИНЕНИЕ ПредыдущийЗаказ_
    |     ПО ПредыдущийЗаказ.Номенклатура = ТекущийЗаказ.Номенклатура
    
    
    
    Последний запрос получит для нужной номенклатуры кол-во этой номенклатуры в ближайшем предыдущем заказе. Т.е. в случае когда были такие заказы

    Заказ1
    Нмк1 - 10шт
    Нмк2 - 20шт
    Нмк3 - 30шт

    Заказ2
    Нмк1 - 11шт
    Нмк2 - 21шт

    Заказ3
    Нмк1 - 12шт
    Нмк2 - 22шт
    Нмк3 - 32шт
    То для заказа 3 (текущий заказ) колво предыдущих будет таково:
    Нмк1 - 11шт (из заказа 2)
    Нмк2 - 21шт (из заказа 2)
    Нмк3 - 30шт (из заказа 1)


    Если же, в случае, когда в предыдущем заказе номенклатуры 3 небыло то в текущем кол-во предыдущего показывать не надо (необходимо ориентироваться исключительно на последний заказ)
    запрос будет содержать не два подзапроса, а три
    1 - тупо получаете ссылку на последний заказ:
    Код:
    |ВЫБРАТЬ
    |    НашРегистр.Регистратор.
    |    Максимум(НашРегистр.Регистратор.Дата)
    |ПОМЕСТИТЬ ПредыдущийЗаказ_
    |ИЗ
    |   .... КАК НашРегистр
    |ГДЕ
    |   НашРегистр.Контрагент = Контрагент
    |   И НашРегистр.Регистратор.Дата < &ДатаТекущегоЗаказа
    |СГРУППИРОВАТЬ ПО
    |     НашРегистр.Регистратор,
    |;
    
    
    
    2 - выбираете номенклатуру предыдущего заказа (игнорируя заказы более старый чем предыдущий текущему)
    Код:
    |ВЫБРАТЬ
    |    ПредыдущийЗаказ_.Регистратор,
    |    НашРегистр.Номенклатура,
    |    СУММА(НашРегистр.Количество) КАК Колво
    |ПОМЕСТИТЬ СоставПредыдущегоЗаказа_
    |ИЗ
    |   .... КАК НашРегистр
    |   ПРАВОЕ СОЕДИНЕНИЕ ПредыдущийЗаказ_ КАК ПредыдущийЗаказ_
    |       ПО ПредыдущийЗаказ_.Регистратор = НашРегистр.Регистратор
    |ГДЕ
    |   НашРегистр.Номенклатура В(&сзСписокНоменклатурыТекущегоЗаказа)
    |СГРУППИРОВАТЬ ПО
    |     НашРегистр.Номенклатура,
    |;
    
    
    
    Ну а уж третий - левым соединением по номенклатуре к данным текущего заказа приатачит данные о кол-ве номенклатуры в предыдущем.

    P.S. данные запросы не проверялись на работоспособность и наверняка имеют синтаксические ошибки. Цель показанных запросов просто показать АЛГОРИТМ извлечения данных о предыдущем/предыдущих заказах.
  5. TopicStarter Overlay
    Zeta
    Offline

    Zeta Опытный в 1С

    Регистрация:
    8 ноя 2009
    Сообщения:
    87
    Симпатии:
    0
    Баллы:
    26
    Спасибо за столь детальный ответ. буду разбираться.

Поделиться этой страницей