Отборстрок по нескольким колонкам

1. login1020 138 26.07.19 15:40 Сейчас в теме
Собственно, как можно задать табличной части отбор строк по нескольким колонкам?

Элементы.Настройка.ОтборСтрок =
Новый ФиксированнаяСтруктура("ГруппаСкладов,Склад,Полуфабрикат",
?(ЗначениеЗаполнено(ФильтрГруппаСкладов),ФильтрГруппаСкладов,Неопределено),
?(ЗначениеЗаполнено(ФильтрСклад),ФильтрГруппаСкладов,Неопределено),
?(ЗначениеЗаполнено(ФильтрНоменклатура),ФильтрНоменклатура,Неопределено));

Хотел передать все 3 колонки, но я так понял, что можно только одну.
Если устанавливать по одному, то при установке следующего отбора сбрасывается предыдущий.

Кроме как завести реквизит "булево" на форме, и при установке отборов перезаполнять его, а уже потом по нему строить ОтборСтрок, ничего в голову не приходит.
По теме из базы знаний
Найденные решения
6. YannikAlx 27 26.07.19 17:18 Сейчас в теме
Вот тут Павел Чистов приводит пример , в котором ФиксированнаяСтруктура Имеет параметром Структуру, в которой не один элемент отбора
https://expert.chistov.pro/public/803449/

В самом конце статьи это видно
login1020; alex-l19041; +2 Ответить
16. login1020 138 29.07.19 09:25 Сейчас в теме
До этого накидал свой велосипед, и пришлось засунуть допреквизит в таб часть для отбора.
Но тоже работало)

&НаКлиенте
Процедура ФильтрСкладПриИзменении(Элемент)
УстанавитьСнятьОтбор();
КонецПроцедуры

&НаКлиенте
Процедура УстанавитьСнятьОтбор()
	
	Если ЗначениеЗаполнено(ФильтрГруппаСкладов) 
		ИЛИ ЗначениеЗаполнено(ФильтрСклад)
		ИЛИ ЗначениеЗаполнено(ФильтрНоменклатура) Тогда
		ЗаполнитьСтрокуОтбора();
	Иначе
		ЗаполнитьСтрокуОтбора(Ложь);
	КонецЕсли;
	УстановитьСтрокуОтбора();
	
КонецПроцедуры


&НаСервере
Процедура ЗаполнитьСтрокуОтбора(ЗначенияОтбораЗаданы = Истина)
	
	ТабНастройка = объект.Настройка.Выгрузить();

	Если ЗначенияОтбораЗаданы Тогда
		СтруктураПоиска = Новый Структура();
		
		Если ЗначениеЗаполнено(ФильтрГруппаСкладов) Тогда
			СтруктураПоиска.Вставить("ГруппаСкладов",ФильтрГруппаСкладов);
		КонецЕсли;
		
		Если ЗначениеЗаполнено(ФильтрСклад) Тогда
			СтруктураПоиска.Вставить("Склад",ФильтрСклад);
		КонецЕсли;
		
		Если ЗначениеЗаполнено(ФильтрНоменклатура) Тогда
			СтруктураПоиска.Вставить("Полуфабрикат",ФильтрНоменклатура);
		КонецЕсли;
		
		ТабНастройка.ЗаполнитьЗначения(Ложь,"ВыбратьСтроку");
		
		МассивСтрокОтбора = ТабНастройка.НайтиСтроки(СтруктураПоиска);
		Для каждого СтрокаОтбора из МассивСтрокОтбора цикл
			СтрокаОтбора.ВыбратьСтроку = Истина;
		КонецЦикла;
		
	Иначе
		ТабНастройка.ЗаполнитьЗначения(Истина,"ВыбратьСтроку");
	КонецЕсли;
	
	объект.Настройка.Загрузить(ТабНастройка);

КонецПроцедуры
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. YannikAlx 27 26.07.19 16:39 Сейчас в теме
Элементы.Настройка.ОтборСтрок = Новый ФиксированнаяСтруктура("Колонка1,Колонка2", ЗначениеОтбора1, ЗначениеОтбора2);
Передавай сначала реальные значения, чтобы убедиться что рабоатет отбор
3. login1020 138 26.07.19 17:04 Сейчас в теме
(2) не работает,Передаю Неопределено,Значение,Неопределено, т.е отбор по одной колонке, в результате пустая табличная часть.
5. YannikAlx 27 26.07.19 17:14 Сейчас в теме
(3) Вы попробуйте передавать не Неопределено а существующие значения сначала
4. login1020 138 26.07.19 17:08 Сейчас в теме
Позволяет установить отбор по значению колонки.
В качестве ключа используется имя реквизита табличной части, а в качестве значения - значение, по которому осуществляется отбор.
Чтобы снять отбор нужно присвоить свойству либо значение Неопределено, либо пустую ФиксированнаяСтруктура.


Да и в справке нет упоминания, что можно передать несколько колонок.
6. YannikAlx 27 26.07.19 17:18 Сейчас в теме
Вот тут Павел Чистов приводит пример , в котором ФиксированнаяСтруктура Имеет параметром Структуру, в которой не один элемент отбора
https://expert.chistov.pro/public/803449/

В самом конце статьи это видно
login1020; alex-l19041; +2 Ответить
7. spacecraft 26.07.19 17:31 Сейчас в теме
(6) в каком месте кода увидели несколько элементов отбора? Там строго только по одному.
8. YannikAlx 27 26.07.19 17:33 Сейчас в теме
(7) Вы читать не желаете принципиально?
Ну так я вам процетирую тут, может вам поможет....
&НаКлиенте
Процедура УстановитьОтбор (ТекЭлементОтбора,ТекЗначениеОтбора)
	ВторойЭлементОтбора = "";
	Если ТекЭлементОтбора = "КодНоменклатуры" Тогда
		ВторойРеквизитыФормы = "ОтборНаименование";
		ВторойЭлементОтбора = "НаименованиеНоменклатуры";
	Иначе
		ВторойРеквизитыФормы = "ОтборКод";
		ВторойЭлементОтбора = "КодНоменклатуры";
	КонецЕсли;
	
	СтруктураПоиска = Новый Структура;
	Если ТекЗначениеОтбора <> "" Тогда
		СтруктураПоиска.Вставить(ТекЭлементОтбора,ТекЗначениеОтбора);
	КонецЕсли;
	Если ЭтотОбъект[ВторойРеквизитыФормы] <> "" Тогда
		СтруктураПоиска.Вставить(ВторойЭлементОтбора,ЭтотОбъект[ВторойРеквизитыФормы]);
	КонецЕсли;
	Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура(СтруктураПоиска);
	
КонецПроцедуры

Показать
Таким образом, мы для поиска товаров по табличной части мы можем настроить наши, произвольные отборы, при этом даже не по одному, а по нескольким колонкам.
10. spacecraft 26.07.19 17:39 Сейчас в теме
(8) это вы читаете, но не понимаете. "произвольные отборы, при этом даже не по одному, а по нескольким колонкам." означает не буквально сразу по нескольким, а выборочно по одному из. Смотрите внимательно код.
11. YannikAlx 27 26.07.19 17:41 Сейчас в теме
(10) так ответьте на вопрос на засыпку все же , если догоните...
12. spacecraft 26.07.19 17:50 Сейчас в теме
(11) да, признаю. Был не прав.
YannikAlx; +1 Ответить
13. YannikAlx 27 26.07.19 17:52 Сейчас в теме
(12) Уважения к вам прибавилось на порядок!
Извините за грубоватый тон... )))
мир-дружба?
14. spacecraft 26.07.19 17:55 Сейчас в теме
(13) все нормально. Критика была правильной по сути.
9. YannikAlx 27 26.07.19 17:38 Сейчас в теме
(7) Вопрос на засыпку - Сколько элементов может иметь СтруктураПоиска перед использованием в строке
 Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура(СтруктураПоиска);


