Имя: Пароль:
1C
1С v8
8.2 Условие на пустой список значений в запросе
0 adron
 
22.08.13
16:49
Дано:
В запросе есть условие, в качестве параметра выступает список.

Задача:
Написать запрос с условием так, чтобы: если список пуст - выдавались все данные, если нет - отрабатывало условие.

Вот тут: http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=584175
дали совет - условие можно заключить в фигурные скобки но у меня не получается - условие не срабатывает.

Вопрос: почему такой приём не срабатывает у меня?.

Кусок запроса, который работает не так как нужно (выдает всю номенклатуру вне зависимоcти от того заполнен параметр или нет):

ВЫБРАТЬ
    НоменклатураСегмента.Номенклатура,
    НоменклатураСегмента.Сегмент.Ответственный КАК Менеджер
ПОМЕСТИТЬ ВТ_ТоварыМенеджеров
    ИЗ
    РегистрСведений.НоменклатураСегмента КАК НоменклатураСегмента
{ГДЕ
    НоменклатураСегмента.Сегмент.Ответственный В ИЕРАРХИИ (&МассивМенеджеров)}
1 viktor_vv
 
22.08.13
16:53
А как ты параметр задаешь ?
Я так подозреваю фигурные скобки влияют, если не установлен параметр, то условие не отрабатывается.
2 mikecool
 
22.08.13
16:54
(1) смотря где ,в консоли запросов не отработают
3 ReaLg
 
22.08.13
16:58
Как вариант:
ГДЕ &УсловиеНаСписок

далее в коде если список пустой - СтрЗаменить(Запрос.Текст, "&УсловиеНаСписок", "ИСТИНА")
если не пустой - заменяешь на свое условие.
4 chigsrOck
 
22.08.13
17:00
а почему не ввести еще один параметр &СписокЗаполнен и в условиях прописать Выбор когда &СписокЗаполнен тогда номенклатура в(&СписокНоменклатуры) иначе истина конец ?? По-моему проще читается?
5 viktor_vv
 
22.08.13
17:06
(2) Ну да, они у меня и просто в запросе не отрабатывают, хотя это таже консоль наверное. Я так понял это для построителя.
6 acsent
 
22.08.13
17:07
используй построитель
7 vhl
 
22.08.13
17:10
Запрос = Новый ПостроительЗапроса;
    Запрос.Текст = "ВЫБРАТЬ
                   |    Номенклатура.Ссылка
                   |ИЗ
                   |    Справочник.Номенклатура КАК Номенклатура
                   |{ГДЕ
                   |    Номенклатура.Родитель}";
                  
    Если СписокРодители.Количество() > 0 Тогда
        ЭлементОтбора = Запрос.Отбор.Добавить("Родитель");
        ЭлементОтбора.Установить(СписокРодители);
    КонецЕсли;
    Запрос.Выполнить();
    Результат = Запрос.Результат;
8 adron
 
22.08.13
17:12
(1) Вот так:

Если ЗначениеЗаполнено(Менеджеры) Тогда
        Запрос.УстановитьПараметр("МассивМенеджеров",Менеджеры.ВыгрузитьЗначения());

КонецЕсли;
9 adron
 
22.08.13
17:13
(3) в итоге примерно так и делаю, только со скобками короче:

ГДЕ
    ВЫБОР
            КОГДА &ПрименятьУсловиеМенеджер
                ТОГДА НоменклатураСегмента.Сегмент.Ответственный В ИЕРАРХИИ (&МассивМенеджеров)
            ИНАЧЕ 1 = 1
        КОНЕЦ
10 viktor_vv
 
22.08.13
17:14
Так тоже не длинное

Где &ПрименятьУсловиеМенеджер и НоменклатураСегмента.Сегмент.Ответственный В ИЕРАРХИИ (&МассивМенеджеров)
11 adron
 
22.08.13
17:15
(7) Попробую, спасибо.
12 adron
 
22.08.13
17:16
(10) согласен, но появляется ещё один параметр, и его установка...
13 MSOliver
 
22.08.13
17:16
1=1, истина
14 adron
 
22.08.13
17:16
тут больше вопрос в том МОЖНО ли скобки использовать. А не в том как ВООБЩЕ можно обыграть. Хочу для себя определиться:)
15 MSOliver
 
22.08.13
17:17
А фигурное скобки зачем знаешь?
16 adron
 
22.08.13
17:18
(15) Вопроса не понял:) У меня был опыт написания отчета/запроса в СКД. Там скобки отрабатывали для пустого параметра как надо.
17 viktor_vv
 
22.08.13
17:19
(10)+ Только там ИЛИ надо.
18 adron
 
22.08.13
17:21
(7) Блин построитель не работает с временными таблицами - нет свойства МенеджерВременныхТаблиц:(
19 viktor_vv
 
22.08.13
17:30
(18) А ты из запроса тяни текст полученного запроса и выполняй его в обычном запросе.
Хотя так уже проще дополнительный параметр загнать.
20 adron
 
22.08.13
17:33
(10) не так
(17) и не так
а похоже вот так

ГДЕ &ВсеМенеджеры или НоменклатураСегмента.Сегмент.Ответственный В (&МассивМенеджеров)

ВсеМенеджеры - истина, если список пуст
21 adron
 
22.08.13
17:34
Ладно, похоже что со скобками не канает:(
22 viktor_vv
 
22.08.13
17:36
(20) Ну таки да, примерно так и подразумевал, особо не вдаваясь в смысл паарметров :).
23 vhl
 
22.08.13
17:38
вообще в книге было: http://kb.mista.ru/article.php?id=269 несколько вариантов
24 adron
 
22.08.13
17:38
(22) спасибо за подсказку. Такое написание приемлимо.
25 adron
 
22.08.13
17:41
(23) забыл про книгу. Спасибо за ссылку будем учить матчасть.