Как разделить запрос по условию?

1. squall84 11.03.14 10:40 Сейчас в теме
Здравствуйте.
Я вроде-бы где-то видел, и говорили мне, что можно запрос разделить по условию.
Т.е. у меня есть кнопка и флаг. В зависимости от флага у меня выполняются немного разные действия.
Что я хочу получить, к примеру пишу запрос:

|Выбрать из реализаций
|По реализациям
|Где Реализация + условия
(И тут разветвление)
Если Флаг тогда
| По условию 2
Иначе
| По условию 3
Выполнить запрос

Вроде бы можно к запросу дописать какой-то оператор, который разобьет текстовое поле запроса и позволит добавить условие самой 1с и в зависимости от условия продолжить выполнять запрос.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
7. Boneman 302 11.03.14 10:56 Сейчас в теме
(1) squall84,
текст запроса - это же текстовая строка, которую можно сформировать как одним куском, так и собирать по кусочкам в зависимости от условий перед выполнением запроса.
Естественно конструктором уже такой текст не обработаешь
2. smirnova_a 11.03.14 10:44 Сейчас в теме
Можно в текст запроса добавить параметр &Парам, а потом по вашим флагам менять его:
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Парам", "");
3. l_user 11.03.14 10:46 Сейчас в теме
Я знаю только три варианта:
1. Воспользоваться оператором "ВЫБОР";
2. При выполнении программного кода должен подменяться текст условия в запросе;
3. Почти тоже самое что в п.2: полностью разные тексты запроса в зависимости от условий.

С удовольствием узнаю что-нибудь новенькое для меня.
6. squall84 11.03.14 10:54 Сейчас в теме
(3) l_user, Вот у меня 2 и 3 пункт.
(4) Ёпрст, Я знаю, что примитивно, но так, как с запросами работаю всего несколько дней, некоторые примитивные вещи для меня не так просты. На будущее буду знать. Спасибо.
4. Ёпрст 1067 11.03.14 10:50 Сейчас в теме
примитив
|Выбрать из реализаций
|По реализациям
|Где Реализация + условия
(И тут разветвление)
|//По условию 2
|//По условию 3

Если  <условие2> Тогда
   ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"//По условию 2"," твоё выражение с нужным условием 2")
ИначеЕсли <условие3>
   ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"//По условию 3"," твоё выражение с нужным условием 3")
Иначе .....
Показать
5. kanalya 109 11.03.14 10:50 Сейчас в теме
ТекстЗапроса - текстовая строка; соответственно, можно с переменной работать как с любой строкой: склеивать, разделять, заменять по шаблону. Вариантов решения Вашей задачи достаточно.
8. Ёпрст 1067 11.03.14 10:59 Сейчас в теме
Если нужен конструктор, тогда так

|Выбрать из реализаций
|По реализациям
|Где Реализация + условия
|//(И тут разветвление)
|и 1=1
|и 2=2
|....
|и 100=100


Если <условие2> Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"1=1"," твоё выражение с нужным условием 2")
ИначеЕсли <условие3>
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"2=2"," твоё выражение с нужным условием 3")
Иначе .....
10. squall84 11.03.14 11:34 Сейчас в теме
(8) Ёпрст, (9) NatalyaVP,
Я наверное тугодогоняющий.
Переписал по условию запрос. Он работает, ноне отрабатывает условия.

