Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Как правильно удалить из текста запроса пустое условие?

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

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

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

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

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

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

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

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


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

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

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

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

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


Короче:

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

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


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

КонецЕсли;

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс, 1996 г.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует