Собственно, как можно задать табличной части отбор строк по нескольким колонкам?
Элементы.Настройка.ОтборСтрок =
Новый ФиксированнаяСтруктура("ГруппаСкладов,Склад,Полуфабрикат",
?(ЗначениеЗаполнено(ФильтрГруппаСкладов),ФильтрГруппаСкладов,Неопределено),
?(ЗначениеЗаполнено(ФильтрСклад),ФильтрГруппаСкладов,Неопределено),
?(ЗначениеЗаполнено(ФильтрНоменклатура),ФильтрНоменклатура,Неопределено));
Хотел передать все 3 колонки, но я так понял, что можно только одну.
Если устанавливать по одному, то при установке следующего отбора сбрасывается предыдущий.
Кроме как завести реквизит "булево" на форме, и при установке отборов перезаполнять его, а уже потом по нему строить ОтборСтрок, ничего в голову не приходит.
Вот тут Павел Чистов приводит пример , в котором ФиксированнаяСтруктура Имеет параметром Структуру, в которой не один элемент отбора
https://expert.chistov.pro/public/803449/
До этого накидал свой велосипед, и пришлось засунуть допреквизит в таб часть для отбора.
Но тоже работало)
&НаКлиенте
Процедура ФильтрСкладПриИзменении(Элемент)
УстанавитьСнятьОтбор();
КонецПроцедуры
&НаКлиенте
Процедура УстанавитьСнятьОтбор()
Если ЗначениеЗаполнено(ФильтрГруппаСкладов)
ИЛИ ЗначениеЗаполнено(ФильтрСклад)
ИЛИ ЗначениеЗаполнено(ФильтрНоменклатура) Тогда
ЗаполнитьСтрокуОтбора();
Иначе
ЗаполнитьСтрокуОтбора(Ложь);
КонецЕсли;
УстановитьСтрокуОтбора();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСтрокуОтбора(ЗначенияОтбораЗаданы = Истина)
ТабНастройка = объект.Настройка.Выгрузить();
Если ЗначенияОтбораЗаданы Тогда
СтруктураПоиска = Новый Структура();
Если ЗначениеЗаполнено(ФильтрГруппаСкладов) Тогда
СтруктураПоиска.Вставить("ГруппаСкладов",ФильтрГруппаСкладов);
КонецЕсли;
Если ЗначениеЗаполнено(ФильтрСклад) Тогда
СтруктураПоиска.Вставить("Склад",ФильтрСклад);
КонецЕсли;
Если ЗначениеЗаполнено(ФильтрНоменклатура) Тогда
СтруктураПоиска.Вставить("Полуфабрикат",ФильтрНоменклатура);
КонецЕсли;
ТабНастройка.ЗаполнитьЗначения(Ложь,"ВыбратьСтроку");
МассивСтрокОтбора = ТабНастройка.НайтиСтроки(СтруктураПоиска);
Для каждого СтрокаОтбора из МассивСтрокОтбора цикл
СтрокаОтбора.ВыбратьСтроку = Истина;
КонецЦикла;
Иначе
ТабНастройка.ЗаполнитьЗначения(Истина,"ВыбратьСтроку");
КонецЕсли;
объект.Настройка.Загрузить(ТабНастройка);
КонецПроцедуры
Элементы.Настройка.ОтборСтрок = Новый ФиксированнаяСтруктура("Колонка1,Колонка2", ЗначениеОтбора1, ЗначениеОтбора2);
Передавай сначала реальные значения, чтобы убедиться что рабоатет отбор
Позволяет установить отбор по значению колонки.
В качестве ключа используется имя реквизита табличной части, а в качестве значения - значение, по которому осуществляется отбор.
Чтобы снять отбор нужно присвоить свойству либо значение Неопределено, либо пустую ФиксированнаяСтруктура.
Да и в справке нет упоминания, что можно передать несколько колонок.
Вот тут Павел Чистов приводит пример , в котором ФиксированнаяСтруктура Имеет параметром Структуру, в которой не один элемент отбора
https://expert.chistov.pro/public/803449/
(7) Вы читать не желаете принципиально?
Ну так я вам процетирую тут, может вам поможет....
&НаКлиенте
Процедура УстановитьОтбор (ТекЭлементОтбора,ТекЗначениеОтбора)
ВторойЭлементОтбора = "";
Если ТекЭлементОтбора = "КодНоменклатуры" Тогда
ВторойРеквизитыФормы = "ОтборНаименование";
ВторойЭлементОтбора = "НаименованиеНоменклатуры";
Иначе
ВторойРеквизитыФормы = "ОтборКод";
ВторойЭлементОтбора = "КодНоменклатуры";
КонецЕсли;
СтруктураПоиска = Новый Структура;
Если ТекЗначениеОтбора <> "" Тогда
СтруктураПоиска.Вставить(ТекЭлементОтбора,ТекЗначениеОтбора);
КонецЕсли;
Если ЭтотОбъект[ВторойРеквизитыФормы] <> "" Тогда
СтруктураПоиска.Вставить(ВторойЭлементОтбора,ЭтотОбъект[ВторойРеквизитыФормы]);
КонецЕсли;
Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура(СтруктураПоиска);
КонецПроцедуры
Показать
Таким образом, мы для поиска товаров по табличной части мы можем настроить наши, произвольные отборы, при этом даже не по одному, а по нескольким колонкам.
(8) это вы читаете, но не понимаете. "произвольные отборы, при этом даже не по одному, а по нескольким колонкам." означает не буквально сразу по нескольким, а выборочно по одному из. Смотрите внимательно код.
До этого накидал свой велосипед, и пришлось засунуть допреквизит в таб часть для отбора.
Но тоже работало)
&НаКлиенте
Процедура ФильтрСкладПриИзменении(Элемент)
УстанавитьСнятьОтбор();
КонецПроцедуры
&НаКлиенте
Процедура УстанавитьСнятьОтбор()
Если ЗначениеЗаполнено(ФильтрГруппаСкладов)
ИЛИ ЗначениеЗаполнено(ФильтрСклад)
ИЛИ ЗначениеЗаполнено(ФильтрНоменклатура) Тогда
ЗаполнитьСтрокуОтбора();
Иначе
ЗаполнитьСтрокуОтбора(Ложь);
КонецЕсли;
УстановитьСтрокуОтбора();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСтрокуОтбора(ЗначенияОтбораЗаданы = Истина)
ТабНастройка = объект.Настройка.Выгрузить();
Если ЗначенияОтбораЗаданы Тогда
СтруктураПоиска = Новый Структура();
Если ЗначениеЗаполнено(ФильтрГруппаСкладов) Тогда
СтруктураПоиска.Вставить("ГруппаСкладов",ФильтрГруппаСкладов);
КонецЕсли;
Если ЗначениеЗаполнено(ФильтрСклад) Тогда
СтруктураПоиска.Вставить("Склад",ФильтрСклад);
КонецЕсли;
Если ЗначениеЗаполнено(ФильтрНоменклатура) Тогда
СтруктураПоиска.Вставить("Полуфабрикат",ФильтрНоменклатура);
КонецЕсли;
ТабНастройка.ЗаполнитьЗначения(Ложь,"ВыбратьСтроку");
МассивСтрокОтбора = ТабНастройка.НайтиСтроки(СтруктураПоиска);
Для каждого СтрокаОтбора из МассивСтрокОтбора цикл
СтрокаОтбора.ВыбратьСтроку = Истина;
КонецЦикла;
Иначе
ТабНастройка.ЗаполнитьЗначения(Истина,"ВыбратьСтроку");
КонецЕсли;
объект.Настройка.Загрузить(ТабНастройка);
КонецПроцедуры
И сравните ради прикола
СтруктураПоиска , заполненную через вставить и сделайте паралельно другую
Если ЗначениеЗаполнено(ФильтрГруппаСкладов) И ЗначениеЗаполнено(ФильтрСклад) И ЗначениеЗаполнено(ФильтрНоменклатура) Тогда
СтруктураПоиска1 = Новый Структура(«ГруппаСкладов,Склад, Полуфабрикат»,ФильтрГруппаСкладов,ФильтрСклад,ФильтрНоменклатура);
КонецЕсли
Она будет также работать прекрасно...
Вся суть в том что вы пытались в СтруктуруПоиска впихнуть Неопределенности , а вот этого поиск не поддерживает!