Имя: Пароль:
1C
1С v8
Пустой СписокЗначении в параметре запроса.
, , , , , , ,
0 lirt82
 
04.05.17
17:32
Пишу отчет, создал реквизит СписокТоваров тип списокЗначении, нужно сформировать запрос
если не выбрали ничего т.е. пустой список то отчет формируется по всей номенклатуре, не могу это закодить:)

Процедура СформироватьНаСервере()
    
    СпНоменклатуры = Новый СписокЗначений;
    СпНоменклатуры.Добавить(СписокТоваров);
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    РеализацияТоваровТовары.Номенклатура,
                   |    РеализацияТоваровТовары.Цена,
                   |    РеализацияТоваровТовары.Количество
                   |ИЗ
                   |    Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
                   |ГДЕ
                   |    РеализацияТоваровТовары.Номенклатура В(&СпНоменклатуры)";
                  
    Запрос.УстановитьПараметр("СпНоменклатуры", СпНоменклатуры);
1 КоньЛапчатый
 
04.05.17
17:33
(0) Так напиши:

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    РеализацияТоваровТовары.Номенклатура,
                   |    РеализацияТоваровТовары.Цена,
                   |    РеализацияТоваровТовары.Количество
                   |ИЗ
                   |    Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
                   |ГДЕ
                   |    РеализацияТоваровТовары.Номенклатура В(&СпНоменклатуры)";
                  
    Запрос.УстановитьПараметр("СпНоменклатуры", СписокТоваров);
2 Тролебузин
 
04.05.17
17:35
ГДЕ
    ВЫБОР КОГДА ЕстьОтборПоНоменклатуре ТОГДА РеализацияТоваровТовары.Номенклатура В(&СпНоменклатуры) ИНАЧЕ ИСТИНА КОНЕЦ

Запрос.УстановитьПараметр("ЕстьОтборПоНоменклатуре", СпНоменклатуры.Количество() > 0);
3 Волшебник
 
модератор
04.05.17
17:36
ГДЕ &ЕстьОтбор И Номенклатура В ИЕРАРХИИ(&СпНоменклатуры)

а вообще запрос к документам — плохая примета
4 КоньЛапчатый
 
04.05.17
17:37
не сразу понял суть.
так тогда надо:

Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    РеализацияТоваровТовары.Номенклатура,
                   |    РеализацияТоваровТовары.Цена,
                   |    РеализацияТоваровТовары.Количество
                   |ИЗ
                   |    Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары" +
                   ?(СписокТоваров.Количество() = 0, "",  "
                   |ГДЕ
                   |    РеализацияТоваровТовары.Номенклатура В(&СпНоменклатуры)");
                  
                   если СписокТоваров.Количество() > 0 тогда
                   Запрос.УстановитьПараметр("СпНоменклатуры", СписокТоваров);
                   конецесли;
5 lirt82
 
04.05.17
17:47
при выполнении этого запроса, если ничего не выбрали то результат пустой, а нужно если ничего не выбрали то по всей номенклатуре
6 lirt82
 
04.05.17
17:48
(4) все отбой спасибо всем
7 Chameleon1980
 
04.05.17
18:12
(4) тут уже конструктором не воспользуешься
красивее варианты выше
8 Windyhead
 
04.05.17
18:13
в (3) ошибочка небольшая вместо "И" надо ИЛИ
ну и заменить параметр "ЕстьОтбор" по смыслу на "НетОтбора"
9 Chameleon1980
 
04.05.17
18:15
(8) все норм там
10 Windyhead
 
04.05.17
18:17
(9) Уверен?
11 Chameleon1980
 
04.05.17
18:21
(10) почти на 100%.

почему так - 100% никогда стараюсь не двавать
12 Chameleon1980
 
04.05.17
18:22
+ (11) хотя сам в жизни использую как в (2)
13 Windyhead
 
04.05.17
18:25
(12) При ЕстьОтбор = Ложь все выражение будет Ложь и соотвественно пустой результат запроса.
14 Chameleon1980
 
04.05.17
18:28
(13) согласен
вариант из
выбор когда тогда иначе истина конец
тогда
15 Chameleon1980
 
04.05.17
18:31
+(14)
т.е. вариант (для меня, по-крайней мере)
более понятный такой:

ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Номенклатура,
    ТоварыНаСкладахОстатки.КоличествоОстаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(
            &ДатаСреза,
            ВЫБОР
                КОГДА &ЕстьОтбор
                    ТОГДА Номенклатура В Иерархии(&СписокНоменклатуры)
                ИНАЧЕ ИСТИНА
            КОНЕЦ) КАК ТоварыНаСкладахОстатки
16 Buster007
 
04.05.17
18:51
(15) а зачем Иначе?
17 Chameleon1980
 
04.05.17
19:07
Если ЕстьОтбор будет ложь
без иначе не отработает как с неуказанным списком
18 lirt82
 
05.05.17
07:37
апну тему, в консоле запрос отрабатывает нормально, а файл отчета ругается
на форме 2 реквизита
ТоварыСп тип СписокЗначений, Тип значения списка СправочникСсылка.Номенклатура
и ПодразделениеСп тип СписокЗначений, Тип значения списка СправочникСсылка.ПодразделенияОрганизаций
если на форме у оба реквизита не заполню то ругается
Форма.ФормаОтчета.Форма(53)}: Ошибка при вызове метода контекста (Выполнить)
    РезультатЗапроса = Запрос.Выполнить().Выбрать();
по причине:
{(16, 25)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов.
КОГДА &СписокТоваров <<?>>= ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

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

подскажите как исправить?
19 lirt82
 
05.05.17
07:43
кстати даже если укажу подразделение и номенклатуру такая же ошибка, а в консоле нет, пустые или заполнениые параметры все формирует:)
20 Тихий омут
 
05.05.17
07:52
(18) у тебя сам параметр запроса СписокТоваров какого типа? Список значений. Вот оно и ругается, что не может сравнить список и ссылку. Кстати, с подразделениями у тебя такая же песня.
21 lirt82
 
05.05.17
07:56
(20) понял...так как исправить?
22 h-sp
 
05.05.17
07:59
(21)  убрать этот бред

               |            КОГДА &СписокТоваров = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
    
лучше и диск сразу пререформатируй, чтобы такую ахинею больше не повторить случайно.
23 lirt82
 
05.05.17
08:01
(22) суть такова что пользователь может выбрать номенклатуру а может и не выбрать, если не выбрал то по всей номенклатуре
24 sFAQer
 
05.05.17
08:04
(23) Стаж: 7 лет 9 месяцев 28 дней.
Как у тебя это получается спустя почти 8 лет?
25 Тихий омут
 
05.05.17
08:06
(21) добавляй в запрос параметры ЕстьОтборПоНоменклатуре и ЕстьОтборПоПодразделениям, используй методу из (3). Сами параметры инициализируй как Запрос.УстПарам("ЕстьОтборПоПодразделениям",СписокПодр.Количество()=0)
(22) чё так жёстко-то? я так прежде чем снеговиком занялся, не одну тонну прямых скульных запросов написал для 7.7, и то с трудом въехал в кроссплатформенный бардак запросов восьмёрки. так что имхо норм всё, учится человек
26 Тихий омут
 
05.05.17
08:07
(21) +(25) в моем примере есть ошибка, но ты сам её найди, напрягай внутричерепную мышцу, а то атрофируется
27 darius357
 
05.05.17
08:26
ну как всегда побакланили, и нифига толку
28 makfromkz
 
05.05.17
08:31
я по-колхозному действую

ГДЕ
РеализацияТоваровТовары.Номенклатура В(&СпНоменклатуры) ИЛИ &флПустой


флПустой заполняю истиной когда список пустой
иначе ложь
29 lirt82
 
05.05.17
09:00
(28) спасибо за совет
сделал так
Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    СписаниеТоваровТовары.Номенклатура,
                   |    СписаниеТоваровТовары.Ссылка.Дата,
                   |    СписаниеТоваровТовары.Ссылка.Подразделение,
                   |    СписаниеТоваровТовары.ОсновноеСредство,
                   |    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена,
                   |    СписаниеТоваровТовары.Количество
                   |ИЗ
                   |    Документ.СписаниеТоваров.Товары КАК СписаниеТоваровТовары
                   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаОкончания, ) КАК ЦеныНоменклатурыСрезПоследних
                   |        ПО СписаниеТоваровТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
                   |ГДЕ
                   |    (СписаниеТоваровТовары.Ссылка.Проведен = ИСТИНА
                   |                И (СписаниеТоваровТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания)
                   |                И СписаниеТоваровТовары.Номенклатура В (&СписокТоваров)
                   |            ИЛИ &флПустой2
                   |                И СписаниеТоваровТовары.ОсновноеСредство <> НЕОПРЕДЕЛЕНО
                   |                И СписаниеТоваровТовары.Ссылка.Подразделение В (&СписокПод)
                   |            ИЛИ &флПустой)";
    
    Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
    Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ДатаОкончания));
    Запрос.УстановитьПараметр("СписокТоваров", СписокТоваров);
    Запрос.УстановитьПараметр("флПустой2", ?(СписокТоваров.Количество() = 0,Истина,Ложь));
    Запрос.УстановитьПараметр("СписокПод", СписокПод);
    Запрос.УстановитьПараметр("флПустой", ?(СписокПод.Количество() = 0,Истина,Ложь));

