Имя: Пароль:
1C
 
проверка параметра запроса на пустоту
0 Origin
 
24.06.08
14:28
Есть запрос с параметром(список значений)

как проверить что параметр пустой?
1 luns
 
24.06.08
15:02
(1) В последней версии платформы у объекта запрос есть свойство, "параметры" кажеться - тип Структура - там все параметры
2 hhhh
 
24.06.08
15:07
(1) можно просто список значений взять и проверить.
3 Origin
 
24.06.08
15:11
Уточню, мне это надо ВНУТРИ ЗАПРОСА проверить,
ЕСТЬ NULL не катит - ругается, количество строк в списке не знаю как проверить
4 hhhh
 
24.06.08
15:13
(3) никак
5 lxndr
 
24.06.08
15:15
Запрос.Текст =
"Выбрать
.........
.........
ГДЕ " +?(Список.Количество() = 0, "ИСТИНА", "Таблица.Номенклатура В (&Список)") + И .............
..........";
6 Origin
 
24.06.08
15:27
(5) В запросе так нельзя
7 Origin
 
24.06.08
15:28
(5)а понял сформировать текст так можно,
только у меня компановка там нет у меня возможности текст запроса менять
8 Origin
 
24.06.08
15:37
Еще уточню задачу,

Нужны к примеру остатки ТМЦ из регистраНакопления,
ТМЦ должно быть в спискеТМЦ или все остатки если список ТМЦ не задан
9 hhhh
 
24.06.08
15:43
(8) а зачем тебе проверять? С пустым списком вроде нормально отбабатывает.
10 Megas
 
24.06.08
15:43
.........
.........
ГДЕ " +?(Список.Количество() = 0, "ИСТИНА", "Таблица.Номенклатура В (&Список)") + и
........
А конструкция
Выбрать
когда
...
тогда
...
иначе
...
конец  
неподходит?
11 hhhh
 
24.06.08
15:48
(10) не подходит
12 Origin
 
24.06.08
15:55
(10) не подходит
13 Origin
 
24.06.08
15:57
конструкция
Выбрать
когда

а условие какое?
14 Megas
 
24.06.08
16:14
Вобще я точно не знаю но можно вообще не ставить условий =)
Далее уже в настройках отчёта ставиш ОТБОР  ... и выбираеш что тебе нужно ...
15 Лефмихалыч
 
24.06.08
16:16
(0) проверяй снаружи запроса и генерируй разный текст в зависимости от результата проверки
16 Megas
 
24.06.08
16:17
И ещё ... создаёш форму ....
Процедура ПриОткрытии()
там можно отловить текст запроса... (я видел но делать с ним чтонибудь я не пробовал)
17 Aprobator
 
24.06.08
16:42
В типовой конфе ЗУП используется следующая методика - В запросе надо проверить на пустоту ВидРасчета, так это делается следующим образом (у вида расчета составной тип):
ВЫБОР
   КОГДА ВидРасчета.Код ЕСТЬ NULL ТОГДА
          .....
   ИНАЧЕ
          .....
КОНЕЦВЫБОРА

если тип определен (в 8 - ке не знаю, а в 8.1 это работает)
тогда
ВЫБОР
    КОГДА ТвоеЗначение = ЗНАЧЕНИЕ(Справочник.ТвойСправочник.ПустаяССылка) ну и т.д.
18 hhhh
 
24.06.08
16:46
(17) это не то
19 Aprobator
 
24.06.08
17:05
Тогда так:

УсловиеНаПустотуСписка = ?(ТвойСписок.Количество() > 0, " И ИСТИНА", "И ЛОЖЬ");
ТекстЗапроса =
"...
ВЫБОР
   КОГДА ИСТИНА"  + УсловиеНаПустотуСписка + "
           ....
   ИНАЧЕ
           ....
КОНЕЦВЫБОРА
20 NewNick
 
24.06.08
17:18
>>Еще уточню задачу,

>>Нужны к примеру остатки ТМЦ из регистраНакопления,
>>ТМЦ должно быть в спискеТМЦ или все остатки если список ТМЦ не задан

Номенклатура В
       (ВЫБРАТЬ
           Номенклатура.Ссылка
       ИЗ
           Справочник.Номенклатура КАК Номенклатура,
           (ВЫБРАТЬ
               КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Номенклатура.Ссылка) КАК ЕстьНоменклатура
           ИЗ
               Справочник.Номенклатура КАК Номенклатура
           ГДЕ
               Номенклатура.Ссылка В (&СписокТМЦ)
           ) КАК ВложенныйЗапрос
       ГДЕ
           (Номенклатура.Ссылка В (&СписокТМЦ)
               ИЛИ ВложенныйЗапрос.ЕстьНоменклатура = 0))
21 Aprobator
 
24.06.08
17:30
дык Условие В так и отрабатывает. Если список пустой то оно - всегда дает ИСТИНА, если не пустой, то ИСТИНА выдается только по условию вхождения в список.
Или я чего-то не понял?
22 Aprobator
 
24.06.08
17:32
т.е. данное условие пихаем в условие нужной виртуальной таблицы и вся недолга.
23 NewNick
 
24.06.08
18:03
>>Если список пустой то оно - всегда дает ИСТИНА

угу шас
24 Aprobator
 
24.06.08
18:25
Хм - в самом деле неработает. В 7 - ке это отрабатывало.
25 hhhh
 
24.06.08
18:50
(20) попробуй

В ИЕРАРХИИ (&СписокТМЦ)

может прокатит.
26 NewNick
 
24.06.08
18:55
(25) если в списокТМЦ воткнуть пустую ссылку в случае когда там 0 элементов только тогда прокатит
27 acsent
 
24.06.08
18:58
используй ПостроительЗапроса
28 acsent
 
24.06.08
18:59
{ГДЕ
РегистрТМЦ.ТМЦ.* КАК ТМЦ
}
29 BabySG
 
24.06.08
20:19
(0) Гений1С давным давно нарыл способ это сделать - только в тот момент никто его не понял.
30 lxndr
 
25.06.08
06:49
Если на СКД, то задавай уловие не в основном запросе, а в условиях компоновки
...
{
    ГДЕ Номенклатура В (&Список)
}
...
При отсутствии папаметра условие применяться не будет
31 Aprobator
 
25.06.08
12:38
Поизвращался с заполнением списка на примере справочника Физлиц (под рукой был только ЗУП). Лови - может поможет:
   "ВЫБРАТЬ
   |    ВЫБОР
   |        КОГДА ВложенныйЗапрос.ВСЕГО = 2
   |            ТОГДА ВложенныйЗапрос1.ИзСпис
   |        ИНАЧЕ ВложенныйЗапрос1.Спр
   |    КОНЕЦ КАК Поле1
   |ИЗ
   |    (ВЫБРАТЬ
   |        КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВЫБОР
   |                КОГДА ФизическиеЛица.Ссылка В (&Спис)
   |                    ТОГДА 1
   |                ИНАЧЕ 2
   |            КОНЕЦ) КАК ВСЕГО
   |    ИЗ
   |        Справочник.ФизическиеЛица КАК ФизическиеЛица) КАК ВложенныйЗапрос,
   |    (ВЫБРАТЬ
   |        ФизическиеЛица.Представление КАК Спр,
   |        ВложенныйЗапрос.ЭлемСписка.Представление КАК ИзСпис
   |    ИЗ
   |        Справочник.ФизическиеЛица КАК ФизическиеЛица
   |            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
   |                ФизическиеЛица.Ссылка КАК ЭлемСписка
   |            ИЗ
   |                Справочник.ФизическиеЛица КАК ФизическиеЛица
   |            ГДЕ
   |                ФизическиеЛица.Ссылка В(&Спис)) КАК ВложенныйЗапрос
   |            ПО (ИСТИНА)
   |    ГДЕ
   |        (НЕ ФизическиеЛица.ЭтоГруппа)) КАК ВложенныйЗапрос1
   |
   |СГРУППИРОВАТЬ ПО
   |    ВЫБОР
   |        КОГДА ВложенныйЗапрос.ВСЕГО = 2
   |            ТОГДА ВложенныйЗапрос1.ИзСпис
   |        ИНАЧЕ ВложенныйЗапрос1.Спр
   |    КОНЕЦ";
