Отбор на форме списка документов УФ

1. TODD22 18 10.11.15 11:25 Сейчас в теме
Здравствуйте.

Как правильно сделать отбор на форму списка документов?
Мне нужно в форме списка сделать 2 поля. Первое это ДатаВхДокумента, второе это Номенклатура.

Хочу сделать возможность устанавливать отбор по дате входящего документа и по номенклатуре.

Нашёл вот такой пример:
На форму добавил реквизит формы с типом спр.Номенклатура.
	 	ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
		ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура");
		ЭлементОтбора.ПравоеЗначение = Элементы.Номенклатура;
		ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
		ЭлементОтбора.Использование = Истина;
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. m-serg74 46 10.11.15 11:28 Сейчас в теме
3. TODD22 18 10.11.15 11:29 Сейчас в теме
8. m-serg74 46 10.11.15 11:54 Сейчас в теме
10. EMelihoff 10.11.15 11:56 Сейчас в теме
(8) m-serg74, Номенклатура в табличной части документа же?
13. TODD22 18 10.11.15 12:06 Сейчас в теме
(10) EMelihoff, Нет это реквизит.
16. m-serg74 46 10.11.15 12:12 Сейчас в теме
(10) EMelihoff, в какой ТЧ, он же написал,
На форму добавил реквизит формы с типом спр.Номенклатура
5. Boneman 298 10.11.15 11:46 Сейчас в теме
(1) TODD22, не реквизит формы надо добавлять, а реквизит объекта.
По реквизиту формы отбор не сделаешь, т.к. ввиду отсутствия самой формы,в списке документов его нет.
6. EMelihoff 10.11.15 11:50 Сейчас в теме
(1) TODD22, список документов, динамический список?
7. EMelihoff 10.11.15 11:51 Сейчас в теме
(1) TODD22, если список динамический, есть рекомендации делать через критерии отбора:
ВЫБРАТЬ
	КО.Ссылка,
	КО.ВерсияДанных,
	КО.ПометкаУдаления,
	КО.Номер,
	КО.Дата,
	КО.Проведен,
	КО.Контрагент,
	КО.Проект,
	КО.Сумма,
	КО.МоментВремени
ИЗ
	Документ.РасходнаяНакладная КАК КО
		ЛЕВОЕ СОЕДИНЕНИЕ КритерийОтбора.ПоНоменклатуре(&Номенклатура) КАК Док
		ПО Док.Ссылка = КО.Ссылка
ГДЕ
	(Док.Ссылка = КО.Ссылка
			ИЛИ &Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка))
Показать
4. dj_serega 392 10.11.15 11:43 Сейчас в теме
 ЭлементОтбора.ПравоеЗначение = Элементы.Номенклатура;

заменить на
ЭлементОтбора.ПравоеЗначение = Номенклатура;
11. TODD22 18 10.11.15 12:02 Сейчас в теме
(4) dj_serega, Вроде получилось. Только такой момент.
Я сделал функцию в обработчике реквизита номенклатура при изменении на клиенте.
Когда открываю форму у меня в списке все документы. Затем выбираю номенклатуру и у меня срабатывает отбор.
Но если я очищаю реквизит номенклатуры то у меня список документов вообще пустой.
14. antz 10.11.15 12:09 Сейчас в теме
(11) TODD22, при изменении надо проверять номенклатуру на заполнение и если не заполнено - очищать отбор.
15. TODD22 18 10.11.15 12:11 Сейчас в теме
(14) antz, Тогда надо вызывать сервер? Или есть метод проверки на клиенте?
Попробовал проверить через ф-ю ЗначениеЗаполнено() ругается на мутабельное значение.
17. m-serg74 46 10.11.15 12:13 Сейчас в теме
(15) TODD22,
через ф-ю ЗначениеЗаполнено()

опять Элемент.Номенклатура проверяешь?
18. TODD22 18 10.11.15 12:18 Сейчас в теме
(17) m-serg74, Да точно :)

Но всё равно срабатывает только 1 раз. Второй отбор уже не срабатывает.
19. dj_serega 392 10.11.15 12:20 Сейчас в теме
(18) TODD22, Код установки/очистки отбора дайте
20. TODD22 18 10.11.15 12:23 Сейчас в теме
(19) dj_serega,
&НаКлиенте
Процедура НоменклатураПриИзмененииНаСервере()
	
	 Если ЗначениеЗаполнено(Номенклатура) Тогда 
		ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
		ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура");
		ЭлементОтбора.ПравоеЗначение = Номенклатура;
		ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
		ЭлементОтбора.Использование = Истина;
	КонецЕсли;

КонецПроцедуры
Показать

Вот код установки отбора. По первой номенклатуре срабатывает. Если выбираю вторую номенклатуру то не срабатывает. Просто пустой список.
Как его правильно очистить?
21. antz 10.11.15 12:29 Сейчас в теме
(20) TODD22,

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


+ ты при КАЖДОМ изменении номенклатуры ДОБАВЛЯЕШЬ этот элемент отбора. Зачем?
22. dj_serega 392 10.11.15 12:30 Сейчас в теме
(20) TODD22, если других отборов нет то:
&НаКлиенте
Процедура НоменклатураПриИзмененииНаСервере()
    Список.Отбор.Элементы.Очистить();
     Если ЗначениеЗаполнено(Номенклатура) Тогда 
        ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
        ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура");
        ЭлементОтбора.ПравоеЗначение = Номенклатура;
        ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        ЭлементОтбора.Использование = Истина;
    КонецЕсли;

КонецПроцедуры
Показать
9. EMelihoff 10.11.15 11:55 Сейчас в теме
&НаКлиенте
Процедура ТоварПриИзменении(Элемент)
	Список.Параметры.УстановитьЗначениеПараметра("Номенклатура", Товар); 
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Список.Параметры.УстановитьЗначениеПараметра("Номенклатура", Товар); 
КонецПроцедуры
Показать
12. TODD22 18 10.11.15 12:05 Сейчас в теме
Что то не получается. Отбор один раз только накладывается.
А дальше отбор не работает. Выбираю последующие виды номенклатуры список пустой.
23. TODD22 18 10.11.15 12:30 Сейчас в теме
Получилось

Если ЗначениеЗаполнено(Номенклатура) Тогда
		
		ЭлементОтбора = Список.Отбор.Элементы;
		ЭлементОтбора.Очистить();
		
		ТекОтбор = ЭлементОтбора.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ТекОтбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
		ТекОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура");
		ТекОтбор.ПравоеЗначение = Номенклатура;
		ТекОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
		ТекОтбор.Использование = Истина;
	Иначе
		ЭлементОтбора = Список.Отбор.Элементы;
		ЭлементОтбора.Очистить();

	КонецЕсли;
Показать
24. dj_serega 392 10.11.15 12:32 Сейчас в теме
(23) TODD22, Если конфа на БСП, я бы посоветовал использовать общие процедуры:
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора();
25. TODD22 18 10.11.15 12:35 Сейчас в теме
(24) dj_serega, Нет конфа рукоблудная :(
26. floodprog 23 26.06.17 13:28 Сейчас в теме
Оставьте свое сообщение

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