Версия для печати темы (http://pro1c.org.ua/index.php?s=40d43ea25d80bc047f399242ce302c03&showtopic=43141)

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

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

Автор: Mongrel 04.01.18, 10:49

Добрый день , всех с прошедшими и наступающими!

утп 1.2.42.2 платформа 8.3.8.1652

есть задача получить остатки товаров в заказах на складе на дату заказов. я попробовал вот такой

запрос

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

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

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

ОБЪЕДИНИТЬ ВСЕ

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



запрос не работает, так как хотелось бы
посмотрел темы на инфорстарте http://pro1c.org.ua/redirect.php?https://infostart.ru/public/102435/ но таким образом можно получить на начало дня если есть записи по в регистре валют.

Может есть более правильный вариант?

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


 ! 

http://pro1c.org.ua/index.php?act=announce&id=2: 4, 9
 

Автор: Bernet 04.01.18, 10:56

Вот пример запроса на получение остатков по дням, в вашем случае "днями" будут даты ваших заказов, немного измените запрос и получите то что хотите:
Запрос

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

Автор: Mongrel 04.01.18, 12:23

Bernet @ Сегодня, 10:56 * ,

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

Автор: Bernet 04.01.18, 12:45

Mongrel @ Сегодня, 12:23 * ,
Ну так в качестве ваших дат будет дата заказа вместе со временем

Автор: Mongrel 04.01.18, 18:03

накидал приблизительный вариант - у меня правильный ход мысли? я просто боюсь, что результат запроса будет очень большой ...
запрос

ВЫБРАТЬ
    ЗаказПокупателяТовары.Ссылка,
    ЗаказПокупателяТовары.Ссылка.Дата КАК Дата,
    ЗаказПокупателяТовары.Номенклатура,
    ЗаказПокупателяТовары.Количество
ПОМЕСТИТЬ Вт_Заказы
ИЗ
    Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
ГДЕ
    ЗаказПокупателяТовары.Ссылка.Дата МЕЖДУ &НачДата И &КонДата
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Вт_Заказы.Дата,
    Вт_Остатки.Номенклатура,
    МАКСИМУМ(Вт_Остатки.Период) КАК Период
ПОМЕСТИТЬ ВТ_Остатки_Даты
ИЗ
    Вт_Заказы КАК Вт_Заказы
        ЛЕВОЕ СОЕДИНЕНИЕ Вт_Остатки КАК Вт_Остатки
        ПО Вт_Заказы.Дата <= Вт_Остатки.Период

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Вт_Остатки.КонечныйОстаток,
    ВТ_Остатки_Даты.Номенклатура,
    ВТ_Остатки_Даты.Период
ИЗ
    ВТ_Остатки_Даты КАК ВТ_Остатки_Даты
        ЛЕВОЕ СОЕДИНЕНИЕ Вт_Остатки КАК Вт_Остатки
        ПО ВТ_Остатки_Даты.Номенклатура = Вт_Остатки.Номенклатура

Автор: Bernet 05.01.18, 11:57

выполнил ваш запрос в консоли - немного не то и данные не сгруппированы, сейчас попробую переделать

Вот такая вот штука получилась - вытягивает последние остатки на дату заказа. P.S. предполагается использование Складов в Заказах - если не используете то везде Склад удалите в запросе
Запрос - Остатки на даты заказов

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

СГРУППИРОВАТЬ ПО
    ЗаказПокупателяТовары.Ссылка,
    ЗаказПокупателяТовары.Ссылка.Дата,
    ЗаказПокупателяТовары.Ссылка.СкладГруппа,
    ЗаказПокупателяТовары.Номенклатура
;

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

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

СГРУППИРОВАТЬ ПО
    ВтЗаказы.Период,
    ВтЗаказы.Номенклатура,
    ВтЗаказы.Склад
;

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

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

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

СГРУППИРОВАТЬ ПО
    ВтЗаказы.Заказ,
    ВтЗаказы.Номенклатура,
    ВтЗаказы.Склад,
    ВтЗаказы.Период

Автор: Mongrel 10.01.18, 14:21

Bernet @ 05.01.18, 11:57 * ,


спасибо , задачу я решил несколько иным способом, может совсем не корректным, но 100% работающим. Попробую сравнить, надеюсь в одном запросе будет быстрее чем так как я сделал.

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