Имя: Пароль:
1C
 
Проверка на заполнение параметра в запросе
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/