Имя: Пароль:
1C
1С v8
Язык запросов: НЕОПРЕДЕЛЕНО и ссылка, массив или список значений
0 formista2000
 
28.10.24
11:10
Привет!
В условии в запросе никак не хочет сравнивать параметр с НЕОПРЕДЕЛЕНО и с условием В(НЕОПРЕДЕЛЕНО). Тип параметра - Неопределено, ссылка, массив или список значений.
Пока что проверяю на тип вне запроса и через свой шаблон подставляю условие в текст запроса в зависимости от типа.
Уверен, что есть более изящный способ.
Куда курить? Хелп!
Заранее спасибо.
1 Волшебник
 
28.10.24
11:10
Покажите запрос и обвязку программного кода.
Объясните, зачем всё это.
2 formista2000
 
28.10.24
11:14
(1) >> Объясните, зачем всё это.
Это из-за желания сделать функцию универсальной. Неизвестно, что в неё потом будет запихано в качестве параметров.
3 Волшебник
 
28.10.24
11:16
(2) Пока это всё бла-бла-бла про абстрактный бред. Будьте конкретней.
4 Fedor-1971
 
28.10.24
11:16
(2) Так нужно не извращаться и хотеть непонятного, а чётко проверить параметры на допустимые значения
и только потом запрос и его результаты
5 formista2000
 
28.10.24
11:16
(1)
|ГДЕ
|    НЕ ФТ_Долги.ПометкаУдаления
|    " + ?(Контрагент = Неопределено, "", "И ФТ_Долги.Клиент = &Контрагент") + "
|    " + ?(Договор = Неопределено, "", "И ФТ_Долги.Договор = &Договор") + "
|    " + ?(Контракт = Неопределено, "", "И ФТ_Долги.Контракт В(&Контракт)") + "

... и так далее, а потом:

    Запрос.УстановитьПараметр("Контрагент", Контрагент);
    Запрос.УстановитьПараметр("Договор", Договор);
    Запрос.УстановитьПараметр("Контракт", Контракт);
6 Волшебник
 
28.10.24
11:33
(5) В запросе используйте такое условие:

ГДЕ (&ВсеКонтрагенты ИЛИ ФТ_Долги.Клиент В (&Контрагент))


снаружи:
Если ЗначениеЗаполнено(Контрагент) Тогда
   Запрос.УстановитьПараметр("ВсеКонтрагенты", ЛОЖЬ);
   Запрос.УстановитьПараметр("Контрагент", Контрагент);
Иначе
   Запрос.УстановитьПараметр("ВсеКонтрагенты", ИСТИНА);
   Запрос.УстановитьПараметр("Контрагент", Новый Массив);
КонецЕсли;
7 Fedor-1971
 
28.10.24
11:25
(6) так Массив нужен в обеих установках, просто Контрагент, скорее всего, не подойдёт
8 Волшебник
 
28.10.24
11:28
(7) подойдёт
9 formista2000
 
28.10.24
15:05
Йа сделяль! )
воть:

|    И ВЫБОР
|        КОГДА НЕОПРЕДЕЛЕНО В(&Контрагент)
|            ТОГДА ИСТИНА
|        ИНАЧЕ ФТ_Долги.Клиент В(&Контрагент)
|    КОНЕЦ

И Неопределено понимает, и ссылку, и список, и массив! ))
10 Галахад
 
28.10.24
15:08
(9) Хм. Что пустое, что не пустое все равно? ))
11 formista2000
 
28.10.24
15:10
(10) Если пустое - значит по всем, значит ИСТИНА. Если задано - то по заданному.
12 Волшебник
 
28.10.24
15:10
(9) сомнительное решение...
13 formista2000
 
28.10.24
15:19
(12) Что смущает?
14 Волшебник
 
28.10.24
15:21
(13) Вот это смущает:
И ВЫБОР КОГДА НЕОПРЕДЕЛЕНО В(&Контрагент)


как-то корявенько выглядит. Моя конструкция более логична и работать будет быстрее:

И (&ВсеКонтрагенты ИЛИ ФТ_Долги.Клиент В (&Контрагент))
15 H A D G E H O G s
 
28.10.24
17:57
(9)
formista2000:

|    И ВЫБОР
|        КОГДА НЕОПРЕДЕЛЕНО В(&Контрагент)
|            ТОГДА ИСТИНА
|        ИНАЧЕ ФТ_Долги.Клиент В(&Контрагент)
|    КОНЕЦ


Планировщик запросов:
16 DimVad
 
28.10.24
18:29
Я просто пишу текст запроса в конструкторе.
А потом проверка в коде. Например если список пуст то можно удалить подстроку.
17 Волшебник
 
28.10.24
18:49
(16) Тогда можно так.

В запросе:

ГДЕ ИСТИНА И &ОтборКонтрагент


В коде:

Если ЗначениеЗаполнено(Контрагент) Тогда
   Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборКонтрагент", "Контрагент В (&Контрагент)");
   Запрос.УстановитьПараметр("Контрагент", Контрагент);
Иначе
   Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборКонтрагент", "ИСТИНА");
КонецЕсли;
18 novichok79
 
28.10.24
18:54
ПостроительЗапроса? СхемаЗапроса?
19 Волшебник
 
28.10.24
19:01
(18) из пушки по воробьям
20 Garykom
 
28.10.24
20:04
Интересно что будет когда в запросе потребуется проверить составной реквизит на не заполненность?
Причем составной из туевой тучи ссылочных типов
21 Hans
 
28.10.24
20:44
Код жесть.
22 Волшебник
 
28.10.24
20:54
(21) Покажите класс
23 formista2000
 
28.10.24
21:02
Я хотел минимум кода и максимум универсальности! Я хотел изящно! ((
24 Hans
 
28.10.24
21:08
Можно так:
|ГДЕ
|    НЕ ФТ_Долги.ПометкаУдаления
|    И &ОтборПоКонтрагенту
|    И &ОтборПоДоговору
|    И &ОтборПоКонтракту

запрос.Текст = СтрЗаменить(Запрос.Текст, "И &ОтборПоКонтрагенту", ?(ЗначениеЗаполнено(Контрагент), "Контрагент = &контрагент", ""));
запрос.Текст = СтрЗаменить(Запрос.Текст, "И &ОтборПоДоговору", ?(ЗначениеЗаполнено(Договор), "Договор = &Договор", ""));
запрос.Текст = СтрЗаменить(Запрос.Текст, "И &ОтборПоКонтракту", ?(ЗначениеЗаполнено(Контракт), "Договор = &Контракт", ""));
25 Hans
 
28.10.24
21:09
Схема запроса это тоже не пушка по воробьям.
26 Hans
 
28.10.24
21:15
Я уже Стаса учу.
27 Hans
 
28.10.24
21:16
Не желательно в запросах имень конструкции вида "Иcтина = Истина" и прочие артефакты.
28 Hans
 
28.10.24
21:17
(5) Любой запрос должен нормально открываться конструктором.
29 Бычье сердце
 
28.10.24
21:28
(24)
"запрос.Текст = СтрЗаменить..."
Ужас какой
30 Волшебник
 
28.10.24
21:49
Я так понял, здесь собрание дурдома
31 TormozIT
 
29.10.24
08:09
Опровергаю исходное утверждение на платформе 8.3.25
Запрос выполняется успешно и выводит строку результата
выбрать 1
ГДЕ НЕОПРЕДЕЛЕНО В (НЕОПРЕДЕЛЕНО)
И НЕОПРЕДЕЛЕНО В (&НЕОПРЕДЕЛЕНО)
И НЕОПРЕДЕЛЕНО В (&СписокСНеопределено)