Имя: Пароль:
 
1C
1С v8
Запрос по продажам и видам цен
0 AnisaL
 
11.12.21
11:09
Добрый день! Вчера разбиралась с запросом, все получилось, работает, но оказалась засада, когда 2 типа цен, потому что нету отбора по вид у цен, то суммирует цены:

                 ВЫБРАТЬ

    ДокументНоменклатураПериод.Номенклатура.КатегорияНоменклатуры КАК НоменклатураКатегорияНоменклатуры,

    ДокументНоменклатураПериод.Номенклатура КАК Номенклатура,

    НАЧАЛОПЕРИОДА(ДокументНоменклатураПериод.ПериодПродажиОбороты, МЕСЯЦ) КАК Период,

    ДокументНоменклатураПериод.Контрагент КАК Контрагент,

    ДокументНоменклатураПериод.Документ КАК Документ,

    ДокументНоменклатураПериод.КоличествоОборот КАК КоличествоОборот,

    ЦеныНоменклатуры.Цена * ДокументНоменклатураПериод.КоличествоОборот КАК Сумма

ИЗ

    (ВЫБРАТЬ

        ПродажиОбороты.Документ КАК Документ,

        ПродажиОбороты.Номенклатура КАК Номенклатура,

        ПродажиОбороты.КоличествоОборот КАК КоличествоОборот,

        ПродажиОбороты.Период КАК ПериодПродажиОбороты,

        ПродажиОбороты.Контрагент КАК Контрагент,

        МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период

    ИЗ

        РегистрНакопления.Продажи.Обороты(, , День, ) КАК ПродажиОбороты

            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры

            ПО ПродажиОбороты.Номенклатура = ЦеныНоменклатуры.Номенклатура

                И ПродажиОбороты.Период >= ЦеныНоменклатуры.Период

    ГДЕ

        ПродажиОбороты.Номенклатура.КатегорияНоменклатуры В(&КатегорияНоменклатуры)

        И ЦеныНоменклатуры.ВидЦен = &ВидЦен

        И ПродажиОбороты.Период МЕЖДУ &НачПериода И &КонПериода

    

    СГРУППИРОВАТЬ ПО

        ПродажиОбороты.Документ,

        ПродажиОбороты.Номенклатура,

        ПродажиОбороты.КоличествоОборот,

        ПродажиОбороты.Контрагент,

        ПродажиОбороты.Период) КАК ДокументНоменклатураПериод

        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры

        ПО ДокументНоменклатураПериод.Номенклатура = ЦеныНоменклатуры.Номенклатура

            И ДокументНоменклатураПериод.Период = ЦеныНоменклатуры.Период



УПОРЯДОЧИТЬ ПО

    ДокументНоменклатураПериод.Номенклатура.КатегорияНоменклатуры.Наименование,

    ДокументНоменклатураПериод.Номенклатура.Наименование,

    ДокументНоменклатураПериод.Период

ИТОГИ

    МАКСИМУМ(Контрагент),

    МАКСИМУМ(Документ),

    СУММА(КоличествоОборот),

    СУММА(Сумма)

ПО

    НоменклатураКатегорияНоменклатуры,

    Номенклатура,

    Период

Как сделать, чтобы был еще отбор по виду цен?, так как в регистре Продажи нету параметра Вид цен
1 Смотрящий
 
11.12.21
11:23
Че нить типа
ИЗ
    (ВЫБРАТЬ
        ПродажиОбороты.Документ КАК Документ,
        ПродажиОбороты.Документ.ВидЦен КАК ВидЦен,

И убрать джойны с регистром цен
2 Kassern
 
11.12.21
11:23
(0) вы же отбираете по виду цен  "И ЦеныНоменклатуры.ВидЦен = &ВидЦен " Зачем эти вложенные запросы?
3 AnisaL
 
11.12.21
11:25
(2) мне просто надо цену на дату документа, поэтому вложенный запрос
4 Kassern
 
11.12.21
11:26
(3) а чем вас ресурс регистра накопления не устроил с суммой?
5 AnisaL
 
11.12.21
11:26
(2) это условие не работает "И ЦеныНоменклатуры.ВидЦен = &ВидЦен "
6 AnisaL
 
11.12.21
11:28
(1) такое не работает, пробовала
7 Kassern
 
11.12.21
11:29
(5) используйте конструкцию срез последних и в виртуальной таблице отберите по виду цены и периоду
8 Kassern
 
11.12.21
11:30
(6) а как вы проверяете, работает или нет? У вас ошибка вываливается? В консоли запросов пробовали смотреть по пакетно как у вас результат собирается?
9 AnisaL
 
11.12.21
11:31
(8) да, ошибка выходит в консоли запросов
10 AnisaL
 
11.12.21
11:31
(8) а как смотреть по пакетно?
11 Kassern
 
11.12.21
11:34
(10) разбить отчет на временные таблицы, и в консоли запросов запустить с временными таблицами
12 AnisaL
 
11.12.21
11:44
(7) срез последних у меня изначально был, но тогда цена не на дату документа получается
13 Kassern
 
11.12.21
11:48
(12) вы смотрели вот этот пример https://infostart.ru/1c/articles/77568/ ?
Там без проблем реализовано через временные таблицы. А их уже можно без проблем в консоли просмотреть
14 AnisaL
 
11.12.21
11:49
(13) спасибо, посмотрю
15 AnisaL
 
11.12.21
18:16
(13) вот по примеру сделала: только группировки по периоду не было в примере, сама сделала в итоговой таблице
ВЫБРАТЬ
    ПродажиОбороты.Документ КАК Документ,
    ПродажиОбороты.Период КАК Дата,
    ПродажиОбороты.Контрагент КАК Контрагент,
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    СУММА(ПродажиОбороты.КоличествоОборот) КАК Количество,
    СУММА(ПродажиОбороты.СуммаОборот) КАК Стоимость
ПОМЕСТИТЬ втБезЦены
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, День, ) КАК ПродажиОбороты

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