Запрос.Текст = 
		"ВЫБРАТЬ
		|	РеализацияТоваровУслуг.Ссылка,
		|	РеализацияТоваровУслуг.Контрагент,
		|	РеализацияТоваровУслуг.Организация,
		|	РеализацияТоваровУслуг.Склад,
		|	РеализацияТоваровУслуг.ДоговорКонтрагента
		|ИЗ
		|	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг  
		|  	ГДЕ
		|   РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон
		|   И 1=1
		|   И 2=2
		|	И ВЫБОР
		|			КОГДА &Организация = ЗНАЧЕНИЕ(СПравочник.Организации.ПустаяСсылка)
		|				ТОГДА ИСТИНА
		|			ИНАЧЕ РеализацияТоваровУслуг.Организация = &Организация
		|		КОНЕЦ
		|	И РеализацияТоваровУслуг.Контрагент В ИЕРАРХИИ(&Контрагент)
		|	И РеализацияТоваровУслуг.ПометкаУдаления = &ПометкаУдаления";
		Если БезВозвратов тогда
		ТекстЗапроса=СтрЗаменить(ТекстЗапроса, "1=1", "
		|НЕ РеализацияТоваровУслуг.Сделка В
		|		(ВЫБРАТЬ
		|			РеализацияТоваровУслуг.Сделка
		|		ИЗ
		|			Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
		|				ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
		|				ПО
		|					РеализацияТоваровУслуг.Сделка = ВозвратТоваровОтПокупателя.Сделка
		|						И ВозвратТоваровОтПокупателя.ПометкаУдаления = &ПометкаУдаления
		|						И ВозвратТоваровОтПокупателя.Дата МЕЖДУ &ДатаНач И &ДатаКон
		|						И ВЫБОР
		|								КОГДА &Организация = ЗНАЧЕНИЕ(СПравочник.Организации.ПустаяСсылка)
		|										ТОГДА ИСТИНА
		|								ИНАЧЕ ВозвратТоваровОтПокупателя.Организация = &Организация
		|							КОНЕЦ)");
 
	Иначе	
		ТекстЗапроса=СтрЗаменить(ТекстЗапроса, "2=2", "
		|ГДЕ
		|	НЕ РеализацияТоваровУслуг.Ссылка В
		|				(ВЫБРАТЬ
		|					РеализацияТоваровУслуг.Ссылка
		|				ИЗ
		|					Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
		|						ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПриходныйКассовыйОрдер КАК ПриходныйКассовыйОрдер
		|						ПО
		|							РеализацияТоваровУслуг.Ссылка = ПриходныйКассовыйОрдер.ДокументОснование
		|                           И ПриходныйКассовыйОрдер.ДокументОснование.Дата МЕЖДУ &ДатаНач И &ДатаКон
		|	                        И ВЫБОР
		|								КОГДА &Организация = ЗНАЧЕНИЕ(СПравочник.Организации.ПустаяСсылка)
		|										ТОГДА ИСТИНА
		|								ИНАЧЕ ПриходныйКассовыйОрдер.ДокументОснование.Организация = &Организация
		|							КОНЕЦ
		|	                        И ПриходныйКассовыйОрдер.ДокументОснование.Контрагент В ИЕРАРХИИ(&Контрагент)
		|                           И ПриходныйКассовыйОрдер.ПометкаУдаления = &ПометкаУдаления)");
		КонецЕсли;
Показать
12. squall84 11.03.14 11:51 Сейчас в теме
(10) squall84, Разобрался. Всем Спасибо. Нужно было заменить ТекстЗапроса на мой Запрос.Текст
14. Ёпрст 1067 11.03.14 11:53 Сейчас в теме
(10) в вашем случае, достаточно заменить 1=1 и выкинуть 2=2... + в ветке Иначе у вас лишняя конструкция ГДЕ ..
9. NatalyaVP 11.03.14 11:22 Сейчас в теме
Можно так попробовать:
Если Флаг тогда
Запрос.Текст = Запрос.Текст +| По условию 2
Иначе
Запрос.Текст =Запрос.Текст +| По условию 3
Выполнить запрос
11. l_user 11.03.14 11:50 Сейчас в теме
To squall84:
Условия
"НЕ РеализацияТоваровУслуг.Сделка В..."
и
"НЕ РеализацияТоваровУслуг.Ссылка В ..."
предполагают наличие списка после "В". А у вас?
13. squall84 11.03.14 11:53 Сейчас в теме
(11) l_user, Оба запроса полностью отрабатываются в собранном виде. По нажатию кнопки изначально хотел сделать либо один запрос, либо другой. Чтобы немного уменьшить текст обработки решил эти два запроса объединить в один и разбить по условию.
15. KrivosheevEV 12.03.14 10:40 Сейчас в теме
А мне конструкции без разрезания текста запроса больше нравятся:

//..
|  И ВЫБОР 
|    КОГДА &БезВозвратов ТОГДА
|      // Условие1.
|    ИНАЧЕ 
|      // Условие2.
|  КОНЕЦ 
//..
Said-We; user693240_abramovskaya; +2 Ответить
16. jan-pechka 435 13.04.23 04:40 Сейчас в теме
Можно еще проще:
Текст="";
Текст = Текст+
	
"ВЫБРАТЬ
|	КадроваяИсторияСотрудниковИнтервальный.Сотрудник КАК Сотрудник
|ПОМЕСТИТЬ Уволенные
|ИЗ
|	РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК КадроваяИсторияСотрудниковИнтервальный
|ГДЕ
|	РАЗНОСТЬДАТ(КадроваяИсторияСотрудниковИнтервальный.ДатаНачала, КадроваяИсторияСотрудниковИнтервальный.ДатаОкончания, ЧАС) > 1
|	И КадроваяИсторияСотрудниковИнтервальный.ВидСобытия = ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)
|	И КадроваяИсторияСотрудниковИнтервальный.Сотрудник В(&Сотрудники)
|;
|
|";

Если ЗначениеЗаполнено(ЗарплатныйПроект)Тогда
Текст=Текст+

"///////////////////////////////////////////////////////////­/////////////////////
|ВЫБРАТЬ
|	ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам.ФизическоеЛицо КАК ФизическоеЛицо,
|	ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам.ЗарплатныйПроект КАК ЗарплатныйПроект,
|	ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам.Организация КАК Организация,
|	ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам.НомерЛицевогоСчета КАК НомерЛицевогоСчета,
|	ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам.ДатаОткрытияЛицевогоСчета КАК ДатаОткрытияЛицевогоСчета
|ПОМЕСТИТЬ вт_ЛицСчетаЗПпроектВСЕ
|ИЗ
|	РегистрСведений.ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам КАК ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам
|ГДЕ
|	ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам.ЗарплатныйПроект = &зпПроект
|	И ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам.ФизическоеЛицо В
|			(ВЫБРАТЬ
|				Физики.ФизическоеЛицо КАК ФизическоеЛицо
|			ИЗ
|				Физики КАК Физики)";

Иначе
Текст=Текст+" ///еще чего-нибудь";

Запрос.Текст=Текст;
РезультатЗапроса=Запрос.Выполнить().Выгрузить();

Показать

такую конструкцию легко в цикл запихнуть
17. пользователь 13.04.23 12:24
Сообщение было скрыто модератором.
...
18. Zevzm 13.04.23 12:39 Сейчас в теме
(17) Через 48 дней, но закончатся ли некрофилы...
19. jan-pechka 435 13.04.23 13:09 Сейчас в теме
(18)
некрофилы

да...аж 3 уже набежало) еще не вечер
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот