Имя: Пароль:
1C
1С v8
Запрос ищет недостающие цены по остаткам в УТ
0 AndreykO_38
 
10.07.14
11:33
Комрады, помогите, пожалуйста.
УТ немножко не типовая рел.: 10.3.18.4
Есть запрос, выдает табличку типа:
[url=http://tempfile.ru][img]http://img6.tempfile.ru/13190/11f1bbdde6/9fb1a19b3a9f19c228a12f7d.png[/img][/url]
В результате тыщщи строк, в том числе "хорошие" ("хорошие" - это когда есть как минимум три типа цен: "закупочные", "розничные 1" и "розничные 2"). Задача состоит в том, чтобы убрать "хорошие" из результата.

Вообще это для того, чтобы отобразить список товаров, имеющихся на остатках, но у которых не все типы цен установлены из минимально регламентированного списка типов цен (см. определение "хороших").

Такая ситуация получилась после свёртки базы, если кому интересно.
1 AndreykO_38
 
10.07.14
11:36
2 floody
 
10.07.14
12:51
переделать запрос, чтобы возвращал:

ном1 цена1 цена2 цена3
ном2 цена1       цена3
ном3       цена2 цена3
ном4 цена1
3 braynt
 
10.07.14
12:54
запросом ты можешь получить количество типов цен. если больше двух значит норм.
4 AndreykO_38
 
10.07.14
15:18
(2) хм! а вот это мысль! пусть и получится не совсем универсально, но зато по одной строчке на товар... ща попробую
5 AndreykO_38
 
10.07.14
15:20
(3) тут ведь ещё важно какие именно это типы цен...
6 braynt
 
10.07.14
16:51
список цен вы передаете в качестве параметра?
7 AndreykO_38
 
10.07.14
17:38
да, изначально был такой параметр - список типов цен для универсальности, а ну как пользователь пожелает изменить его... но я голову сломал, пытаясь заставить запрос фильтровать результаты именно по минимально достаточному списку типов цен из этого параметра.
А т.к. пользователю наплевать на такой отчет и он(и) начинают паниковать только когда покупатель хочет купить товар, который есть на остатках, но без цены :), можно наплевать и на универсальность.
Поэтому я переделал запрос по совету floody, могу привести пример, если интересно.
8 AndreykO_38
 
10.07.14
17:55
ой, товарищи, не совсем работает.
сам запрос действительно выдает результат типа:
ном1 цена1 цена2 цена3
ном2 цена1       цена3
ном3       цена2 цена3
ном4 цена1

но потом для того, чтобы избавиться от "хороших" строчек, ставлю условие:
ГДЕ ЦеныЗакупочные.Цена = 0 или ЦеныРозничные1.Цена = 0 или ЦеныРозничные2.Цена = 0
и таблица результата вообще пустая, даже если натравить ЕСТЬNULL на цены... (((

ЧЯДНТ?
9 mehfk
 
10.07.14
17:59
а где текст запроса?
10 МихаилМ
 
10.07.14
18:07
неправильно.

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

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

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

УПОРЯДОЧИТЬ ПО
    Остатки.Номенклатура.Наименование
12 AndreykO_38
 
11.07.14
02:19
(10) ммм... идея такая: берем таблицу с остатками (уже с ненулевым количеством) и соединяем с тремя одинаковыми таблицами с ценами (с разными параметрами), потому всю эту кашу естественно группируем единственно по товару и суммируем по ценам... и конечно же получается результат, где есть всё - и "хорошие" и плохие, сюда бы условие красиво воткнуть было, вот и воткнул, а оно мне всю малину портит... хм, пока писал, мысль посетила о запихивании всего запроса во вложенный и на выборку из него уже накладывании нужного условия, проверил - работает! :)
13 mehfk
 
11.07.14
05:46
Видишь разницу? А она есть

    СУММА(ЕСТЬNULL(ЦеныРозничные1.Цена,0)) КАК Розничные1,
    СУММА(ЕСТЬNULL(ЦеныРозничные2.Цена,0)) КАК Розничные2,
    СУММА(ЕСТЬNULL(ЦеныЗакупочные.Цена,0)) КАК Закупочные
...
...
...
ГДЕ
    ЦеныЗакупочные.Цена = 0 или ЦеныРозничные1.Цена = 0 или ЦеныРозничные2.Цена = 0

Делай так

"ВЫБРАТЬ
|    Остатки.Номенклатура,
|    СУММА(Остатки.КоличествоОстаток) КАК Остаток,
|    ЕСТЬNULL(СУММА(ЦеныРозничные1.Цена), 0) КАК Розничные1,
|    ЕСТЬNULL(СУММА(ЦеныРозничные2.Цена), 0) КАК Розничные2,
|    ЕСТЬNULL(СУММА(ЦеныЗакупочные.Цена), 0) КАК Закупочные
|ИЗ
|    (ВЫБРАТЬ
|        ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
|        ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток
|    ИЗ
|        РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК ТоварыНаСкладахОстатки
|    ГДЕ
|        ТоварыНаСкладахОстатки.КоличествоОстаток > 0) КАК Остатки
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ТипЦен = &ТипЦенЗакупочные) КАК ЦеныЗакупочные
|        ПО Остатки.Номенклатура = ЦеныЗакупочные.Номенклатура
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ТипЦен = &ТипЦенРозничные1) КАК ЦеныРозничные1
|        ПО Остатки.Номенклатура = ЦеныРозничные1.Номенклатура
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ТипЦен = &ТипЦенРозничные2) КАК ЦеныРозничные2
|        ПО Остатки.Номенклатура = ЦеныРозничные2.Номенклатура
|ГДЕ
|    (ЕСТЬNULL(ЦеныЗакупочные.Цена, 0) = 0
|            ИЛИ ЕСТЬNULL(ЦеныРозничные1.Цена, 0) = 0
|            ИЛИ ЕСТЬNULL(ЦеныРозничные2.Цена, 0) = 0)
|
|СГРУППИРОВАТЬ ПО
|    Остатки.Номенклатура
|
|УПОРЯДОЧИТЬ ПО
|    Остатки.Номенклатура.Наименование"
14 AndreykO_38
 
11.07.14
16:14
(13) интересно...вообще логично, надо бы запомнить. Спасибо!
15 mehfk
 
11.07.14
16:57
Лови еще один запрос в помощь
ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры,
    ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток
ПОМЕСТИТЬ ВТ_Остатки
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК ТоварыНаСкладахОстатки
ГДЕ
    ТоварыНаСкладахОстатки.КоличествоОстаток > 0
;

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

СГРУППИРОВАТЬ ПО
    Таб1.Номенклатура,
    Таб1.ХарактеристикаНоменклатуры,
    Таб1.КоличествоОстаток,
    Таб1.ТипЦен

УПОРЯДОЧИТЬ ПО
    Таб1.Номенклатура
АВТОУПОРЯДОЧИВАНИЕ