ИНДЕКСИРОВАТЬ ПО
    Номенклатура,
    Дата,
    Контрагент,
    Документ
;

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

СГРУППИРОВАТЬ ПО
    втБезЦены.Дата,
    втБезЦены.Контрагент,
    втБезЦены.Номенклатура,
    втБезЦены.Документ,
    втБезЦены.Количество,
    втБезЦены.Стоимость

ИНДЕКСИРОВАТЬ ПО
    Номенклатура,
    Дата,
    Контрагент,
    Период
;

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

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

УПОРЯДОЧИТЬ ПО
    втМаксПериод.Номенклатура.КатегорияНоменклатуры.Наименование,
    втМаксПериод.Номенклатура.Наименование,
    НАЧАЛОПЕРИОДА(втМаксПериод.Дата, МЕСЯЦ)
ИТОГИ ПО
    НоменклатураКатегорияНоменклатуры,
    Номенклатура,
    Период
16 AnisaL
 
11.12.21
18:24
(15) http://pics.rsh.ru/img/2021-12-11_bmu77k5k.jpg - вот как выглядит результат запроса
17 Kassern
 
13.12.21
09:12
(16) Поздравляю
18 AnisaL
 
13.12.21
16:06
(17) спасибо, но все-таки я обнаружила, только потом, что нету все равно по виду цен отбора по регистру продажи, и я сделала так: в первой временной таблице присоединила через левое соединение документ расходная накладная, как мне и изначально казалось, что без документа не сделаешь отбор по виду цен
19 vicof
 
13.12.21
16:10
ИЗ
    втМаксПериод КАК втМаксПериод
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО втМаксПериод.Номенклатура = ЦеныНоменклатуры.Номенклатура
            И втМаксПериод.Период = ЦеныНоменклатуры.Период
ГДЕ
    ЦеныНоменклатуры.ВидЦен = &ВидЦен

потом будешь ловить непонятки, почему же в этом периоде цены не заполнены.
20 AnisaL
 
13.12.21
16:30
(19) почему?
21 Kassern
 
13.12.21
16:33
(20) например у вас есть товар, у которого не установлена цена по данному виду цен, как думаете что будет со строчкой оборотов в результирующей таблице если написать следующее?
ГДЕ
    ЦеныНоменклатуры.ВидЦен = &ВидЦен
22 Kassern
 
13.12.21
16:41
Простой пример для понимания
Таб1 //Номенклатура, Количество
Номенклатура1 10
Таб2 //Номенклатура, ВидЦен, Цена
Номенклатура1 Закупочная 50

Соединяем левым соединением к Таб1 таб2 по номенклатуре
//Поля: Номенклатура, Количество, Цена
Получаем 1 строчку Номенклатура1, 10, 50.
Если же мы сделаем отбор Где Таб2.ВидЦены=Розничная
Тогда результирующая таблица будет пустая (условие обрежет все строки после соединения не удовлетворяющие отбору)
Если же надо получить Номенклатура1, 10, 0 - тогда нужно условие делать либо на вкладке связи, либо во временной таблице отобрать таблицу цен по виду цен до соединения с оборотами, либо во временной таблице сделать отбор (но у вас обычная таблица)
23 AnisaL
 
13.12.21
16:42
(21) вот как я написла:
        |    ВЫБОР

    |        КОГДА РасходнаяНакладнаяТовары.Ссылка.ВидЦен <> ЗНАЧЕНИЕ(Справочник.ВидыЦен.ПустаяСсылка)

    |            ТОГДА РасходнаяНакладнаяТовары.Ссылка.ВидЦен

    |        ИНАЧЕ &ВидЦенОптовая

    |    КОНЕЦ КАК ВидЦен
24 Kassern
 
13.12.21
16:43
(23) сделайте временную таблицу с ценами с указанным видом цен, далее вместо обычного регистра цен, используйте вашу временную таблицу с уже отобранным нужным видом цен
25 AnisaL
 
13.12.21
16:47
(24) хорошо, попробую завтра, сейчас смена закончилась )