32 Aprobator
 
25.06.08
12:41
+ 31, т.е. если Спис пустой - то берутся все элементы справочника. Иначе только те, что в условии.
33 Гений 1С
 
гуру
25.06.08
12:54
Можно.
Если в списке - элементы типо номенклатура, то чтото:
ВЫБОР КОГДА 0 В (
  ВЫБРАТЬ Количество(*) ИЗ Справочник.Номенклатура ГДЕ Ссылка В (&Список))
ТОГДА
  //ЙО-МОЙО, ПУСТОЙ СПИСОК
ИНАЧЕ
  //ЙО-МОЙО, НЕ ПУСТОЙ СПИСОК
КОНЕЦ
34 Aprobator
 
25.06.08
13:35
(33) Пробовал таким способом, но если запрос пустой, то это не прокатывает.
35 Гений 1С
 
гуру
25.06.08
14:06
(34) что значит запрос пустой? Если есть хоть один элемент, он и появится и будет не ноль
36 Гений 1С
 
гуру
25.06.08
14:07
Интересно, а так не покатит?
ВЫБОР КОГДА 0 В Количество(ВЫБРАТЬ &Список) ТОГДА ИНАЧЕ КОНЕЦ
37 Aprobator
 
25.06.08
14:34
(35) Дык о чем и речь, если запрос пустой, - 0 не возвращается.
38 Aprobator
 
25.06.08
14:49
Сорри в 37 - ерунда. 0 возвращается. Блин, явно пора в отпуск. Крыша уже явно отдыхает.
39 Aprobator
 
25.06.08
15:05
По мотивам (33) удалось (31) преобразовать (с тем же эффектом)  в следующее:
   "ВЫБРАТЬ
   |    ВЫБОР
   |        КОГДА РазмерСписка.РазмСписка = 0
   |            ТОГДА ФизическиеЛица.Представление
   |        ИНАЧЕ ЗапросПоСписку.Представление
   |    КОНЕЦ КАК НужныйЭлемент
   |ИЗ
   |    Справочник.ФизическиеЛица КАК ФизическиеЛица
   |        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
   |            ФизическиеЛица.Представление КАК Представление
   |        ИЗ
   |            Справочник.ФизическиеЛица КАК ФизическиеЛица
   |        ГДЕ
   |            ФизическиеЛица.Ссылка В(&Спис)) КАК ЗапросПоСписку
   |        ПО (ИСТИНА),
   |    (ВЫБРАТЬ
   |        КОЛИЧЕСТВО(ФизическиеЛица.Ссылка) КАК РазмСписка
   |    ИЗ
   |        Справочник.ФизическиеЛица КАК ФизическиеЛица
   |    ГДЕ
   |        ФизическиеЛица.Ссылка В(&Спис)) КАК РазмерСписка
   |
   |СГРУППИРОВАТЬ ПО
   |    ВЫБОР
   |        КОГДА 0 = РазмерСписка.РазмСписка
   |            ТОГДА ФизическиеЛица.Представление
   |        ИНАЧЕ ЗапросПоСписку.Представление
   |    КОНЕЦ";
40 NewNick
 
26.06.08
05:57
а чем вариант в (20) неустроило не понял ?))
41 Origin
 
27.06.08
12:46
(20) меня 20-й вариант устроил, выбрал его, спасибо работает

хотя 39-й тоже работает, всем спасибо
42 hhhh
 
27.06.08
12:51
(41) если количество элементов номенклатуры > 10000 будет выполняться неслолько часов. Так что лучше выбрось эти методы и сделай как-нибудь тупо.
43 Aprobator
 
27.06.08
13:31
(40) Он слишком мелкий - я его просто не разглядел.
(42) Кидаем это условие в параметры виртуальной таблицы и все.
44 Aprobator
 
27.06.08
13:33
(40) (20) конечно более лучший вариант. Просто у меня еще немного опыта работы с запросами. Вот и набираюсь потихноьку :).
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.