(секретный ответ - 1 или 2 , в зависимости от ТекЗначениеОтбора <> "" )
15. login1020 138 29.07.19 09:23 Сейчас в теме
(6) да, помогло, последовательно получается можно устанавливать, а не сразу все 3 параметра.
16. login1020 138 29.07.19 09:25 Сейчас в теме
До этого накидал свой велосипед, и пришлось засунуть допреквизит в таб часть для отбора.
Но тоже работало)

&НаКлиенте
Процедура ФильтрСкладПриИзменении(Элемент)
УстанавитьСнятьОтбор();
КонецПроцедуры

&НаКлиенте
Процедура УстанавитьСнятьОтбор()
	
	Если ЗначениеЗаполнено(ФильтрГруппаСкладов) 
		ИЛИ ЗначениеЗаполнено(ФильтрСклад)
		ИЛИ ЗначениеЗаполнено(ФильтрНоменклатура) Тогда
		ЗаполнитьСтрокуОтбора();
	Иначе
		ЗаполнитьСтрокуОтбора(Ложь);
	КонецЕсли;
	УстановитьСтрокуОтбора();
	
КонецПроцедуры


&НаСервере
Процедура ЗаполнитьСтрокуОтбора(ЗначенияОтбораЗаданы = Истина)
	
	ТабНастройка = объект.Настройка.Выгрузить();

	Если ЗначенияОтбораЗаданы Тогда
		СтруктураПоиска = Новый Структура();
		
		Если ЗначениеЗаполнено(ФильтрГруппаСкладов) Тогда
			СтруктураПоиска.Вставить("ГруппаСкладов",ФильтрГруппаСкладов);
		КонецЕсли;
		
		Если ЗначениеЗаполнено(ФильтрСклад) Тогда
			СтруктураПоиска.Вставить("Склад",ФильтрСклад);
		КонецЕсли;
		
		Если ЗначениеЗаполнено(ФильтрНоменклатура) Тогда
			СтруктураПоиска.Вставить("Полуфабрикат",ФильтрНоменклатура);
		КонецЕсли;
		
		ТабНастройка.ЗаполнитьЗначения(Ложь,"ВыбратьСтроку");
		
		МассивСтрокОтбора = ТабНастройка.НайтиСтроки(СтруктураПоиска);
		Для каждого СтрокаОтбора из МассивСтрокОтбора цикл
			СтрокаОтбора.ВыбратьСтроку = Истина;
		КонецЦикла;
		
	Иначе
		ТабНастройка.ЗаполнитьЗначения(Истина,"ВыбратьСтроку");
	КонецЕсли;
	
	объект.Настройка.Загрузить(ТабНастройка);

КонецПроцедуры
Показать
17. YannikAlx 27 29.07.19 09:49 Сейчас в теме
(16) Последовательность тут не шлавное
Вы же сразу ищете
МассивСтрокОтбора = ТабНастройка.НайтиСтроки(СтруктураПоиска);

И сравните ради прикола
СтруктураПоиска , заполненную через вставить и сделайте паралельно другую

 Если ЗначениеЗаполнено(ФильтрГруппаСкладов)  И ЗначениеЗаполнено(ФильтрСклад) И  ЗначениеЗаполнено(ФильтрНоменклатура)  Тогда
   СтруктураПоиска1 = Новый Структура(«ГруппаСкладов,Склад, Полуфабрикат»,ФильтрГруппаСкладов,ФильтрСклад,ФильтрНоменклатура);
КонецЕсли


Она будет также работать прекрасно...
Вся суть в том что вы пытались в СтруктуруПоиска впихнуть Неопределенности , а вот этого поиск не поддерживает!
login1020; +1 Ответить
18. Al-77 74 06.08.20 18:02 Сейчас в теме
Отбор = Новый Структура();
Отбор.Вставить("Должник",ТекущиеДанныеНомерЛиста.Должник);
Отбор.Вставить("НомерИЛ",ТекущиеДанныеНомерЛиста.НомерИЛ);



Элементы.ИсполнительныеЛисты.ОтборСтрок = Новый ФиксированнаяСтруктура(Отбор);

У меня такое работает в тонком клиенте, а в браузере второе условие игнорируется.
Оставьте свое сообщение

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