Имя: Пароль:
1C
1С v8
Срок пребывания товара на складах фирмы (РН "ПартииТоваровНаСкладах")
0 live in sky dreams
 
19.12.16
10:30
Не могу понять как доработать запрос.
Хочу понимать сколько находился товар на складах фирмы до тех пор, пока его не отгрузили на сторону. Для анализа беру РН "ПартииТоваровНаСкладах".

Делаю запрос, но получаю не все, что хочу. А конкретно: если товар заехал на склады фирмы и в тот же день выехал со складов фирмы - то этот день тоже нужно учесть.
Если товар переместился со склада на склад, то есть двигался внутри фирмы, то эту операцию учитывать не нужно.

Помогите нужным образом построить запрос.

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

УПОРЯДОЧИТЬ ПО
    Номенклатура,
    Партия
1 live in sky dreams
 
19.12.16
10:31
Конфа УТ 10
2 Злопчинский
 
19.12.16
10:36
Ну очевидно же что разность дат понятие субъективное
От 18 числа отнять 18 будет ноль дней, а не один
3 Злопчинский
 
19.12.16
10:38
Ну и посмотреть структуру регистра нет ли там какогонить реквизита с видом операции типа внешнее или внутреннее
4 Злопчинский
 
19.12.16
10:48
Сколько дней товар находился на фирме? Какой товар? Вообще конкретный товар или конкретная партия товара?
5 Злопчинский
 
19.12.16
10:50
Я не спец по запросам но взял бы тупо с гркэуппировкой по дню счётчик=1 для дня при условии что конечный или начальный остаток не равны нулю или есть внешний приход
6 live in sky dreams
 
19.12.16
10:57
(2)это мне понятно
(3) Есть реквизит КодОперации, но в ВТ он не доступен, необходимо обращаться к регистру напрямую.
(4) Сколько дней конкретный товар конкретной партии хранился (в т.ч. катался между складами) на складах фирмы.
7 live in sky dreams
 
19.12.16
11:06
Возможно, стоит построить временную таблицу из ВТ РН "Остатки" с группировкой остатков по дням (начало дня), а к ней уже приджойнить таблицу РН (не виртуальную) с отбором по периоду границ запроса и группировками по номенклатуре (с ее фаршем), партиям и фирме, без складов. При этом исключить внутреннее перемещение.
8 dmpl
 
19.12.16
12:17
(7) Зачем остатки по дням? Надо выбрать максимум и минимум периода записей в разрезе документа оприходования. При этом по ненулевым остаткам партии на отчетную дату - берется текущая дата.
9 live in sky dreams
 
19.12.16
12:23
(8)"Надо выбрать максимум и минимум периода записей в разрезе документа оприходования." - я вас не понял. Вы имеете ввиду выбрать движения по конкретной партии за все время? Или как?
"При этом по ненулевым остаткам партии на отчетную дату - берется текущая дата." Тут вообще не понял
10 dmpl
 
19.12.16
12:27
(9) Движения по поступлениям в течение анализируемого периода, за весь период нет необходимости. Ну если совсем уж правильно - на дату начала периода отчета можно сформировать остатки в разрезе документов оприходования и добавить эти партии в отбор.
11 dmpl
 
19.12.16
12:28
(9) А когда остатки по партии на текущую дату ненулевые - значит товар еще остался на складе, поэтому берется текущая дата.
12 live in sky dreams
 
19.12.16
12:35
Если я выбираю движения (поступления) в течении анализируемого периода - у меня получится таблица что то вроде

Товар_1 | Партия 0001 | Нач ост(0) | Приход (50) | Расход (25) | Кон ост(25)

(Группировка по номенклатуре, партии)

Это мне никак не дает информации о том, сколько товар лежал на складе
13 live in sky dreams
 
19.12.16
12:43
Нашел... префразировал поисковую фразу и нашлось: Книга знаний: Запрос: количество дней наличия товара на складе за период.

Буду руководствоваться этим запросом, спасибо, тема закрыта
14 dmpl
 
19.12.16
12:43
(12) Уточню один момент: вас интересует срок хранения (т.е. сколько вы не могли реализовать закупленный товар) или вы выставляете счет за хранение товара?

Во втором случае надо для разности брать дату реализации и дату прихода партии. Т.е. выбираем реализации за период и группируем по дате реализации и дате партии, количество товара суммируем. Получим в итоге таблицу Партия - Дата реализации - Количество товара - Количество дней хранения.
15 live in sky dreams
 
19.12.16
12:45
Блин, рано бить в ладоши, это немного не то...
(14), да мне нужно второе...
16 live in sky dreams
 
19.12.16
12:48
(14) В данном случае мне необходимо выставить счет не только за те партии, которые пришли за отчетный период, но и за те, что были оприходованы ранее.
Для вычисления разности дат думаю воспользуюсь ВЫБОР-ом.

ВЫБОР Когда Партия.Дата < &ДатаНачалаОтчета Тогда &ДатаНачалаОтчета ИНАЧЕ Партия.Дата КОНЕЦ КАК ДатаНачалаРасчета
17 Злопчинский
 
19.12.16
13:00
(6) "Есть реквизит КодОперации, но в ВТ он не доступен, "
тебе по любасику придется брать операции ОБОРОТА товара - здесь и брать этот код операции. а где он доустпен а где нет - это пусть ежи решают, нам, совам, с точки зрения стратегии это пофиг..
18 Злопчинский
 
19.12.16
13:03
(12) ну припиши в эту строку флажок =1 если начост >0 или коност>0 или приход >0. сумма этих единичек по "товар-партия" и будет колво дней партии. может конечно не сильно оптимально, но прочто и ясно. никаких предыдущих периодов и многоэтажной хрени
19 Злопчинский
 
