ИспользоватьСписокЭлементов()
Разработка кода формирования фильтра
В примере конфигурации в справочнике Товары элементы исскуственно расположены на всех трех уровнях. Если такой подход будет реализован на практике, например при 10-ти уровневом справочнике, можно представить как с ним тяжело будет работать. Совершенно правильно дает рекомендации фирма 1С о достаточности 2-3-х уровневого справочника и использовании групп для удобного визуального представления справочников. Но мы преследуем цель создать фильтр, и поэтому усложним задачу и отойдем от этой рекомендации. В результате всех рассуждений получим следующий код и прокомментируем его:
Перем Спр;
//******************************************************************************
Процедура ФормированиеФильтра()
Сз.УдалитьВсе();
ИерархическийСписок(1,0); //1
Спр.ВключатьПодчиненные(0);//2
Спр.ИспользоватьРодителя(ИспользоватьРодителя());//3
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
Если Спр.Остаток.Получить(ТекущаяДата())>0 Тогда
Сз.ДобавитьЗначение(Спр.ТекущийЭлемент());
КонецЕсли;
КонецЦикла;
КонецПроцедуры
//******************************************************************************
Спр=СоздатьОбъект("Справочник.Товары");
//1 сознательно лишаем пользователя отключать иерархический показ справочника;
//2 отключим выборку элементов справочника на всех без исключения нижеследующих уровнях, но следующим методов включим выборку для выбранной группы.
//3 конструкция Спр.ИспользоватьРодителя(ИспользоватьРодителя()) на мой взгляд, одна из самых КРАСИВЫХ среди всех выражений встроенного языка и поэтому заслуживает подробного изложения. Методы ИспользоватьРодителя()перед скобками и в скобках, хотя и написаны одинаковыми буквами, абсолютно разные методы.
Метод ИспользоватьРодителя() который в скобках принадлежит модулю формы списка справочника и возвращает значение текущего родителя. Практически это означает, что при клике мышкой на группе мы получаем значение именно этой группы. Наглядно это можно посмотреть в Отладчике.
Метод ИспользоватьРодителя() который перед скобками принадлежит контексту всего справочника и при наличии параметра просто устанавливает выборку среди группы значение которой определено в параметре.
Т.е все ясно: интерактивно выбираем группу, значение этой группы заставляет при использовании метода ИспользоватьРодителя() осуществлять выборку в пределах означенной группы.
Далее начинаем собственно выборку и проверяем по условию есть ли товар на остатке. Если таковой имеется, то добавляем его в список значений. Фильтр готов.
Теперь остается это фильтр применить. Для этого после выражения КонецЦикла просто дописываем: ИспользоватьСписокЭлементов(Сз);.
Но в таком виде код использовать, конечно, нельзя. Т.к. во-первых не был задействован флажок Наличие, во-вторых кнопка Фильтр использовалась лишь для объяснения механизма формирования фильтра и в работе она ни к чему, в-третьих при навигации по группам справочника опять возникают эти дурацкие вопросики (а возникают они потому, что при смене родителя не меняется фильтр). Идем дальше на доработку кода.