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



Проверка на заполнение параметра в запросе

Проверка на заполнение параметра в запросе
Я
   ac13
 
01.02.18 - 16:27
Параметр &ГруппыТоваров может быть заполнен, а может быть пустой.
Если заполнен, то нужно отбирать по условию, а если не заполнен, то отбирать всё.

Устанавливаю значение параметра запроса:
Если ГруппыНоменклатуры.Количество() > 0 Тогда
        З.УстановитьПараметр("ГруппыТоваров", ГруппыНоменклатуры.ВыгрузитьЗначения());
    Иначе
        З.УстановитьПараметр("ГруппыТоваров", Неопределено);
    КонецЕсли;

А в запросе пишу такое условие:

ВЫБОР
    КОГДА &ГруппыТоваров <> НЕОПРЕДЕЛЕНО
        ТОГДА ТоварыНаСкладахОстатки.Номенклатура В ИЕРАРХИИ (&ГруппыТоваров)
КОНЕЦ


Ошибка: Неверные параметры в операции сравнения. Нельзя сравнивать поля
 неограниченной длины и поля несовместимых типов.
КОГДА &ГруппыТоваров <<?>><> НЕОПРЕДЕЛЕНО

Как прописать условие?
 
 
   leonidkorolev
 
1 - 01.02.18 - 16:32
Заведи ещё один параметр, типа ИспользоватьОтбор
   ac13
 
2 - 01.02.18 - 16:33
(1) типа так:

ВЫБОР КОГДА &ИспользоватьОтбор = Истина ТОГДА
ТоварыНаСкладахОстатки.Номенклатура В ИЕРАРХИИ (&ГруппыТоваров)
   dezss
 
3 - 01.02.18 - 16:38
ОФФ: народ, объясните мне, пожалуйста, зачем люди сравнивают с ИСТИНА?
   drcrasher
 
4 - 01.02.18 - 16:41
(3) З.УстановитьПараметр("ИспОтбор", "ИспОтбор");
   dezss
 
5 - 01.02.18 - 16:45
(4) хм...ну тогда ж ничего не отработает нормально, т.е. будет ошибка, которую еще фиг найдешь.
   ac13
 
6 - 01.02.18 - 16:46
Нет, не работает. Вопрос - как условие правильно прописать?

ВЫБОР КОГДА &ИспользоватьОтбор ТОГДА 
ТоварыНаСкладахОстатки.Номенклатура В ИЕРАРХИИ (&ГруппыТоваров) КОНЕЦ

Если группы выбираю - заполняет, если не выбираю, ничего не заполняет.
   ac13
 
7 - 01.02.18 - 16:47
Если ЗначениеЗаполнено(ГруппыНоменклатуры) Тогда
     З.УстановитьПараметр("ИспользоватьОтбор", Истина);
Иначе
     З.УстановитьПараметр("ИспользоватьОтбор", Ложь);
КонецЕсли;
__________________________________________________________

ВЫБОР КОГДА &ИспользоватьОтбор ТОГДА 
ТоварыНаСкладахОстатки.Номенклатура В ИЕРАРХИИ (&ГруппыТоваров) КОНЕЦ 
__________________________________________________________

не работает
   Timon1405
 
8 - 01.02.18 - 16:48
ТОГДА
ТоварыНаСкладахОстатки.Номенклатура В ИЕРАРХИИ (&ГруппыТоваров) 
Иначе
Истина
КОНЕЦ
   ac13
 
9 - 01.02.18 - 16:49
(1), (8) - спасибо!
   Diman000
 
10 - 01.02.18 - 16:52
(3)
Когда-нибудь значение может быть не булевым и выскочит ошибка.
Особенно актуально при проверках значений полученных в результате запросов или сложных алгоритмов.
С тех пор как на такое наткнешься разок-другой-третий начинаешь везде писать = ИСТИНА.
 
 Рекламное место пустует
   hhhh
 
11 - 01.02.18 - 16:52
(3) бывает, когда составной тип данных, может быть Булево и не Булево. Тогда нужно КОГДА &ИспользоватьОтбор = Истина

Если мы на 100% уверены, что значение параметра всегда Булево, тогда пишем

КОГДА &ИспользоватьОтбор
   dezss
 
12 - 01.02.18 - 17:04
(10) (11) а можно конкретный пример из практики?
   Diman000
 
13 - 02.02.18 - 19:03
(12) Сегодня выловил очередную ошибку такого рода.
Функция ОбщегоНазначения.ПолучитьЗначениеРеквизита возвращает НЕОПРЕДЕЛЕНО, если переданная ссылка пустая.
А реквизит булевый и в коде написано без = ИСТИНА.
Сразу ошибка, а было бы = ИСТИНА все бы работало.
   mikecool
 
14 - 02.02.18 - 19:06
(6) &Параметр = Неопределено  Или ТвоеПоле = &Параметр
устанавливать Неопределено в Параметр обязательно
   AlvlSpb
 
15 - 02.02.18 - 19:14
(0) А зачем вообще заниматься выбором параметра, если второго значения не существует? Не проще варьировать текстом запроса? Сам запрос без условия, а дальше

Если ЗначениеЗаполнено(ГруппыНоменклатуры) Тогда
З.Текст = З.Текст + "ГДЕ что-то там &Параметр"// ваше условие

З.УстановитьПараметр("Параметр", значение параметра);
КонецЕсли;

Чем не устраивает? Понимаю выбирать когда параметр может принимать два значения, а так.... смысл мудрить?
   mikecool
 
16 - 02.02.18 - 19:16
(15) чтобы запрос не парсился каждый раз при попадании в скуль
   Diman000
 
17 - 02.02.18 - 19:17
И еще весь текст запроса не хавается конструктором.
И ГДЕ не всегда последняя конструкция.
Так делать плохая привычка.
   AlvlSpb
 
18 - 02.02.18 - 19:34
(16) Не утверждаю, но предполагаю что парсинг все же происходит в момент Запрос.Выполнить, а значит - единожды. (17) А вот здесь, ваше замечание о привычках - для разработчиков типовых. Спецом посмотрел из любопыства, в УТ 11.3 такой метод (варьирование текстом запроса) использован 343 раза
  Что касается "не всегда последняя конструкция" - СтрЗаменить тоже пока не отменяли.
Не знаю, на мой взгляд, вполне рабочее и быстрое решение
   Diman000
 
19 - 02.02.18 - 19:56
(18) Ну с типовыми я давно не работал, не могу ничего сказать.
СтрЗаменить хорошая тема, "ГДЕ &Условие", а затем это &Условие варьировать как по мне хороший вариант.
Но в простейших случаях типа (0) лучше два параметра ЕстьОтбор и ЗначениеОтбора
   youalex
 
20 - 02.02.18 - 20:09
(0) если извратиться, можно написать примерно так:
ВЫБОР КОГДА НЕ 1 В (ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ Справочник.Номенклатура ГДЕ Ссылка В (&ГруппыТоваров)) ТОГДА ИСТИНА
ИНАЧЕ ТоварыНаСкладахОстатки.Номенклатура В ИЕРАРХИИ (&ГруппыТоваров)
КОНЕЦ
   Малыш Джон
 
21 - 02.02.18 - 20:15
(0) Довольно странный подход...
Сначала засовывать в параметры запроса значения разного типа, а потом пытаться вырулить как-то ситуацию в самом запросе.

Почему нельзя сделать так? :
Если ГруппыНоменклатуры.Количество() > 0 Тогда
        З.УстановитьПараметр("ГруппыТоваров", ГруппыНоменклатуры.ВыгрузитьЗначения());
Иначе
        З.УстановитьПараметр("ГруппыТоваров", Справочники.Номенклатура.ПустаяСсылка());
КонецЕсли;


а в самом запросе просто поставить условие

ТоварыНаСкладахОстатки.Номенклатура В ИЕРАРХИИ (&ГруппыТоваров)
   DES
 
22 - 02.02.18 - 20:27
или так 
ГДЕ  ГруппыТоваров = &ГруппыТоваров 
     ИЛИ &ГруппыТоваров <> НЕОПРЕДЕЛЕНО
   Малыш Джон
 
23 - 02.02.18 - 20:30
(22) ГДЕ  ГруппыТоваров = &ГруппыТоваров 
     ИЛИ &ГруппыТоваров = НЕОПРЕДЕЛЕНО
   DES
 
24 - 03.02.18 - 08:14
(23) да , сорь. копипастил из (0)
   breezee
 
25 - 03.02.18 - 11:26
(15) Так не правильно. В рекомендациях 1С в таких случаях стоит использовать "СТРЗаменить()"
   AlvlSpb
 
26 - 03.02.18 - 12:01
(25) СтрЗаменить рекомендуют использовать, если вставляемая в запрос конструкция, не заканчивает этот запрос (о чем я и напомнил в (18) ).
   breezee
 
27 - 03.02.18 - 12:17
(26) Не знал, спасибо за информацию! Запомню
   Новиков
 
28 - 03.02.18 - 13:16
Для истории вставлю пруф 6-ти летней давности на тему сабжа: https://forum.infostart.ru/forum9/topic52154/


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