19.12.16
13:05
(16) решается в (18). все что нужно дополнительно - отфильтровать внутренние движения. не бог какой весть сложности задача.
20 live in sky dreams
 
19.12.16
14:50
(18)Думал уже об этом.

Допустим, имеем строки таблицы(где показатели приход и расход - из таблицы оборотов с фильтром по виду операции, партия, к примеру пока только одна):

Дата | Номенклатура | НачОст | Приход | Расход | КонОст
01.12| Товар 1______| 2______| 3______| 0______| 5
02.12| Товар 1______| 5______| 0______| 5______| 0
03.12| Товар 1______| 0______| 0______| 0______| 0
04.12| Товар 1______| 0______| 4______| 0______| 4
05.12| Товар 1______| 4______| 5______| 0______| 9


Если обрабатывать такую таблицу вышеуказанным образом, то получается, что мне необходимо посчитать количество товара, бывавшем в этот день на складах фирмы?
А именно показатели "НачОст" + "Приход".

Дата | Номенклатура | НачОст | Приход | Расход | КонОст |Хранилось в этот день в ед. хранения
01.12| Товар 1______| 2______| 3______| 0______| 5______|2+3=5
02.12| Товар 1______| 5______| 0______| 5______| 0______|5+0=5
03.12| Товар 1______| 0______| 0______| 0______| 0______|0+0=0
04.12| Товар 1______| 0______| 4______| 0______| 4______|0+4=4
05.12| Товар 1______| 4______| 5______| 0______| 9______|4+5=9

После, для каждого дня месяца я высчитываю цену хранения за день (кол-во дней в месяце разное) и приджойниваю эту таблицу к вышеуказаной, откуда уже смогу посчитать рублики... Вроде так..
Все верно? Ничего не забыл?
21 live in sky dreams
 
19.12.16
14:52
Не, что то тут не так
22 ИС-2
 
naïve
19.12.16
15:07
типовой отчет анализ оборачиваемости товара не подходит?
23 live in sky dreams
 
19.12.16
16:52
Там среднее все
24 mistеr
 
19.12.16
19:16
(20) Чет ты усложняешь все по-моему. Тебе нужно плясать от документа списания. Выбираешь его движения по регистратору, смотришь партии (Документ оприходования), даты этих партий и считаешь разность даты списания и даты оприходования. Тут же учитываешь особый случай "отгрузили в тот же день". Все.

Внутренние перемещения между складами вроде не сбивают исходные партии.
25 Злопчинский
 
19.12.16
21:15
(24) да, так даже проще по идее. единственное что дату оприходования "обрезаешь" началом периода если надо
26 Злопчинский
 
19.12.16
21:36
тьфу на вас. всех сразу.
вариант в (24) катит только для товаров, которые в отчетный период убыли из фирмы (полностью или частично, хз, не вникал)

все равно - если товар не двигался за пределы фирмы, то надо определить этот факт и считать срок хранения от даты оприходования партии до текущей даты. Поэтому нефиг морочиться, считать как в (20), по каждому дню хранения -- был факт хранения или нет - это определяем как в (20) и считаем скольо хранилось единиц (для красоты можно суптимизировать запрос/алгоритм вусмерть).

по факту хранения: считаем КОНОСТ и умножаем на тариф.
и прибавляем количество отгруженных за период единиц хранения умноженных на тариф.ибо неполный день хранения тоже учитываем. а каждая отгруженная единица дает 1 день хранения, не учтенный в коност.
27 mistеr
 
19.12.16
23:21
(26) >катит только для товаров, которые в отчетный период убыли из фирмы

Я полагаю, задача считать все это возникает только тогда, когда товар таки убывает из фирмы.
28 2S
 
19.12.16
23:30
Это все смахивает на отчет оборачиваемости товаров.
29 Злопчинский
 
20.12.16
00:53
(27) совсем не обязательно. расчет хранения может производиться как в момент выбытия, так и за какой период. у меня, например, товар на ОХ стоять может долго, считается помесячно.. еще зависит и от типа паллеты (евро/фин). моджет еще зависет входят ли данные единицы/места храненяи этих единиц в оговоренный лимит или хранение сверх установленного лимита и тд и тп.
30 live in sky dreams
 
20.12.16
12:24
В общем, как то так...
По быстрому, для отладки, соорудил РС для цен на хранение.
Вроде правду кажет... Но конструктивная критика запроса приветствуется.

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

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

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

СГРУППИРОВАТЬ ПО
    Обороты.Номенклатура,
    Обороты.ХарактеристикаНоменклатуры,
    Обороты.СерияНоменклатуры,
    НАЧАЛОПЕРИОДА(Обороты.Период, ДЕНЬ)
;

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

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

УПОРЯДОЧИТЬ ПО
    Номенклатура,
    СерияНоменклатуры,
    ХарактеристикаНоменклатуры,
    ДатаКалендаря
31 live in sky dreams
 
20.12.16
12:25
Ну и "РегламентированныйПроизводственныйКалендарь" заменить на ТаблицуЗначений, ибо не везде и не всегда календарь заполнен
32 Злопчинский
 
20.12.16
12:38
(30) у вас там что за деятельность и что за хранение? ОХ? 3PL? иное что-то? у меня тоже есть хранение, паллеты тысячами ходют - но вот универсального механизма-шаблонизатора расчета/биллинга/тарификации - так и не соорудил...
33 live in sky dreams
 
20.12.16
12:44
(31) ОХ. Начинают только. Пока без адресов. Простенько и незамысловато.

То, что я делаю - временный костыль, пока руководство на отраслевку не разродится(накопит). Им пока трудно вытащить из кармана 150-300 руб и финансово и психологически.
Пытаются обойтись "малой кровью".
Программист всегда исправляет последнюю ошибку.