но опять если ничего не выбираем то пустой результат
30 AlvlSpb
 
05.05.17
09:09
(29) Это запрос в отчете? СКД?
31 catena
 
05.05.17
09:14
(29)Если я правильно поняла логику условия, то после &флПустой2 нужно поставить закрывающую скобку, и перед "СписаниеТоваровТовары.ОсновноеСредство <> НЕОПРЕДЕЛЕНО" поставить открывающую скобку. Логические операции имеют свои приоритеты и без расставленных скобок "И" более приоритетно, чем "ИЛИ".
32 lirt82
 
05.05.17
09:16
(30) не СКД
33 AlvlSpb
 
05.05.17
09:21
(32) Как вариант
Запрос как в (0). После запроса:

Если СпНоменклатуры.Количество()=0 Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст,"ГДЕ РеализацияТоваровТовары.Номенклатура В(&СпНоменклатуры)", "");
Иначе Запрос.УстановитьПараметр("СпНоменклатуры", СпНоменклатуры)
КонецЕсли;
34 lirt82
 
05.05.17
09:25
(33) нужен вариант для (28)
35 Мимохожий Однако
 
05.05.17
09:25
Сделай два текста запроса для списка и для всех товаров и по условию выбирай. Это для случая, если не разберешься с условиями.
36 catena
 
05.05.17
09:26
(35)У него два списка. Предлагаете четыре запроса?
37 Мимохожий Однако
 
05.05.17
09:27
(36) да хоть 100. Сначала пусть добьётся результата. А потом играется с условиями. Полезно для обучения.
38 НЕА123
 
05.05.17
09:28
OFF
почему игнорируют ПостроительЗапроса, ПостроительОтчета?
39 AlvlSpb
 
05.05.17
09:34
(34) Какая разница? Задача - убрать условие, если списки пустые. Убирайте условия правкой запроса по условию. Просто условие будет сложней, удалять надо две строки и в комбинации строк, а так принцип один и тот же. флПустой тогда вообще не нужен
40 AlvlSpb
 
05.05.17
09:47
Хорошо:

Условие в запросе:
                              
                              ГДЕ (СписаниеТоваровТовары.Ссылка.Проведен = ИСТИНА
                                   И (СписаниеТоваровТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания)
                                   И СписаниеТоваровТовары.ОсновноеСредство <> НЕОПРЕДЕЛЕНО

После запроса:
Если СписокТоваров.Количество > 0 Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, " = ИСТИНА", " = ИСТИНА И СписаниеТоваровТовары.Номенклатура В (&СписокТоваров)");
Запрос.УстановитьПараметр("СписокТоваров", СписокТоваров);
КонецЕсли;
Если СписокПод.Количество > 0 Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "<> НЕОПРЕДЕЛЕНО", "<> НЕОПРЕДЕЛЕНО И СписаниеТоваровТовары.Ссылка.Подразделение В (&СписокПод)");
Запрос.УстановитьПараметр("СписокПод", СписокПод);
КонецЕсли;
41 AlvlSpb
 
05.05.17
09:48
Пропустил скобки после Количество() в обоих случаях, подставь
42 lirt82
 
05.05.17
11:16
(40) опять также ерунда, если ничего не выбираем то отладчик все равно говорит СписокТоваров.Количество()>0
43 catena
 
05.05.17
11:39
(42)Так это у вас со списком что-то не то.
44 AlvlSpb
 
05.05.17
16:44
(42) Разобрались? Я кажется врубился. У вас скорей всего, списки уже сформированы и пользователь просто выбирает значение из списка? Но список-то уже есть! И, даже, если пользователь ничего не выбрал список не пустой! В этом случае условие конечно не такое.

Если ЗначениеЗаполнено(Объект.Список) Тогда ....

// Объект.Список - поле формы со списком значений
45 echo77
 
05.05.17
17:18
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший