1С 8.3 иерархический фильтр в управляемой форме выбора

Отборы в списках управляемых форм имеют особенность вязанную с иерархией —  если в качестве отбираемого элемента стоит некоторый подчиненный (не корневой) элемент, например, эл 2.1, то в форме выбора не отобразится ничего, т.к. вышестоящие элементы (Эл 2) в отборе не участвуют. Пример — разрешить выбирать статьи затрат только в иерархии эл 2.1:

Корень
* Эл 1
* * Эл 1.1
* * Эл 1.2
* Эл 2
* * Эл 2.1
* * * Эл 2.1.1
* * * Эл 2.1.2
* * Эл 2.2

Неправильно будет просто указать все подчиненные элементы Эл 2.1 в отборе для формы, пример:

&НаКлиенте
Процедура НажаниеКнопкиВыбора()
     Отбор = новый Структура(«Ссылка»,   ПолучитьСписокПодчиненныхСтатейЗатрат(ПредопределенноеЗначение(«Справочник.СтатьиЗатрат.Эл_2_1»)));
     ОткрытьФорму(«Справочник.СтатьиЗатрат.ФормаВыбора», Новый     Структура(«Отбор», Отбор), Элемент);
КонецФункции

&НаСервере
Функция ПолучитьСписокПодчиненныхСтатейЗатрат(СЗ)
Список = новый СписокЗначений;
     Запрос = Новый Запрос;
     Запрос.Текст = «ВЫБРАТЬ
          | СтатьиЗатрат.Ссылка
          |ИЗ
          | Справочник.СтатьиЗатрат КАК СтатьиЗатрат
          |ГДЕ
          | НЕ СтатьиЗатрат.ПометкаУдаления
          | И СтатьиЗатрат.Ссылка В ИЕРАРХИИ(&Ссылка)»;
     Запрос.УстановитьПараметр(«Ссылка»,СЗ);
Список.ЗагрузитьЗначения(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(«Ссылка»));
Возврат Список;
КонецФункции

Правильно будет в функции ПолучитьСписокПодчиненныхСтатейЗатрат дополнительно в выбранный список подчиненных элементов добавить родительские:

Родитель = СЗ.Родитель;
пока ЗначениеЗаполнено(Родитель) цикл
     Список.Добавить(Родитель);
     Родитель = Родитель.Родитель;
КонецЦикла;

Таким образом в окне выбора появится кусок дерева с теми элементами, которые нужны.

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *