Имя: Пароль:
1C
1С v8
Помогите пожалуйста с запросом
0 AnisaL
 
23.09.20
10:39
Добрый день! Есть запрос к справочнику номенклатура, который считает какое количество на складе товара в 3-х регионах и плюс с ценой по региону, и он выдает по 15 строк одной и той же номенклатуры, вместо одной строки со всеми количествами и ценами. Как быть?

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

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

СГРУППИРОВАТЬ ПО
    СпрНоменклатура.Ссылка,
    ТоварыНаСкладах.Склад,
    ЦеныНоменклатурыСрезПоследних.ВидЦены
1 dka80
 
23.09.20
10:41
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(,

Выполни этот запрос отдельно и ты увидишь почему. Срез последних регистра сведений дает по всем Измерениям. У тебя, видимо, характеристики есть
2 ДенисЧ
 
23.09.20
10:41
Как выбираешь, так и выдаёт... Не надо считать 1с умней себя...
3 AnisaL
 
23.09.20
10:42
(0) Вот что выдает запрос: https://b.radikal.ru/b34/2009/d1/a52bb19b1325.jpg
4 AnisaL
 
23.09.20
10:45
(1) Нет, характеристик нету
5 ДенисЧ
 
23.09.20
10:45
А если

СГРУППИРОВАТЬ ПО
    СпрНоменклатура.Ссылка,
//    ТоварыНаСкладах.Склад,
    ЦеныНоменклатурыСрезПоследних.ВидЦены
6 AnisaL
 
23.09.20
11:02
(5) {(4, 9)}: Поле не входит в группу "ТоварыНаСкладах.Склад"
КОГДА <<?>>ТоварыНаСкладах.Склад В (&Магнитогорск)
{ВнешняяОбработка.ИнструментыРазработчикаКонсольЗапросов.МодульОбъекта(555)}:    ПарЗап = Запрос.НайтиПараметры();
{ВнешняяОбработка.ИнструментыРазработчикаКонсольЗапросов.Форма.Форма.Форма(1439)}:    РезультатСтруктура = ОбъектОбработки().СчитатьПараметрыЗапроса(ТекстЗапроса, ИдентификаторТекущегоЗапроса);
{ВнешняяОбработка.ИнструментыРазработчикаКонсольЗапросов.Форма.Форма.Форма(1038)}:    ЗаполнитьПараметрыПриВыполненииЗапроса(Текст);
{ВнешняяОбработка.ИнструментыРазработчикаКонсольЗапросов.Форма.Форма.Форма(1010)}:    ВыполнитьЗапросСервер(ИндексТекущегоЗапроса, РезультатЗапроса, ВыводитьВременныеТаблицы, ВыводитьИдентификатор, Текст, ТекстСообщения);
{ВнешняяОбработка.ИнструментыРазработчикаКонсольЗапросов.Форма.Форма.Форма(518)}:    ЗапуститьВыполнениеЗапроса(Ложь);

по причине:
{(4, 9)}: Поле не входит в группу "ТоварыНаСкладах.Склад"
КОГДА <<?>>ТоварыНаСкладах.Склад В (&Магнитогорск)
7 eTmy
 
23.09.20
11:10
Представление null сделайте правильно и все сгруппируется
8 AnisaL
 
23.09.20
11:11
(7) Подскажите как это сделать? Я что-то не соображу
9 AnisaL
 
23.09.20
11:22
(7) (1) Удалила из запроса левое соединение с регистром сведений цены срез последних, оставило только количество, и теперь стало выдаваться 5 строк: https://a.radikal.ru/a29/2009/38/9002dfdde43d.jpg
10 AnisaL
 
23.09.20
11:23
(9) То есть количество не правильно формируется
11 AnisaL
 
23.09.20
11:34
Что-то ничего у меня не получается (. Может вообще как-то по другому надо запрос написать?
12 AnisaL
 
23.09.20
11:50
Вот убрала цены, вот что получилось : https://b.radikal.ru/b34/2009/28/e1a6a802d41e.jpg
13 dka80
 
23.09.20
11:55
(12) запрос покажи
14 AnisaL
 
23.09.20
12:02
(13)
ВЫБРАТЬ
    СпрНоменклатура.Наименование КАК Наименование,
    СпрНоменклатура.Артикул КАК Артикул,
    ВЫБОР
        КОГДА ТоварыНаСкладах.Склад.Родитель = &Магнитогорск
            ТОГДА СУММА(ЕСТЬNULL(ТоварыНаСкладах.ВНаличииОстаток, 0))
        ИНАЧЕ 0
    КОНЕЦ КАК КолвоМагнитогорск,
    ВЫБОР
        КОГДА ТоварыНаСкладах.Склад.Родитель = &Челябинск
            ТОГДА СУММА(ЕСТЬNULL(ТоварыНаСкладах.ВНаличииОстаток, 0))
        ИНАЧЕ 0
    КОНЕЦ КАК КолвоЧелябинск,
    
    ВЫБОР
        КОГДА ТоварыНаСкладах.Склад.Родитель = &Оренбург
            ТОГДА СУММА(ЕСТЬNULL(ТоварыНаСкладах.ВНаличииОстаток, 0))
        ИНАЧЕ 0
    КОНЕЦ КАК КолвоОренбург
                    
ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, ) КАК ТоварыНаСкладах
        ПО (ТоварыНаСкладах.Номенклатура = СпрНоменклатура.Ссылка)
ГДЕ
    НЕ СпрНоменклатура.ЭтоГруппа

СГРУППИРОВАТЬ ПО
    СпрНоменклатура.Наименование,
    СпрНоменклатура.Артикул,
    ТоварыНаСкладах.Склад.Родитель
15 eTmy
 
23.09.20
12:04
(12) В пустых колонках какой тип данных? Null?
16 Andreyyy
 
23.09.20
12:04
(14) Попробуйте сначала во временную таблицу, а оттуда выборку и сгруппировать.
Что-то было подобное, не нашел другого решения.
17 eTmy
 
23.09.20
12:10
ВЫБРАТЬ
    СпрНоменклатура.Наименование КАК Наименование,
    СпрНоменклатура.Артикул КАК Артикул,
    МАКСИМУМ(ВЫБОР
        КОГДА ТоварыНаСкладах.Склад.Родитель = &Магнитогорск
            ТОГДА СУММА(ЕСТЬNULL(ТоварыНаСкладах.ВНаличииОстаток, 0))
        ИНАЧЕ 0
    КОНЕЦ) КАК КолвоМагнитогорск,
    МАКСИМУМ(ВЫБОР
        КОГДА ТоварыНаСкладах.Склад.Родитель = &Челябинск
            ТОГДА СУММА(ЕСТЬNULL(ТоварыНаСкладах.ВНаличииОстаток, 0))
        ИНАЧЕ 0
    КОНЕЦ) КАК КолвоЧелябинск,
    
    МАКСИМУМ(ВЫБОР
        КОГДА ТоварыНаСкладах.Склад.Родитель = &Оренбург
            ТОГДА СУММА(ЕСТЬNULL(ТоварыНаСкладах.ВНаличииОстаток, 0))
        ИНАЧЕ 0
    КОНЕЦ КАК КолвоОренбург
                    
ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, ) КАК ТоварыНаСкладах
        ПО (ТоварыНаСкладах.Номенклатура = СпрНоменклатура.Ссылка)
ГДЕ
    НЕ СпрНоменклатура.ЭтоГруппа

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

Если там не null, то вот так должно схлопнуться (агрегатную функцию нужную сами выберите)
18 AnisaL
 
23.09.20
12:12
(15) А как узнать? В конфигураторе эти столбцы с типом "число"
19 eTmy
 
23.09.20
12:14
(18) В консоли запроса, в результате запроса просто 2 раза тыкнуть, откроется значение)
20 AnisaL
 
