Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Параметр запроса пуст, значит - любое его значение          
bolobol Подменю пользователя
сообщение 13.09.11, 17:40
Сообщение #1

Говорящий
***
Группа: Пользователи
Сообщений: 65
Спасибо сказали: 0 раз
Рейтинг: 0

Здравствуйте!

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


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

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


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

А может есть ещё более изящные конструкции, типа:
ГДЕ 1=1
Если НЕ Организация.Пустая() Тогда
   Запрос.Текст= СтрЗаменить(Запрос.Текст, "1=1", "ЗарплатаКВыплатеОрганизаций.Организация = &Организация");

Ardi Подменю пользователя
сообщение 13.09.11, 19:31
Сообщение #2

Живет на форуме
***********
Гений телепатии и социального моделирования
Группа: Пользователи
Сообщений: 4121
Из: Киев
Спасибо сказали: 957 раз
Рейтинг: 0

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


Сообщение отредактировал Ardi - 13.09.11, 19:32


Signature
Услуги 1С программиста 8.2, 7.7 (Плохо, дорого, очередь). Киев.

Спасибо сказали: bolobol,

kivals Подменю пользователя
сообщение 17.09.11, 16:04
Сообщение #3

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 105
Из: Киев
Спасибо сказали: 27 раз
Рейтинг: 0

Цитата(bolobol @ 13.09.11, 18:40) *
Как убрать параметр ПустаяОрганизация и задать это прямо в тексте запроса?


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

Zaval Подменю пользователя
сообщение 17.09.11, 20:52
Сообщение #4

Крутой
Иконка группы
Группа: Местный
Сообщений: 1994
Из: Киева и окрестностей
Спасибо сказали: 406 раз
Рейтинг: 0

Господа, будьте проще smile.gif
Достаточно в запросе использовать не "=", а "В" и в качестве параметра установить список значений для отбора.
Отбор не нужен - пустой список. В этом случае "В" дает истину для любого значения.

Ardi Подменю пользователя
сообщение 17.09.11, 23:09
Сообщение #5

Живет на форуме
***********
Гений телепатии и социального моделирования
Группа: Пользователи
Сообщений: 4121
Из: Киев
Спасибо сказали: 957 раз
Рейтинг: 0

Цитата(Zaval @ 17.09.11, 21:52) *
Отбор не нужен - пустой список. В этом случае "В" дает истину для любого значения.

Не, не работает.

Сообщение отредактировал Ardi - 17.09.11, 23:10


Signature
Услуги 1С программиста 8.2, 7.7 (Плохо, дорого, очередь). Киев.

Batchir Подменю пользователя
сообщение 17.09.11, 23:27
Сообщение #6

Живет на форуме
Иконка группы
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1426 раз
Рейтинг: 0

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

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

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


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

"
...
ГДЕ ("+ПустаяОрганизация+" ИЛИ ЗарплатаКВыплатеОрганизаций.Организация = &Организация)
...
"
Запрос.УстановитьПараметр("Организация", Организация);

Ardi Подменю пользователя
сообщение 17.09.11, 23:37
Сообщение #7

Живет на форуме
***********
Гений телепатии и социального моделирования
Группа: Пользователи
Сообщений: 4121
Из: Киев
Спасибо сказали: 957 раз
Рейтинг: 0

Цитата(Batchir @ 18.09.11, 0:27) *
Вот написал ответ, и сразу же продолжил smile.gif , так вообще напрямую в запросе отображаем:

В таком случае нельзя нажать в конфигураторе правую кнопку мыши и "Конструктор запроса". А это неудобно smile.gif smile.gif smile.gif

Сообщение отредактировал Ardi - 17.09.11, 23:38


Signature
Услуги 1С программиста 8.2, 7.7 (Плохо, дорого, очередь). Киев.

kivals Подменю пользователя
сообщение 18.09.11, 13:56
Сообщение #8

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 105
Из: Киев
Спасибо сказали: 27 раз
Рейтинг: 0

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

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


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

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

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

Сообщение отредактировал kivals - 18.09.11, 13:57

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 23.04.24, 18:17
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!