Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Параметр запроса пуст, значит - любое его значение
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
bolobol
Здравствуйте!

Часто в текстах с запросами в стандартных конфигураций встречаются похожие конструкции:
...ГДЕ ЗарплатаКВыплатеОрганизаций.Организация = &Организация...
Если Организация.Пустая() Тогда
   Запрос.Текст= СтрЗаменить(Запрос.Текст, "ГДЕ ЗарплатаКВыплатеОрганизаций.Организация = &Организация", "");


т.е. Если Организация в отборе не указана, то убрать её и из текста условий.
Вопрос: Чем это может быть объяснено, т.к. небольшие изменения в условии запроса - выведут из строя весь запрос алгоритмом замены или не произойдёт сама замена, т.к. между "ГДЕ" и "Зарпла..." может появиться " И ".

Почему не целесообразней использовать следующую конструкцию или её аналог:
ГДЕ (&Организация = &ПустаяОрганизация ИЛИ ЗарплатаКВыплатеОрганизаций.Организация = &Организация)
Запрос.УстановитьПараметр("ПустаяОрганизация", Справочники.Организации.ПустаяСсылка());
Запрос.УстановитьПараметр("Организация", Организация);


Как убрать параметр ПустаяОрганизация и задать это прямо в тексте запроса?

А может есть ещё более изящные конструкции, типа:
ГДЕ 1=1
Если НЕ Организация.Пустая() Тогда
   Запрос.Текст= СтрЗаменить(Запрос.Текст, "1=1", "ЗарплатаКВыплатеОрганизаций.Организация = &Организация");
Ardi
ГДЕ (&ВсеОрганизации ИЛИ ЗарплатаКВыплатеОрганизаций.Организация = &Организация)
Запрос.УстановитьПараметр("ВсеОрганизации", Организация=Справочники.Организации.ПустаяСсылка());
Запрос.УстановитьПараметр("Организация", Организация);
kivals
Цитата(bolobol @ 13.09.11, 18:40) необходимо зарегистрироваться для просмотра ссылки
Как убрать параметр ПустаяОрганизация и задать это прямо в тексте запроса?


В запросе:
&Организация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
Zaval
Господа, будьте проще smile.gif
Достаточно в запросе использовать не "=", а "В" и в качестве параметра установить список значений для отбора.
Отбор не нужен - пустой список. В этом случае "В" дает истину для любого значения.
Ardi
Цитата(Zaval @ 17.09.11, 21:52) необходимо зарегистрироваться для просмотра ссылки
Отбор не нужен - пустой список. В этом случае "В" дает истину для любого значения.

Не, не работает.
Batchir
Но насколько мне известно конструкции в запросе, типа:
ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)

заметно увеличивают быстродействие запроса, чем это указывать через параметры, хотя Ardi в данном случае предложил на мой взгляд более корректный вариант. Зачем в запросе использовать логическую проверку, когда там можно использовать готовое ИСТИНА или ЛОЖЬ.

Вот написал ответ, и сразу же продолжил smile.gif , так вообще напрямую в запросе отображаем:


ПустаяОрганизация =  Организация = Справочники.Организации.ПустаяСсылка();

"
...
ГДЕ ("+ПустаяОрганизация+" ИЛИ ЗарплатаКВыплатеОрганизаций.Организация = &Организация)
...
"
Запрос.УстановитьПараметр("Организация", Организация);
Ardi
Цитата(Batchir @ 18.09.11, 0:27) необходимо зарегистрироваться для просмотра ссылки
Вот написал ответ, и сразу же продолжил smile.gif , так вообще напрямую в запросе отображаем:

В таком случае нельзя нажать в конфигураторе правую кнопку мыши и "Конструктор запроса". А это неудобно smile.gif smile.gif smile.gif
kivals
Цитата(Ardi @ 18.09.11, 0:37) необходимо зарегистрироваться для просмотра ссылки
В таком случае нельзя нажать в конфигураторе правую кнопку мыши и "Конструктор запроса". А это неудобно smile.gif smile.gif smile.gif

А вот для решения этой задачи я использую следующую конструкцию (ключевой момент - &УсловияЗапроса в тексте запроса):
     Запрос = Новый Запрос;
     ТекстЗапроса =
     "ВЫБРАТЬ
     Счет.Количество,
     Счет.Сумма
     ИЗ
     Документ.Счет КАК Счет
     ГДЕ
     &УсловияЗапроса";
     УсловияЗапроса = "ИСТИНА";
     Если ЗначениеЗаполнено(Организация) Тогда
           УсловияЗапроса = УсловияЗапроса + Символы.ПС +
             "И Счет.Организация = &Организация";
         Запрос.Параметры.Вставить("Организация", Организация);
       КонецЕсли;
      
       Если ЗначениеЗаполнено(Контрагент) Тогда
           УсловияЗапроса = УсловияЗапроса + Символы.ПС +
             "И Счет.Контрагент = &Контрагент";
           Запрос.Параметры.Вставить("Контрагент", Контрагент);
         КонецЕсли;
    
     ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловияЗапроса", УсловияЗапроса);
     Запрос.Текст = ТекстЗапроса;


Такой вариант позволяет использовать и конструктор запроса (просто в условиях будет прописан как бы параметр) и динамически задавать условия

Цитата(Zaval @ 17.09.11, 21:52) необходимо зарегистрироваться для просмотра ссылки
Господа, будьте проще smile.gif
Достаточно в запросе использовать не "=", а "В" и в качестве параметра установить список значений для отбора.
Отбор не нужен - пустой список. В этом случае "В" дает истину для любого значения.

По-моему так было в запросах 7.7, и на мой взгляд это "баг, перекованный в фичу". 8 ИМХО отрабатывает это условие корректно - если список пустой - значит В него ничего не может входить. Кроме того обработка списков происходит медленней, чем сравнение на равно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.