Имя: Пароль:
1C
1С v8
Как правильно удалить из текста запроса пустое условие?
,
0 vasko
 
13.01.19
09:27
Подскажите отсталому человеку как это правильно сделать? Раньше если какое-либо условие было пустым то его просто вырезали из текста запроса, но такой запрос уже не воспринимается конструктором запросов. В какой-то статье видел что не так давно в язык запросов что то добавили и теперь можно в самом запросе исключить пустые условия.
1 vasko
 
13.01.19
09:29
Есть еще вариант сравнить с функцией значение() которая получает пустую ссылку. Вроде есть еще один вариант как это сделать.
2 ДенисЧ
 
13.01.19
09:35
А что такое "пустое условие" ?
3 MaxS
 
13.01.19
09:39
ГДЕ &НеИсключатьУсловие И МоёУсловие
4 vasko
 
13.01.19
09:41
(2) Ну например есть условие: ГДЕ Контрагент = &Контрагент
Если контрагент пустая ссылка то из запроса надо это условие убрать
5 mistеr
 
13.01.19
09:59
(4)

    ГДЕ Контрагент = &Контрагент ИЛИ &Контрагент = &КонтрагентПустая
6 vasko
 
13.01.19
10:08
Может неправильно объяснил. Есть реквизит контрагент если он заполнен то запрос выдает документы по этому контрагенту, если не заполнен то запрос выводит список всех документов
7 ДенисЧ
 
13.01.19
10:13
Возьми построитель отчёта и не выделывайся ))
8 ktibo
 
13.01.19
10:23
Можно еще так: писать в запросе например "1 = 1" и через СтрЗаменить подставлять что хочешь. Ну лучше как в (5)
9 MaxS
 
13.01.19
10:47
(6) в СКД перенести условие не в запрос, а в компоновщик...
{  ГДЕ Контрагент = &Контрагент }
10 DrLekter
 
13.01.19
14:35
Можно строить запрос через схему, например. Или по-старинке - собирать из кусков текста (если условий очень много и каждое может оказаться пустым - через схему удобней и наглядней получается).
11 famnam
 
13.01.19
16:44
(0) построитель запроса вам в помощь, и если значение заполнено заполнять отборы построителя
12 exwill
 
13.01.19
18:20
(0) Это называется СхемаЗапроса.
13 Конструктор1С
 
13.01.19
18:38
Как уже подсказали, самое правильное использовать СхемаЗапроса. Если текст запроса не сильно будет дербаниться, то можно сделать проще. Написать в запросе условие:
ГДЕ &ОтборПоКонтрагенту

Далее в коде проверяешь

Если ЗначениеЗаполнено(Контрагент) Тогда
ТекстЗапроса = Стразменить(ТекстЗапроса, "&ОтборПоКонтрагенту", "Контрагент = &Контрагент");
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Иначе
Запрос.УстановитьПараметр("ОтборПоКонтрагенту", Истина);
КонецЕсли;

ещё вариант, это прямо в запросе проверять

ВЫБОР
КОГДА &Контрагент = Значение(Справочник.Контрагенты.ПустаяСсылка)
  ТОГДА ИСТИНА
ИНАЧЕ Контрагент = &Контрагент
КОНЕЦ
14 ДенисЧ
 
13.01.19
18:53
(13) Самое правильное в даннном случае - это СКД или Построитель.
Всё остальное - ересь
15 runoff_runoff
 
13.01.19
18:56
(9) это будет влиять только на флажок Использование, а не на значение (пустое или непустое)..
16 breezee
 
13.01.19
19:04
(5) Нет! ИЛИ Замедляет работу запроса. (13) Так же делаю) (14) Зачем? Чтобы полотно кода получить и с ним разбираться, где это не нужно? Тем более и построитель и СКД не самым лучшим образом на быстродействие влияют
17 PR
 
13.01.19
19:18
(0) ГДЕ ИСТИНА
<И условие 1, которое ты можешь безболезненно вырезать>
<И условие 2, которое ты можешь безболезненно вырезать>
<И условие 3, которое ты можешь безболезненно вырезать>
...
Ну, это если говнокодить
18 Конструктор1С
 
14.01.19
05:03
(14) для гибкой модификации запроса существует СхемаЗапроса, фирма 1С рекомендует её применять. А СКД предназначена в первую очередь для отчетов и динамических списков, и не подразумевает перепахивания текста запроса. Если не требуются все эти вот отборы и оформления СКД, то применять СКД для простой модификации запроса это из пушки по воробьям. Построитель отчета вообще устаревший механизм, который оставили в платформе только для совместимости.
19 bolobol
 
14.01.19
09:33
Так а про объектную модель запроса никто не в курсе?
20 ДенисЧ
 
14.01.19
09:40
(19) Ты первый будешь. Рассказывай. Как из текста запроса в 20 строчек и 3 строчек инициализации построителя раздуть код на 5 экраном НЕХ с этой схемой.
21 bolobol
 
14.01.19
09:59
(20) ХЗ о чём вы.
22 Вафель
 
14.01.19
10:08
если нет временных, то лучше через построитель
23 тарам пам пам
 
14.01.19
10:18
Обычно пользуюсь подобной конструкцией:


Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    *
|ИЗ Документ.РеализацияТоваровУслуг КАК Док
|    ГДЕ &ОтборПоКонтрагенту";

ОтборПоКонтрагенту = "ИСТИНА";
Если ЗначениеЗаполнено(Контрагент) Тогда
    ОтборПоКонтрагенту = "Док.Контрагент = &Контрагент";
    Запрос.Параметры.Установить("Контрагент", Контрагент);
КонецЕсли;
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборПоКонтрагенту", ОтборПоКонтрагенту);


Схема запроса ИМХО жутко неудобна и многословна, городить СКД для простых запросов не хочется и снова куча кода, построитель вроде как устарел. В итоге остается простая замена текста.
24 Конструктор1С
 
14.01.19
10:19
(20) да ладно? Там делов на несколько строчек кода. Примерно так:
СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапроса);
ОператорВыбрать = СхемаЗапроса.ПакетЗапроса[0].Оператор[0];
КонструкцияГДЕ = ОператорВыбрать.Отборы;
// Дальше удаляем-добавляем отборы как нам надо
//...
ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();
25 тарам пам пам
 
14.01.19
10:33
(24) проблема такого подхода в том, что при дальнейшем изменении запроса надо менять и текст самого запроса, и текст подстановки отбора, чего при замене текста/СКД/построителе не нужно.
26 Конструктор1С
 
14.01.19
10:38
(25) не совсем понял, для его менять-то?
27 bolobol
 
14.01.19
10:39
(25) Как раз подобный подход должен бы исключать какие-либо изменения при изменении текста запроса. А вот двойное изменение текста...
Поэтому, самое пока адекватное:
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборПоКонтрагенту", ОтборПоКонтрагенту);

Нет "параметра" - не будет и замены.
28 bolobol
 
14.01.19
10:40
(25) СКД и построитель - многа букоф там, где в этом нет необходимости.
29 тарам пам пам
 
14.01.19
10:41
(26) если вы пишете код сразу без единой ошибки и с учетом сразу всех будущих требований заказчика, тогда незачем
30 Галахад
 
гуру
14.01.19
10:43
Мне вариант из (13) больше нравиться.

ВЫБОР
КОГДА &Контрагент = Значение(Справочник.Контрагенты.ПустаяСсылка)
  ТОГДА ИСТИНА
ИНАЧЕ Контрагент = &Контрагент
КОНЕЦ

Или так:
&Контрагент = Значение(Справочник.Контрагенты.ПустаяСсылка) ИЛИ
&Контрагент = Контрагент
31 bolobol
 
14.01.19
10:58
(30) Говорят, это крайне негативно на производительности запроса сказывается.


Короче:

"СхемаЗапроса.Параметры.Удалить("Контрагент");"

Такого способа нет?
32 bolobol
 
14.01.19
11:27
Вся проблема подхода: "Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборПоКонтрагенту", ОтборПоКонтрагенту);" - без отладки нет полного текста запроса, поэтому используется подход "&Контрагент = &ПустойКонтрагент ИЛИ &Контрагент = Контрагент", чтобы можно было его тестить перед компиляцией в консоли.
33 Галахад
 
гуру
14.01.19
11:41
(32) Существенная такая проблема.
34 DrWatson
 
14.01.19
11:43
(13) Использую обратный подход
ТекстЗапроса =
"ВЫБРАТЬ
|    *
|ИЗ Документ.РеализацияТоваровУслуг КАК Док
|//Условие    ГДЕ Док.Контрагент = &Контрагент";

Если ЗначениеЗаполнено(Контрагент) Тогда
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//Условие", "");
КонецЕсли;

Запрос = Новый Запрос(ТекстЗапроса);
Запрос.Параметры.Установить("Контрагент", Контрагент);

Для меня текст запроса становится более читаем глазами. Сразу видно какие куски в каком месте могут быть.
Конструктор запроса с таким запросом в принципе работает, но комментарии, естественно, выкидывает. Я использую его чтобы получить кусок измененного запроса, потом Ctrl-C, Ctrl-Z, Ctrl-V.
35 Конструктор1С
 
14.01.19
12:54
(31) есть, но оно делается чуть сложнее, т.к. "ГДЕ" может встречаться в разных местах и несколько раз
(34) придёт последователь, и в один прекрасный вечер, не заметив сонными глазами содержимое комментария, откроет текст запроса через конструктор и похерит весь запрос.