Версия для печати темы (https://pro1c.org.ua/index.php?s=91f299034071be9b227c43bca8c526c4&showtopic=21251)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Последний заказ, последнее поступление

Автор: Powerman 18.12.14, 11:19

Подскажите, пожалуйста, какой должен быть запрос к документам «ЗаказПоставщику» и «ПоступлениеТоваровУслуг» чтобы получить отчёт в виде:
Номенклатура, Код, ДатаПоследнегоЗаказа, КоличествоПоследнегоЗаказа, СуммаПоследнегоЗаказа, ДатаПоследнегоПоступления, КоличествоПоследнегоПоступления, СуммаПоследнегоПоступления
Должно быть в одну строку для списка номенклатуры по списку складов
Заранее спасибо за помощь.

Автор: Bernet 18.12.14, 11:45

Если имеется в виду последний документ по дате то так как в примере ниже, если документ последний в принципе - то брать максимум по ссылке.
P.S. Ещё я бы использовал не документы а регистры накопления ЗаказыПоставщикам, Закупки и т.п.

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

Автор: Powerman 18.12.14, 14:25

Цитата(Bernet @ 18.12.14, 12:45) *
Если имеется в виду последний документ по дате то так как в примере ниже, если документ последний в принципе - то брать максимум по ссылке.
P.S. Ещё я бы использовал не документы а регистры накопления ЗаказыПоставщикам, Закупки и т.п.

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



Огромное спасибо!!!!
Слегка видоизменив, всё получилось, только вот задача слегка изменилась… Ещё надо добавить к заказам ВнутринниеЗаказы. Т.е. Заказы поставщику + ВнутренниеЗаказы.
Как это лучше сделать?

Автор: Bernet 18.12.14, 15:06

Т.е. учитывать при выводе последнего заказа не только заказ поставщика, но и внутренний заказ? или отдельными колонками?

Автор: Powerman 18.12.14, 15:48

Цитата(Bernet @ 18.12.14, 16:06) *
Т.е. учитывать при выводе последнего заказа не только заказ поставщика, но и внутренний заказ? или отдельными колонками?

Можно отдельными колонками


 ! 

Правила, п.13
 

В таком виде отчёт очень долго отрабатывает. Может действительно можно его на регистрах построить?
Только нужно к колонкам в первом моём сообщении добавить ещё по внутренним заказам и приход по перемещениям.

Автор: Bernet 18.12.14, 16:34

наверно что-то вроде этого, запрос не самый оптимальный + возможно задвоение строк если есть документы проведенные в одну и ту же секунду

ВЫБРАТЬ РАЗРЕШЕННЫЕ
    СпрНоменклатура.Ссылка КАК Номенклатура,
    МАКСИМУМ(ЕСТЬNULL(ЗаказыПоставщикам.Период, &ПустаяДата)) КАК ДатаПослЗаказа,
    МАКСИМУМ(ЕСТЬNULL(ПоступленияТоваров.Период, &ПустаяДата)) КАК ДатаПослПоступления,
    МАКСИМУМ(ЕСТЬNULL(ВнутренниеЗаказы.Период, &ПустаяДата)) КАК ДатаПослВнутреннегоЗаказа,
    МАКСИМУМ(ЕСТЬNULL(ПеремещенияТоваров.Период, &ПустаяДата)) КАК ДатаПослПеремещения
ПОМЕСТИТЬ ВтПоследниеДокументы
ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПоставщикам.Обороты(&НачалоПериода, &КонецПериода, Регистратор, Номенклатура В ИЕРАРХИИ (&ГруппаНоменклатуры)) КАК ЗаказыПоставщикам
        ПО СпрНоменклатура.Ссылка = ЗаказыПоставщикам.Номенклатура
            И (ЗаказыПоставщикам.Регистратор ССЫЛКА Документ.ЗаказПоставщику)
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПоставщикам.Обороты(&НачалоПериода, &КонецПериода, Регистратор, Номенклатура В ИЕРАРХИИ (&ГруппаНоменклатуры)) КАК ПоступленияТоваров
        ПО (СпрНоменклатура.Ссылка = ЗаказыПоставщикам.Номенклатура)
            И (ПоступленияТоваров.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг)
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВнутренниеЗаказы.Обороты(&НачалоПериода, &КонецПериода, Регистратор, Номенклатура В ИЕРАРХИИ (&ГруппаНоменклатуры)) КАК ВнутренниеЗаказы
        ПО СпрНоменклатура.Ссылка = ВнутренниеЗаказы.Номенклатура
            И (ВнутренниеЗаказы.Регистратор ССЫЛКА Документ.ВнутреннийЗаказ)
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВнутренниеЗаказы.Обороты(&НачалоПериода, &КонецПериода, Регистратор, Номенклатура В ИЕРАРХИИ (&ГруппаНоменклатуры)) КАК ПеремещенияТоваров
        ПО (СпрНоменклатура.Ссылка = ВнутренниеЗаказы.Номенклатура)
            И (ПеремещенияТоваров.Регистратор ССЫЛКА Документ.ПеремещениеТоваров)
ГДЕ
    СпрНоменклатура.ЭтоГруппа = ЛОЖЬ
    И СпрНоменклатура.Ссылка В ИЕРАРХИИ(&ГруппаНоменклатуры)

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

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

Автор: Powerman 18.12.14, 16:56

Цитата(Bernet @ 18.12.14, 17:34) http://pro1c.org.ua/index.php?act=findpost&pid=94452
А зачем передавать параметр &ПустаяДата, в МАКСИМУМ(ЕСТЬNULL(ЗаказыПоставщикам.Период, &ПустаяДата)) КАК ДатаПослЗаказа и т.д.
если нет документа, тогда надо не заполнять дату вообще.
Я этого не пойму… (((

В запрос я передаю не группы товара, а список значений с необходимой номенклатурой… Переделал так: Номенклатура В (&Номенклатура)

Дааа, тяжёлый получился первоначальный запрос… Передал в него 900 шт. номенклатуры, прошло минут 25 результата нет… ((

Автор: Bernet 18.12.14, 17:07

Пустую дату я передавал для себя, чтобы мне надпись "NULL" глаза в консоли не мозолила.
Передавать можно или список или группу или вообще тупо одну номенклатуру - не принципиально.
Ускорить его можно наверно только путем сокращения периода поиска, т.е. параметрами

&НачалоПериода
и
&КонецПериода

Как его ещё ускорить мне пока в голову не приходит, может более знающие люди напишут. Я передал группу размером в 335 номенклатур, отработало в консоли за 6,15 секунды

Автор: Powerman 18.12.14, 17:14

Цитата(Bernet @ 18.12.14, 18:07) *
Пустую дату я передавал для себя, чтобы мне надпись "NULL" глаза в консоли не мозолила.
Передавать можно или список или группу или вообще тупо одну номенклатуру - не принципиально.
Ускорить его можно наверно только путем сокращения периода поиска, т.е. параметрами
&НачалоПериода
и
&КонецПериода

Как его ещё ускорить мне пока в голову не приходит, может более знающие люди напишут. Я передал группу размером в 335 номенклатур, отработало в консоли за 6,15 секунды

Ясно, спасибо, попробую

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua