Из основной формы (обработка, документ, справочник.....) необходимо вызвать форму отбора элементов справочника.
Форма Отбора должна иметь табличное поле, ДеревоЗначений. При открытии, дерево должно заполнится элементами справочника например Спецификации Номенклатуры. Пользователь должен иметь возможность проставить напротив нужных элементов флажок. После выбора элементов, нажать на кнопку Выполнить, в результате форма должна закрыться, а выбранные спецификации вернуться в исходну форму.
Создаем форму выбора, размещаем Табличное поле, в свойствах выбираем тип ДеревоЗначений. Добавляем Поле (СправочникСсылка.СпецификацииНоменклатуры).
Форму надо Окрыть Модально и заполнить данными.
Процедура ПриОткрытии() Дерево.Строки.Очистить(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЛОЖЬ КАК Флажок, | Спецификации.Ссылка КАК Спецификация |ИЗ | Справочник.СпецификацииНоменклатуры КАК Спецификации | |УПОРЯДОЧИТЬ ПО | Спецификация ИЕРАРХИЯ"; // Выполним запрос и поместим его результат в табличное поле на форме. Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); КонецПроцедуры
Теперь необходимо написать процедуру действия кнопки Выполнить. Надо обойти все дерево и отобрать выделенные элементы но с условием, папки нам не нужны, только их содержимое. Заполнить Таблицу значений для передачи данных в исходну форму и закрыть форму выбора. Для этого используем рекурсивный метод обхода дерева.
Процедура ОсновныеДействияФормыВыполнить(Кнопка) Таблица = Новый ТаблицаЗначений; Таблица.Колонки.Добавить("Спецификации"); Для Каждого Строка Из Дерево.Строки Цикл Если Не Строка.Спецификация.ЭтоГруппа И Строка.Флажок = Истина Тогда НоваяЗапись = Таблица.Добавить(); НоваяЗапись.Спецификации = Строка.Спецификация; КонецЕсли; ОбойтиДеревоЗначений(Строка, Таблица); КонецЦикла; ЭтаФорма.Закрыть(Таблица); КонецПроцедуры
Процедура ОбойтиДеревоЗначений(Элемент, Таблица) ПодчиненныйЭлемент = Элемент.Строки; Для Каждого Строка из ПодчиненныйЭлемент Цикл Если Не Строка.Спецификация.ЭтоГруппа И Строка.Флажок = Истина Тогда НоваяЗапись = Таблица.Добавить(); НоваяЗапись.Спецификации = Строка.Спецификация; КонецЕсли; ОбойтиДеревоЗначений(Строка, Таблица); КонецЦикла; КонецПроцедуры