|
Проверка на заполнение параметра в запросе | ☑ | ||
---|---|---|---|---|
0
ac13
01.02.18
✎
16:27
|
Параметр &ГруппыТоваров может быть заполнен, а может быть пустой.
Если заполнен, то нужно отбирать по условию, а если не заполнен, то отбирать всё. Устанавливаю значение параметра запроса: Если ГруппыНоменклатуры.Количество() > 0 Тогда З.УстановитьПараметр("ГруппыТоваров", ГруппыНоменклатуры.ВыгрузитьЗначения()); Иначе З.УстановитьПараметр("ГруппыТоваров", Неопределено); КонецЕсли; А в запросе пишу такое условие: ВЫБОР КОГДА &ГруппыТоваров <> НЕОПРЕДЕЛЕНО ТОГДА ТоварыНаСкладахОстатки.Номенклатура В ИЕРАРХИИ (&ГруппыТоваров) КОНЕЦ Ошибка: Неверные параметры в операции сравнения. Нельзя сравнивать поля неограниченной длины и поля несовместимых типов. КОГДА &ГруппыТоваров <<?>><> НЕОПРЕДЕЛЕНО Как прописать условие? |
|||
1
leonidkorolev
01.02.18
✎
16:32
|
Заведи ещё один параметр, типа ИспользоватьОтбор
|
|||
2
ac13
01.02.18
✎
16:33
|
(1) типа так:
ВЫБОР КОГДА &ИспользоватьОтбор = Истина ТОГДА ТоварыНаСкладахОстатки.Номенклатура В ИЕРАРХИИ (&ГруппыТоваров) |
|||
3
dezss
01.02.18
✎
16:38
|
ОФФ: народ, объясните мне, пожалуйста, зачем люди сравнивают с ИСТИНА?
|
|||
4
drcrasher
01.02.18
✎
16:41
|
(3) З.УстановитьПараметр("ИспОтбор", "ИспОтбор");
|
|||
5
dezss
01.02.18
✎
16:45
|
(4) хм...ну тогда ж ничего не отработает нормально, т.е. будет ошибка, которую еще фиг найдешь.
|
|||
6
ac13
01.02.18
✎
16:46
|
Нет, не работает. Вопрос - как условие правильно прописать?
ВЫБОР КОГДА &ИспользоватьОтбор ТОГДА ТоварыНаСкладахОстатки.Номенклатура В ИЕРАРХИИ (&ГруппыТоваров) КОНЕЦ Если группы выбираю - заполняет, если не выбираю, ничего не заполняет. |
|||
7
ac13
01.02.18
✎
16:47
|
Если ЗначениеЗаполнено(ГруппыНоменклатуры) Тогда
З.УстановитьПараметр("ИспользоватьОтбор", Истина); Иначе З.УстановитьПараметр("ИспользоватьОтбор", Ложь); КонецЕсли; __________________________________________________________ ВЫБОР КОГДА &ИспользоватьОтбор ТОГДА ТоварыНаСкладахОстатки.Номенклатура В ИЕРАРХИИ (&ГруппыТоваров) КОНЕЦ __________________________________________________________ не работает |
|||
8
Timon1405
01.02.18
✎
16:48
|
ТОГДА
ТоварыНаСкладахОстатки.Номенклатура В ИЕРАРХИИ (&ГруппыТоваров) Иначе Истина КОНЕЦ |
|||
9
ac13
01.02.18
✎
16:49
|
(1), (8) - спасибо!
|
|||
10
Diman000
01.02.18
✎
16:52
|
(3)
Когда-нибудь значение может быть не булевым и выскочит ошибка. Особенно актуально при проверках значений полученных в результате запросов или сложных алгоритмов. С тех пор как на такое наткнешься разок-другой-третий начинаешь везде писать = ИСТИНА. |
|||
11
hhhh
01.02.18
✎
16:52
|
(3) бывает, когда составной тип данных, может быть Булево и не Булево. Тогда нужно КОГДА &ИспользоватьОтбор = Истина
Если мы на 100% уверены, что значение параметра всегда Булево, тогда пишем КОГДА &ИспользоватьОтбор |
|||
12
dezss
01.02.18
✎
17:04
|
(10) (11) а можно конкретный пример из практики?
|
|||
13
Diman000
02.02.18
✎
19:03
|
(12) Сегодня выловил очередную ошибку такого рода.
Функция ОбщегоНазначения.ПолучитьЗначениеРеквизита возвращает НЕОПРЕДЕЛЕНО, если переданная ссылка пустая. А реквизит булевый и в коде написано без = ИСТИНА. Сразу ошибка, а было бы = ИСТИНА все бы работало. |
|||
14
mikecool
02.02.18
✎
19:06
|
(6) &Параметр = Неопределено Или ТвоеПоле = &Параметр
устанавливать Неопределено в Параметр обязательно |
|||
15
AlvlSpb
02.02.18
✎
19:14
|
(0) А зачем вообще заниматься выбором параметра, если второго значения не существует? Не проще варьировать текстом запроса? Сам запрос без условия, а дальше
Если ЗначениеЗаполнено(ГруппыНоменклатуры) Тогда З.Текст = З.Текст + "ГДЕ что-то там &Параметр" // ваше условие З.УстановитьПараметр("Параметр", значение параметра); КонецЕсли; Чем не устраивает? Понимаю выбирать когда параметр может принимать два значения, а так.... смысл мудрить? |
|||
16
mikecool
02.02.18
✎
19:16
|
(15) чтобы запрос не парсился каждый раз при попадании в скуль
|
|||
17
Diman000
02.02.18
✎
19:17
|
И еще весь текст запроса не хавается конструктором.
И ГДЕ не всегда последняя конструкция. Так делать плохая привычка. |
|||
18
AlvlSpb
02.02.18
✎
19:34
|
(16) Не утверждаю, но предполагаю что парсинг все же происходит в момент Запрос.Выполнить, а значит - единожды. (17) А вот здесь, ваше замечание о привычках - для разработчиков типовых. Спецом посмотрел из любопыства, в УТ 11.3 такой метод (варьирование текстом запроса) использован 343 раза
Что касается "не всегда последняя конструкция" - СтрЗаменить тоже пока не отменяли. Не знаю, на мой взгляд, вполне рабочее и быстрое решение |
|||
19
Diman000
02.02.18
✎
19:56
|
(18) Ну с типовыми я давно не работал, не могу ничего сказать.
СтрЗаменить хорошая тема, "ГДЕ &Условие", а затем это &Условие варьировать как по мне хороший вариант. Но в простейших случаях типа (0) лучше два параметра ЕстьОтбор и ЗначениеОтбора |
|||
20
youalex
02.02.18
✎
20:09
|
(0) если извратиться, можно написать примерно так:
ВЫБОР КОГДА НЕ 1 В (ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ Справочник.Номенклатура ГДЕ Ссылка В (&ГруппыТоваров)) ТОГДА ИСТИНА ИНАЧЕ ТоварыНаСкладахОстатки.Номенклатура В ИЕРАРХИИ (&ГруппыТоваров) КОНЕЦ |
|||
21
Малыш Джон
02.02.18
✎
20:15
|
(0) Довольно странный подход...
Сначала засовывать в параметры запроса значения разного типа, а потом пытаться вырулить как-то ситуацию в самом запросе. Почему нельзя сделать так? : Если ГруппыНоменклатуры.Количество() > 0 Тогда З.УстановитьПараметр("ГруппыТоваров", ГруппыНоменклатуры.ВыгрузитьЗначения()); Иначе З.УстановитьПараметр("ГруппыТоваров", Справочники.Номенклатура.ПустаяСсылка()); КонецЕсли; а в самом запросе просто поставить условие ТоварыНаСкладахОстатки.Номенклатура В ИЕРАРХИИ (&ГруппыТоваров) |
|||
22
DES
02.02.18
✎
20:27
|
или так
ГДЕ ГруппыТоваров = &ГруппыТоваров ИЛИ &ГруппыТоваров <> НЕОПРЕДЕЛЕНО |
|||
23
Малыш Джон
02.02.18
✎
20:30
|
(22) ГДЕ ГруппыТоваров = &ГруппыТоваров
ИЛИ &ГруппыТоваров = НЕОПРЕДЕЛЕНО |
|||
24
DES
03.02.18
✎
08:14
|
(23) да , сорь. копипастил из (0)
|
|||
25
breezee
03.02.18
✎
11:26
|
(15) Так не правильно. В рекомендациях 1С в таких случаях стоит использовать "СТРЗаменить()"
|
|||
26
AlvlSpb
03.02.18
✎
12:01
|
(25) СтрЗаменить рекомендуют использовать, если вставляемая в запрос конструкция, не заканчивает этот запрос (о чем я и напомнил в (18) ).
|
|||
27
breezee
03.02.18
✎
12:17
|
(26) Не знал, спасибо за информацию! Запомню
|
|||
28
Новиков
03.02.18
✎
13:16
|
Для истории вставлю пруф 6-ти летней давности на тему сабжа: https://forum.infostart.ru/forum9/topic52154/
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |