Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Остаток с минимальной датой и остаток с максимальной датой отдельными строками в запросе

Остаток с минимальной датой и остаток с максимальной датой отдельными строками в запросе
Я
   1C_coder
 
09.09.20 - 08:53
В запросе нужно получить отдельными строками остаток с минимальной датой и остаток с максимальной датой.
Это поля "НачальныйОстатокКоличество" и "КонечныйОстатокКоличество" во временных таблицах "ВремТабНачальныйОстаток" и "ВремТабКонечныйОстаток".

Сейчас некоторые позиции номенклатуры не выбираются, не могу понять почему.
Если во временных таблицах "ВремТабНачальныйОстаток" и "ВремТабКонечныйОстаток" во вложенном запросе делаю не внутреннее соединение, а левое, тогда выбираются строки со всеми датами, а не с одной, как нужно.

Если в самом начале ограничиваю номенклатуру только одной позицией, тогда выбирается и с внутренним соединением во вложенном запросе.

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ДанныеПроизводственногоКалендаря.Дата КАК ДатаКалендаря
ПОМЕСТИТЬ ВремТабДатыКалендаря
ИЗ
    РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ГДЕ
    ДанныеПроизводственногоКалендаря.Дата МЕЖДУ &НачалоПериода И &КонецПериода
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
    ТоварыНаСкладахОстаткиИОбороты.ПериодДень КАК Период
ПОМЕСТИТЬ ВремТабДатыДвижений
ИЗ
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК ТоварыНаСкладахОстаткиИОбороты
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВремТабДатыКалендаря.ДатаКалендаря КАК ДатаКалендаря,
    ВремТабДатыДвижений.Номенклатура КАК Номенклатура,
    МАКСИМУМ(ВремТабДатыДвижений.Период) КАК ДатаОстатка
ПОМЕСТИТЬ ВремТабДатыОстатков
ИЗ
    ВремТабДатыКалендаря КАК ВремТабДатыКалендаря
        ЛЕВОЕ СОЕДИНЕНИЕ ВремТабДатыДвижений КАК ВремТабДатыДвижений
        ПО ВремТабДатыКалендаря.ДатаКалендаря >= ВремТабДатыДвижений.Период

СГРУППИРОВАТЬ ПО
    ВремТабДатыКалендаря.ДатаКалендаря,
    ВремТабДатыДвижений.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////

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

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВремТабОстаткиЦены.Номенклатура КАК Номенклатура,
    ВремТабОстаткиЦены.ДатаОстатка КАК ДатаОстатка,
    ВремТабОстаткиЦены.ОстатокЗаДень КАК НачальныйОстатокКоличество,
    ВремТабОстаткиЦены.Цена КАК Цена
ПОМЕСТИТЬ ВремТабНачальныйОстаток
ИЗ
    ВремТабОстаткиЦены КАК ВремТабОстаткиЦены
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            МИНИМУМ(ВремТабОстаткиЦены.ДатаОстатка) КАК ДатаОстатка
        ИЗ
            ВремТабОстаткиЦены КАК ВремТабОстаткиЦены) КАК ВложенныйЗапрос
        ПО ВремТабОстаткиЦены.ДатаОстатка = ВложенныйЗапрос.ДатаОстатка
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВремТабОстаткиЦены.Номенклатура КАК Номенклатура,
    ВремТабОстаткиЦены.ДатаОстатка КАК ДатаОстатка,
    ВремТабОстаткиЦены.ОстатокЗаДень КАК КонечныйОстатокКоличество,
    ВремТабОстаткиЦены.Цена КАК Цена
ПОМЕСТИТЬ ВремТабКонечныйОстаток
ИЗ
    ВремТабОстаткиЦены КАК ВремТабОстаткиЦены
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            МАКСИМУМ(ВремТабОстаткиЦены.ДатаОстатка) КАК ДатаОстатка
        ИЗ
            ВремТабОстаткиЦены КАК ВремТабОстаткиЦены) КАК ВложенныйЗапрос
        ПО ВремТабОстаткиЦены.ДатаОстатка = ВложенныйЗапрос.ДатаОстатка
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВремТабОстаткиЦены.Номенклатура КАК Номенклатура,
    ВремТабОстаткиЦены.ДатаОстатка КАК ДатаОстатка,
    ВремТабОстаткиЦены.ОстатокЗаДень КАК ОстатокЗаДень,
    ВремТабОстаткиЦены.Цена КАК Цена,
    1 КАК ДеньГдеБылОстаток
ПОМЕСТИТЬ ВремТабВыбранныеОстаткиПоДням
ИЗ
    ВремТабОстаткиЦены КАК ВремТабОстаткиЦены
;

////////////////////////////////////////////////////////////////////////////////

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

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

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВремТабСгруппированныеОстатки.Номенклатура КАК Номенклатура,
    ВремТабНачальныйОстаток.НачальныйОстатокКоличество КАК НачальныйОстатокКоличество,
    ВремТабНачальныйОстаток.НачальныйОстатокКоличество * ВремТабНачальныйОстаток.Цена КАК НачальныйОстатокСумма,
    ВремТабКонечныйОстаток.КонечныйОстатокКоличество КАК КонечныйОстатокКоличество,
    ВремТабКонечныйОстаток.КонечныйОстатокКоличество * ВремТабКонечныйОстаток.Цена КАК КонечныйОстатокСумма,
    ВЫБОР
        КОГДА ВремТабСгруппированныеОстатки.ДниГдеБылОстаток - 1 > 1
            ТОГДА ЕСТЬNULL((ВремТабСгруппированныеОстатки.ОстатокЗаВсеДни - ВремТабНачальныйОстаток.НачальныйОстатокКоличество / 2 - ВремТабКонечныйОстаток.КонечныйОстатокКоличество / 2) / (ВремТабСгруппированныеОстатки.ДниГдеБылОстаток - 1), 0)
        КОГДА ВремТабСгруппированныеОстатки.ДниГдеБылОстаток - 1 = 1
            ТОГДА ЕСТЬNULL(ВремТабСгруппированныеОстатки.ОстатокЗаВсеДни, 0)
        ИНАЧЕ 0
    КОНЕЦ КАК СреднийТоварныйЗапасКоличество,
    ВЫБОР
        КОГДА ВремТабСгруппированныеОстатки.ДниГдеБылОстаток - 1 > 1
            ТОГДА ЕСТЬNULL((ВремТабСгруппированныеОстатки.ОстатокЗаВсеДни - ВремТабНачальныйОстаток.НачальныйОстатокКоличество / 2 - ВремТабКонечныйОстаток.КонечныйОстатокКоличество / 2) * ВремТабСгруппированныеОстатки.Цена / (ВремТабСгруппированныеОстатки.ДниГдеБылОстаток - 1), 0)
        КОГДА ВремТабСгруппированныеОстатки.ДниГдеБылОстаток - 1 = 1
            ТОГДА ЕСТЬNULL(ВремТабСгруппированныеОстатки.ОстатокЗаВсеДни * ВремТабСгруппированныеОстатки.Цена, 0)
        ИНАЧЕ 0
    КОНЕЦ КАК СреднийТоварныйЗапасСумма
ПОМЕСТИТЬ ВремТабСреднийТоварныйЗапас
ИЗ
    ВремТабСгруппированныеОстатки КАК ВремТабСгруппированныеОстатки
        ЛЕВОЕ СОЕДИНЕНИЕ ВремТабНачальныйОстаток КАК ВремТабНачальныйОстаток
        ПО ВремТабСгруппированныеОстатки.Номенклатура = ВремТабНачальныйОстаток.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ ВремТабКонечныйОстаток КАК ВремТабКонечныйОстаток
        ПО ВремТабСгруппированныеОстатки.Номенклатура = ВремТабКонечныйОстаток.Номенклатура

   Ёпрст
 
1 - 09.09.20 - 09:28
(0)
всё не смотрел, но ужо вот это
ПОМЕСТИТЬ ВремТабДатыОстатков

не есть гуд..
посмотри значение этой таблички в консоле запросов
   1C_coder
 
2 - 09.09.20 - 09:44
Во ВремТабДатыОстатков строки со всеми датами есть. Проверена каждая временная таблица. Если не выбирать начальный и конечный остаток, то всё остальное - то, что нужно.

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.