23.09.20
12:17
(19) я тыкаю 2 раза, и ничего не открывается
21 AnisaL
 
23.09.20
12:17
(17) Ошибка получения информации набора данных
по причине:
Ошибка в запросе набора данных
по причине:
{(4, 14)}: Недопустимо использование вложенных агрегирующих функций
МАКСИМУМ(<<?>>ВЫБОР

Вот какая ошибка выходит
22 dka80
 
23.09.20
12:23
ИНАЧЕ Сумма(0)
23 dka80
 
23.09.20
12:23
Или сначала во временную таблицу без агрегирующих функций, а затем выборка из временной таблицы с агрегирующими функциями
24 dka80
 
23.09.20
12:27
(21)
сумма(ВЫБОР
        КОГДА ТоварыНаСкладах.Склад В (&Оренбург)
            ТОГДА (ЕСТЬNULL(ТоварыНаСкладах.ВНаличииОстаток, 0))
        ИНАЧЕ 0
    КОНЕЦ)
25 eTmy
 
23.09.20
12:29
(24) +, тс просто неправильно пыталась сгруппировать
26 Rovan
 
гуру
23.09.20
12:38
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, ) КАК ТоварыНаСкладах - там несколько складов

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ) КАК ЦеныНоменклатурыСрезПоследних - там несколкко видов цен !
27 AnisaL
 
23.09.20
12:53
(24) Теперь 3 строки выдает с одной номенклатурой: https://d.radikal.ru/d16/2009/58/2f2f0f66a7f8.jpg
28 AnisaL
 
23.09.20
13:27
(23) Сделала как вы сказали, сначала во временную таблицу, потом выборку с агрегатными функциями. Получилось в одну строку вывести, спасибо! Но почему-то по Оренбургу остаток не выводит, в чем может быть дело?  https://b.radikal.ru/b12/2009/0a/6b947a9789a9.jpg
29 dka80
 
23.09.20
13:28
СГРУППИРОВАТЬ ПО
    СпрНоменклатура.Ссылка
30 AnisaL
 
23.09.20
13:42
(29) у меня есть эта группировка
31 dka80
 
23.09.20
13:44
(30) только эта группировка должна быть

Неправильно:
СГРУППИРОВАТЬ ПО
    СпрНоменклатура.Ссылка,
    ТоварыНаСкладах.Склад,
    ЦеныНоменклатурыСрезПоследних.ВидЦены

Правильно:
СГРУППИРОВАТЬ ПО
    СпрНоменклатура.Ссылка
32 AnisaL
 
23.09.20
13:52
(31) ВЫБРАТЬ
    СпрНоменклатура.Ссылка КАК Ссылка,
    ВЫБОР
        КОГДА ТоварыНаСкладах.Склад.Родитель = &Магнитогорск
            ТОГДА ЕСТЬNULL(ТоварыНаСкладах.ВНаличииОстаток, 0)
        ИНАЧЕ 0
    КОНЕЦ КАК КолвоМагнитогорск,
    ВЫБОР
        КОГДА ТоварыНаСкладах.Склад.Родитель = &Челябинск
            ТОГДА ЕСТЬNULL(ТоварыНаСкладах.ВНаличииОстаток, 0)
        ИНАЧЕ 0
    КОНЕЦ КАК КолвоЧелябинск,
    ВЫБОР
        КОГДА ТоварыНаСкладах.Склад.Родитель = &Оренбург
            ТОГДА ЕСТЬNULL(ТоварыНаСкладах.ВНаличииОстаток, 0)
        ИНАЧЕ 0
    КОНЕЦ КАК КолвоОренбург
ПОМЕСТИТЬ ВТ
ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, ) КАК ТоварыНаСкладах
        ПО (ТоварыНаСкладах.Номенклатура = СпрНоменклатура.Ссылка)
ГДЕ
    НЕ СпрНоменклатура.ЭтоГруппа
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ.Ссылка КАК Ссылка,
    СУММА(ВТ.КолвоМагнитогорск) КАК КолвоМагнитогорск,
    СУММА(ВТ.КолвоЧелябинск) КАК КолвоЧелябинск,
    СУММА(ВТ.КолвоОренбург) КАК КолвоОренбург
ИЗ
    ВТ КАК ВТ

СГРУППИРОВАТЬ ПО
    ВТ.Ссылка
33 AnisaL
 
23.09.20
13:53
(31) по Магнитогорску и Челябинску все работает, правильно считает остаток, а вот по Оренбургу 0. Не пойму в чем дело?
34 dka80
 
23.09.20
13:54
(33) запрос давай. Может по оренбургу просто нет остатков?
35 AnisaL
 
23.09.20
13:57
(34)
ВЫБРАТЬ
    СпрНоменклатура.Ссылка КАК Ссылка,
    ВЫБОР
        КОГДА ТоварыНаСкладах.Склад.Родитель = &Магнитогорск
            ТОГДА ЕСТЬNULL(ТоварыНаСкладах.ВНаличииОстаток, 0)
        ИНАЧЕ 0
    КОНЕЦ КАК КолвоМагнитогорск,
    ВЫБОР
        КОГДА ТоварыНаСкладах.Склад.Родитель = &Челябинск
            ТОГДА ЕСТЬNULL(ТоварыНаСкладах.ВНаличииОстаток, 0)
        ИНАЧЕ 0
    КОНЕЦ КАК КолвоЧелябинск,
    ВЫБОР
        КОГДА ТоварыНаСкладах.Склад.Родитель = &Оренбург
            ТОГДА ЕСТЬNULL(ТоварыНаСкладах.ВНаличииОстаток, 0)
        ИНАЧЕ 0
    КОНЕЦ КАК КолвоОренбург
