Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
18 апр 2024, 22:50

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

Автор AlterMann, 26 ноя 2012, 14:51

0 Пользователей и 1 гость просматривают эту тему.

AlterMann

Всем здравствуйте.
В 1с программирую месяц.

Конструктором построил запрос. Чтобы он был более удобен, я хочу добавить возможность отфильтровать результат запроса по некоторым заданным параметрам (на пример контрагент). Реализовать фильтрацию я решил через условия в запросе, но после добавления этих условий оказалось, что теперь, чтобы запрос отработал необходимо, чтобы в каждом окне фильтра было задано конкретное значение. Если хоть одно значение не задано, то запрос формируется пустым. А хотелось бы наоборот: если все поля пустые, то запрос формируется по всем документам, если в окне "контрагент" есть значение, то документы только этого контрагента, ну а если окна "товар" и "ответственный менеджер" тоже заполнены, то соответственно выборка, удовлетворяющая всем условиям.

Текст запроса:

"ВЫБРАТЬ
   |   Претензия.Номер КАК Номер,
   |   Претензия.ДатаРеализации КАК ДатаРеализации,
   |   Претензия.Контрагент КАК Контрагент,
   |   Претензия.ОтветственныйМенеджер КАК ОтветственныйМенеджер,
   |   ПретензияТабличнаяЧасть1.Товар КАК Товар,
   |   ПретензияТабличнаяЧасть1.ОписаниеБрака КАК ОписаниеБрака,
   |   Претензия.ПретенезияОбработана
   |ИЗ
   |   Документ.Претензия.ТабличнаяЧасть1 КАК ПретензияТабличнаяЧасть1
   |      ЛЕВОЕ СОЕДИНЕНИЕ Документ.Претензия КАК Претензия
   |      ПО ПретензияТабличнаяЧасть1.Ссылка = Претензия.Ссылка
   |ГДЕ
   |   Претензия.ПретенезияОбработана = &ПретенезияОбработана
   |   И Претензия.ТабличнаяЧасть1.Товар = &Товар
   |   И Претензия.Контрагент = &Контрагент
   |   И Претензия.ОтветственныйМенеджер = &ОтветственныйМенеджер
   |
   |УПОРЯДОЧИТЬ ПО
   |   Номер,
   |   ДатаРеализации,
   |   Контрагент,
   |   Товар,
   |   ОписаниеБрака,
   |   ОтветственныйМенеджер";

mixqn

одно из двух: либо не пользуйся запросом (вместо этого смотри на построитель отчета, либо СКД), либо формируй текст запроса кодом, путем анализа заполненности параметров. типа такого:
Если ЗначениеЗаполнено(Контрагент) Тогда
    ТекстЗапроса = ТекстЗапроса + "
|   И Претензия.Контрагент = &Контрагент";
КонецЕсли;


ну и так далее

AlterMann

mixqn, а как закончить редактирование запроса после ответственного менеджера?
Вот так?
|ГДЕ
| Претензия.ПретенезияОбработана = &ПретенезияОбработана";
Если ЗначениеЗаполнено(Товар) Тогда
ТекстЗапроса = ТекстЗапроса + "
| Претензия.ТабличнаяЧасть1.Товар = &Товар";
КонецЕсли;
    Если ЗначениеЗаполнено(Контрагент) Тогда
ТекстЗапроса = ТекстЗапроса + "
| Претензия.Контрагент = &Контрагент";
КонецЕсли;
Если ЗначениеЗаполнено(ОтветственныйМенеджер) Тогда
ТекстЗапроса = ТекстЗапроса + "
| Претензия.ОтветственныйМенеджер = &ОтветственныйМенеджер";
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + "
|УПОРЯДОЧИТЬ ПО

mixqn

AlterMann, приблизительно так. только алгоритм у вас будет более сложный - надо проверять, когда добавлять "И", а когда не надо. я только показал направление, весь код некогда пока писать. если не разберетесь, может вечерком посмотрю, напишу код целиком.

AlterMann

Цитата: mixqn от 26 ноя 2012, 15:31AlterMann, приблизительно так. только алгоритм у вас будет более сложный - надо проверять, когда добавлять "И", а когда не надо. я только показал направление, весь код некогда пока писать. если не разберетесь, может вечерком посмотрю, напишу код целиком.
Спасибо, mixqn, я пока сам поковыряюсь.

Promblem

что означает + в конце строки
Если ЗначениеЗаполнено(Контрагент) Тогда
        ТекстЗапроса = ТекстЗапроса + "

mixqn

Promblem, смотрите внимательнее, + не
Цитата: Promblem от 26 ноя 2012, 16:43в конце строки
(строка заканчивается там, где есть ";" ), это просто +.
буквально означает: + строка такая-то (далее в кавычках после +)


AlterMann

Все получилось! В итоге должно быть вот так:
ТекстЗапроса=
"ВЫБРАТЬ
| Претензия.Номер КАК Номер,
| Претензия.ДатаРеализации КАК ДатаРеализации,
| Претензия.Контрагент КАК Контрагент,
| Претензия.ОтветственныйМенеджер КАК ОтветственныйМенеджер,
| ПретензияТабличнаяЧасть1.Товар КАК Товар,
| ПретензияТабличнаяЧасть1.ОписаниеБрака КАК ОписаниеБрака,
| Претензия.ПретенезияОбработана
|ИЗ
| Документ.Претензия.ТабличнаяЧасть1 КАК ПретензияТабличнаяЧасть1
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.Претензия КАК Претензия
| ПО ПретензияТабличнаяЧасть1.Ссылка = Претензия.Ссылка
|ГДЕ
| Претензия.ПретенезияОбработана = &ПретенезияОбработана";
Если ЗначениеЗаполнено(Товар) Тогда
ТекстЗапроса = ТекстЗапроса + "
| И Претензия.ТабличнаяЧасть1.Товар = &Товар";
КонецЕсли;
    Если ЗначениеЗаполнено(Контрагент) Тогда
ТекстЗапроса = ТекстЗапроса + "
| И Претензия.Контрагент = &Контрагент";
КонецЕсли;
Если ЗначениеЗаполнено(ОтветственныйМенеджер) Тогда
ТекстЗапроса = ТекстЗапроса + "
| И Претензия.ОтветственныйМенеджер = &ОтветственныйМенеджер";
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + "
|УПОРЯДОЧИТЬ ПО
| Номер,
| ДатаРеализации,
| Контрагент,
| Товар,
| ОписаниеБрака,
| ОтветственныйМенеджер";

Спасибо, mixqn!

mixqn

рад, что смог помочь )) приходите еще ;)

markgenuine

Вопрос по теме, чтобы не флудить...как в СКД задать 2 условия:
ПоступлениеТоваровУслугТовары.Ссылка.ДатаВходящегоСчетаФактуры
ПоступлениеТоваровУслугТовары.Ссылка.НомерСчетаФактуры фильтр на то что заполнен или нет, по сути мне нужно выводить поступления товаров только те которые без СФ.
Спасибо
Добавлено: 27 ноя 2012, 12:23


Все ришл свой вопрос сам, спасибо

Похожие темы (5)

Рейтинг@Mail.ru

Поиск