Имя: Пароль:
1C
1С v8
v8: Дополнить условие в текст запроса, исходя из условия.
,
0 IBTM
 
24.01.12
23:42
Простая ситуация. Есть два условия (отбора) подразделение и должность, Например отбираю Сотрудников по подразделению соответствоенно:ВЫБРАТЬ
   СотрудникиОрганизаций.Ссылка
ИЗ
   Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
ГДЕ
   СотрудникиОрганизаций.ТекущееПодразделениеОрганизации = &ТекПодр

СГРУППИРОВАТЬ ПО
   СотрудникиОрганизаций.Ссылка


но например если указанно ещё и должность то нужно в этот запрос добавить условие

СотрудникиОрганизаций.ТекущаяДолжностьОрганизации = &ТекДолжн

Нашел тупое решение - двумя запросами...
Как это мне сделать используя один запрос?
1 zak555
 
24.01.12
23:44
ВЫБРАТЬ
   СотрудникиОрганизаций.Ссылка
ИЗ
   Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
ГДЕ
   СотрудникиОрганизаций.ТекущееПодразделениеОрганизации = &ТекПодр
   И СотрудникиОрганизаций.ТекущаяДолжностьОрганизации = &ТекДолжн
2 IBTM
 
24.01.12
23:46
(1) Нееее... а если мне в данный момент не нужно отбор и по должности?
3 1с-кин
 
24.01.12
23:48
(2) используйте построитель запросов
4 1с-кин
 
24.01.12
23:50
Там можно задать - если некое условие (ТекущаяДолжность пустая) выполняется, то
СотрудникиОрганизаций.ТекущаяДолжностьОрганизации = &ТекДолжн
отбор по ТекДолжность не делается.
5 IBTM
 
25.01.12
00:07
намек понел попробуем
6 guitar_player
 
25.01.12
04:59
вот так например (0)

   
   ПостроительЗапроса = Новый ПостроительЗапроса;
   
   ПостроительЗапроса.Текст =
   "ВЫБРАТЬ
   |    СотрудникиОрганизаций.Ссылка
   |ИЗ
   |    Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
   |{ГДЕ
   |    СотрудникиОрганизаций.ПодразделениеОрганизации.* КАК Подразделение,
   |    СотрудникиОрганизаций.Должность.*}";
   
   // Установка отборов
   
   Если ОтборПодразделение Тогда
       Отбор = ПостроительЗапроса.Отбор.Добавить("Подразделение");
       Отбор.Использование = Истина;
       Отбор.ВидСравнения  = ЭтотОбъект.ВидСравненияПодразделение;
       Отбор.Значение      = ЭтотОбъект.Подразделение;
   КонецЕсли;
   
   Если ОтборДолжность Тогда
       Отбор = ПостроительЗапроса.Отбор.Добавить("Должность");
       Отбор.Использование = Истина;
       Отбор.ВидСравнения  = ЭтотОбъект.ВидСравненияДолжность;
       Отбор.Значение      = ЭтотОбъект.Должность;
   КонецЕсли;
   
   //////////////////////////////////////
   // Получение и выполнение запроса
   
   Запрос = ПостроительЗапроса.ПолучитьЗапрос();
   Результат = Запрос.Выполнить();
   Если Результат.Пустой() Тогда
       Возврат;
   КонецЕсли;
7 xarann
 
25.01.12
07:20
Или
ТекстЗапроса = "
|ВЫБРАТЬ
|    СотрудникиОрганизаций.Ссылка
|ИЗ
|    Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
|ГДЕ
|    СотрудникиОрганизаций.ТекущееПодразделениеОрганизации = &ТекПодр
|    %ПроверкаДолжности%";

Если ПроверятьДолжность Тогда
   ПроверкаДолжности = "И СотрудникиОрганизаций.ТекущаяДолжностьОрганизации = &ТекДолжн";
Иначе
   ПроверкаДолжности = "";
КонецЕсли
СтрЗаменить(ТекстЗапроса, "%ПроверкаДолжности%", ПроверкаДолжности);

Понятно, что в данном случа можно было использовать простое добавление к тексту запроса, но предложенный вариант работает и при необходимости изменения середины запроса, например динамическое изменение полей выборки...
8 xarann
 
25.01.12
07:22
9 guitar_player
 
25.01.12
08:11
(7) а нахрена изобретать лесопед с квадратными колесами? Ты еще предлагаешь 10 условий написать по типу?

   Если ВидСравненияРаботника = ВидСравнения.Равно Тогда
           ВидСравненияРаботник = "="
       ИначеЕсли ВидСравненияРаботника = ВидСравнения.НеРавно Тогда
           ВидСравненияРаботник = "<>"
       ИначеЕсли ВидСравненияРаботника = ВидСравнения.ВСписке Тогда
           ВидСравненияРаботник = "В"
       ИначеЕсли ВидСравненияРаботника = ВидСравнения.НеВСписке Тогда
           ВидСравненияРаботник = "НЕ В"
       ИначеЕсли ВидСравненияРаботника = ВидСравнения.ВСпискеПоИерархии ИЛИ
           ВидСравненияРаботника = ВидСравнения.ВИерархии Тогда
           ВидСравненияРаботник = "В ИЕРАРХИИ"
       ИначеЕсли ВидСравненияРаботника = ВидСравнения.НеВСпискеПоИерархии ИЛИ
           ВидСравненияРаботника = ВидСравнения.НеВИерархии Тогда
           ВидСравненияРаботник = "НЕ В ИЕРАРХИИ"
       КонецЕсли;
       
       Если ВидСравненияРаботник = "=" ИЛИ ВидСравненияРаботник = "<>" Тогда
           УсловиеПоРаботникам    = " Сотрудник " + ВидСравненияРаботник + " &РаботникиОрганизации";
       Иначе
           УсловиеПоРаботникам    = " Сотрудник " + ВидСравненияРаботник + "(&РаботникиОрганизации)";
       КонецЕсли;

как когда то давно было в табеле?

убытсо можно...
10 Defender aka LINN
 
25.01.12
08:22
(9) Еще можно отбор СКД воткнуть, с группами условий... Это ж сразу сколько говнокода можно выдать!
11 xarann
 
25.01.12
08:25
(9) Первым словом моего сообщения было "Или", целью служило осветить альтернативный вариант решения задачи, а на каких велосипедах кататься каждый вылысыпыдыст решает сам :)
Тема определения "ЭтотОбъект.ВидСравненияПодразделение;" тобой тоже не раскрыта...
12 guitar_player
 
25.01.12
08:37
(11) это было для примера выдрано из шаблона и чтобы не показывать что там было, написал так... А вообще можно отбор на форму закинуть или еще что-нибудь
13 Ненавижу 1С
 
гуру
25.01.12
08:47
ТекстЗапроса = "
|ВЫБРАТЬ
|    СотрудникиОрганизаций.Ссылка
|ИЗ
|    Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
|ГДЕ
|    СотрудникиОрганизаций.ТекущееПодразделениеОрганизации = &ТекПодр
|    И &ПроверкаДолжности";

Если ПроверятьДолжность Тогда
   ПроверкаДолжности = "СотрудникиОрганизаций.ТекущаяДолжностьОрганизации = &ТекДолжн";
Иначе
   ПроверкаДолжности = "ИСТИНА";
КонецЕсли
СтрЗаменить(ТекстЗапроса, "&ПроверкаДолжности", ПроверкаДолжности);
14 xarann
 
25.01.12
08:48
(12) Я все это прекрасно понимаю ;)
Разное оружие для разных ситуаций, два языка - два крыла и т.д.
В общем, Пусть ТС смотрит и решает, мы вариантов решений набросали.
15 Defender aka LINN
 
25.01.12
08:59
(13) Месье знает толк в извращениях...
16 Ненавижу 1С
 
гуру
25.01.12
09:00
(15) да я такой!
17 Maxus43
 
25.01.12
09:01
ГДЕ
   (СотрудникиОрганизаций.ТекущееПодразделениеОрганизации = &ТекПодр ИЛИ СотрудникиОрганизаций.ТекущееПодразделениеОрганизации = Значение(Справочник.ПодразделенияОрганизаций.ПустаяСсылка))
   И (СотрудникиОрганизаций.ТекущаяДолжностьОрганизации = &ТекДолжн ИЛИ СотрудникиОрганизаций.ТекущаяДолжностьОрганизации = Значение(Справочник.ДолжностиОрганизаций.ПустаяСсылка))
18 Ненавижу 1С
 
гуру
25.01.12
09:03
(17) а вот это может сказаться на том, что индексы будут не использованными
19 Maxus43
 
25.01.12
09:11
хотя не так...
ГДЕ
  (СотрудникиОрганизаций.ТекущееПодразделениеОрганизации = &ТекПодр ИЛИ &НеОтбиратьПоПодразделению)
  И (СотрудникиОрганизаций.ТекущаяДолжностьОрганизации = &ТекДолжн ИЛИ &НеОтбиратьПоДолжности)

Ну а в коде
Запрос.УстановитьПараметр("НеОтбиратьПоПодразделению", ?(ЗначениеЗаполнено(ТекПодр), Ложь, Истина))