ПОМЕСТИТЬ ВТ
ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, ) КАК ТоварыНаСкладах
        ПО (ТоварыНаСкладах.Номенклатура = СпрНоменклатура.Ссылка)
ГДЕ
    НЕ СпрНоменклатура.ЭтоГруппа
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВТ.Ссылка КАК Ссылка,
    СУММА(ВТ.КолвоМагнитогорск) КАК КолвоМагнитогорск,
    СУММА(ВТ.КолвоЧелябинск) КАК КолвоЧелябинск,
    СУММА(ВТ.КолвоОренбург) КАК КолвоОренбург
ИЗ
    ВТ КАК ВТ

СГРУППИРОВАТЬ ПО
    ВТ.Ссылка

Остаток есть, в том то и дело
36 AnisaL
 
23.09.20
13:57
(34) Остаток точно есть
37 dka80
 
23.09.20
14:01
КОГДА ТоварыНаСкладах.Склад.Родитель = &Оренбург
Вот это условие не выполняется. Может параметр неверный, может родитель у склада оренбурга другой
38 AnisaL
 
23.09.20
14:20
(37) Да, действительно, параметр неверный. Просто всего 2 склада с именем Оренбург, и один из них группа, и он находил не группу. Спасибо! А теперь, подскажите, как мне к этим остаткам цены прикрутить?
39 ColonelAp4u
 
23.09.20
14:26
(38) Посмотри как я сделал твой запрос.
ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Склад,
    ТоварыНаСкладахОстатки.Номенклатура,
    СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК Остаток1Склад,
    СУММА(0) КАК Остаток2Склад,
    СУММА(0) КАК Остаток3Склад,
    СУММА(ЦеныНоменклатурыСрезПоследних.Цена) КАК Цена
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(
            &Период,
            Склад = &Склад
                И Номенклатура В (&СписокНоменклатуры)) КАК ТоварыНаСкладахОстатки
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ТипЦен = &ТипЦен1) КАК ЦеныНоменклатурыСрезПоследних
        ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура

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

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

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

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

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

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

СГРУППИРОВАТЬ ПО
    ТоварыНаСкладахОстатки.Склад,
    ТоварыНаСкладахОстатки.Номенклатура
40 ColonelAp4u
 
23.09.20
14:27
тебе нужно поменять в параметрах временных таблиц Склад = &Склад на склад.Родитель = &Магнитогорск или что то там.
41 dka80
 
23.09.20
14:31
(38) выбери цены во временную таблицу, сгруппировав максимум(цена) по номенклатуре.
далее левым соединением к запросу с остатками (что ты во временную таблицу поместила)
42 ColonelAp4u
 
23.09.20
14:38
(41) быстрее запрос отработает через объединение чем через выбор когда, + выбор из справочника с левым соединением по остаткам, зачем? А потом еще этот результат еще одним левым с максимум цена? Почему максимум цена, почему не срез последних по типу цен, который выдаст 1 строчку по 1 номенклатуре.
43 dka80
 
23.09.20
14:41
Потому что у нее несколько типов цен и срез последних выдает несколько строк
44 ColonelAp4u
 
23.09.20
14:42
(43) посмотри мой пример в (39) выдаст как надо + быстрее чем 2 левых соединения.
45 ColonelAp4u
 
23.09.20
14:46
(38) (43) https://imgur.com/a/kH2TLRB  вот результат моего запрос.
46 ColonelAp4u
 
23.09.20
14:47
запроса*.
47 AnisaL
 
23.09.20
15:27
(46) Сейчас смена закончилась, завтра попробую
48 AnisaL
 
24.09.20
11:01
(41) Запрос написала как вы сказали, все получилось, спасибо большое. Могу текст запроса сюда кинуть. Теперь все красиво! Только одна проблемка, из-за того что запрос сильно изменился, пропал заголовок формы списка номенклатуры. Как его добавить? https://c.radikal.ru/c39/2009/08/2cd5f50206a2.jpg
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан