Книга знаний

1С:Предприятие / v8 / Приемы программирования / Запросы

v8: Запрос: количество дней нахождения товара на складе.

Есть много заковыристых задачек, которые часто встречаются в работе. Давайте попробуем решить одну из таких задач разными методами и попытаемся найти оптимальный.Автор статьи: TormozIT | Редакторы:
Последняя редакция №3 от 01.09.06 | История
URL: http://kb.mista.ru/article.php?id=359

Задача.
Получить общее количество дней наличия товара на складе с группировками:
Номенклатура, ХарактеристикаНоменклатуры, Склад.

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

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

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика