|
Как правильно удалить из текста запроса пустое условие? | ☑ | ||
---|---|---|---|---|
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) придёт последователь, и в один прекрасный вечер, не заметив сонными глазами содержимое комментария, откроет текст запроса через конструктор и похерит весь запрос. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |