Отбор в дереве значений
на работе задали задачу — сделать список номенклатуры в виде дерева (нижние уровни — список комплектующих для данной позиции номенклатуры) с отображением количества имеющейся для данной позиции номенклатуры документации (справочник — хранилище дополнительной информации). плюс прикрутить к этому списку поиск, что бы, например, можно было отобрать только те позиции, по которым имеется документация.
с первым пунктом я справился (сформировал два запроса — на выборку номенклатуры с комплектующими, а второй на выборку количества файлов. и поместил результат в дерево значений). а вот со вторым у меня проблема — не знаю как легче это сделать. как я понял, встроенного метода у дерева значений нет.
подскажите пожалуйста, как можно осуществить отбор в дереве значений?
(1) Отбор это понятие скорее интерфейсное. У табличного поля в которое выведено дерево значений есть отбор. У дерева значений как такового отбора нет, но у КоллекцияСтрокДереваЗначений есть метод НайтиСтроки().
Работу с деревом значений можно посмотреть здесь
http://infostart.ru/public/79771/
(3) метод НайтиСтроки(). Замечание! Массив хранит ссылки на строки дерева значений, то есть при изменении строки в дереве, значение в массиве тоже будет изменено. как мне тогда результат поиска поместить в дерево? ведь мне же придется очистить его, но тогда очистится и сам массив результата поиска.
(5) Есть варианты:
1. Скопировать
2. Удалить не попавшие в отбор
3. Пользоваться отбором табличного поля (самый быстрый в работе)
НайтиСтроки() у ДЗ не подходит?
Но вообще, раз это дерево и так запросом делается, что мешает в нем запросом же сделать отбор?
(2) не мешает. просто мне кажется, что это не самый быстрый способ будет.
(3) про работу с деревом спасибо. щас посмотрю.
ссылку посмотрел. слишком сложно. к тому же автор обработки сам создал форму отбора и сам написал процедуру отбора. и я так до конца не разобрался — как он резкультат отбора помещает в дерево.
в целом, по-быстрому, получить стандартную форму отбора для данной ситуации не получится 🙂
обычный стандартный отбор работает, когда есть привязка к данным, если привязки нет — 1С отборы делать не умеет
но есть способ )) — работать через построитель запросов (построитель отчетов). Либо пихать туда запрос, либо ТЗ, как источник данных. Тогда можно сделать стандартные 1С-ные отборы.
кажись начинаю разбираться. спасибо, alexk-is, спасибо, romansun. а так же всем, кто ответил. попробую через построитель запроса сделать. потом отпишу, что получилось
ПостроительЗапроса = Новый ПостроительЗапроса; ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(дерево); НовыйОтбор = ПостроительЗапроса.Отбор.Добавить("Номенклатура.Наименование"); НовыйОтбор.Использование = Истина; НовыйОтбор.ВидСравнения = ВидСравнения.Содержит; НовыйОтбор.Значение = "блок";
не позволяет произвести отбор по колонке «Номенклатура.Наименование». хотя просто по «Номенклатура» отбор делает. мне же нужно, чтобы пользователь находил номенклатуру по подстроке (ВидСравнения.Содержит). может я чего-то еще не указал?
могу ошибаться, но там вроде как «по точке» ссылки в отборе вы не раскроете. задавайте все необходимые поля изначально в источнике данных
еще одна проблемка с построителем запроса выяснилась — в результат отбора попадают только строки верхнего уровня. в справке прочел, что тип источника данных не может быть равен «ДеревоЗначений».
ОписаниеИсточникаДанных (DataSourceDescription)
ИсточникДанных (DataSource)
Использование:
Чтение и запись.
Описание:
Тип: ТаблицаЗначений, РезультатЗапроса, ОбластьЯчеекТабличногоДокумента, Табличная часть, РегистрНакопленияНаборЗаписей., РегистрСведенийНаборЗаписей., РегистрБухгалтерииНаборЗаписей., РегистрРасчетаНаборЗаписей.. Содержит описываемый источник данных.
дз вы в источник данных не запихнете, да
Источник данных — запрос, выводящий дерево. И отбор будет работать и дерево на выходе получите.
да, и добавлю к своему же ответу — в секции в запросе сцылочные типы укажите со «*» — получите расшифровку ссылки в отборе с плюсиком.
//Скрывает отображает товар с нулевым количеством заказа в дереве значений //по нажатию на флажок отбора Процедура ФлЗаполнитьТолькоЗаказанныеТоварыПриИзменении(Элемент) Если ФлЗаполнитьТолькоЗаказанныеТовары Тогда Отбор = Новый Структура; //Настраиваем отбор по колонкам, - в данном случае это "Количество = 0" Отбор.Вставить("Количество",0); //Делаем копию исходного дерева КорпияДереваЗначений = Новый ДеревоЗначений; КорпияДереваЗначений = ДеревоДанныхКомплектующие.Скопировать(); //Делаем отбор строк в оригинале и копии МассивСтрокСНулевымКоличествомЗаказаКопия = КорпияДереваЗначений.Строки.НайтиСтроки(Отбор,Истина); МассивСтрокСНулевымКоличествомЗаказа = ДеревоДанныхКомплектующие.Строки.НайтиСтроки(Отбор,Истина); //Удалем строки в оригинале Для Каждого СтрМассивСтрокСНулевымКоличествомЗаказа Из МассивСтрокСНулевымКоличествомЗаказа Цикл Попытка СтрМассивСтрокСНулевымКоличествомЗаказа.Родитель.Строки.Удалить(СтрМассивСтрокСНулевымКоличествомЗаказа); Исключение КонецПопытки; КонецЦикла; //Очищаем массив оригинальных строк МассивСтрокСНулевымКоличествомЗаказа.Очистить(); Иначе //Восстанавливаем копии удаленных строк Для Каждого СтрМассивСтрокСНулевымКоличествомЗаказа Из МассивСтрокСНулевымКоличествомЗаказаКопия Цикл //Получим родителя копии строки, в данном примере - ТорговыеОбъекты РодительКопияТО = СтрМассивСтрокСНулевымКоличествомЗаказа.Родитель.ТорговыеОбъекты; //Пройдемся по оригинальному дереву и восстановим строки у совпадающих //родителей Для Каждого СтрДеревоДанныхКомплектующие Из ДеревоДанныхКомплектующие.Строки Цикл Если СтрДеревоДанныхКомплектующие.ТорговыеОбъекты = РодительКопияТО Тогда НовСтр = СтрДеревоДанныхКомплектующие.Строки.Добавить(); ЗаполнитьЗначенияСвойств(НовСтр,СтрМассивСтрокСНулевымКоличествомЗаказа); КонецЕсли; КонецЦикла; КонецЦикла; //Очитстим массив копий строк МассивСтрокСНулевымКоличествомЗаказаКопия.Очистить(); КонецЕсли; КонецПроцедуры
ПРоцедура удалитьстрокидерева(ДеревоСравнения) МассивСтрокСНулевымКоличествомЗаказа = НОвый Массив; Для каждого с из ДеревоСравнения.Строки цикл Если с.количество-с.количествовфайле =0 И не с.естьотличия тогда МассивСтрокСНулевымКоличествомЗаказа.Добавить(с); конецесли; Если с.строки.Количество()>0 тогда удалитьстрокидерева(с); конецесли; КонецЦикла; Для каждого с из МассивСтрокСНулевымКоличествомЗаказа цикл // попытка Если с.Родитель = Неопределено Тогда //ДеревоСравнения.Строки.Удалить(с); Иначе с.Родитель.Строки.Удалить(с); конецЕсли; исключение конецпопытки; КонецЦикла; конецпроцедуры
Источник
8.3 Отбор в дереве значений
Подскажите как осуществить отбор в уже выведенном на форму дереве значений?
Подумываю попробовать НайтиСтроки() но не уверен что это то что нужно.
(2) это не метод, но походу он для только таблицы значений; тогда +1 к условному оформлению, или есть еще вариант с переформированием дерева с уже отобранными данными
(0) А как ты себе вообще это представляешь?
Вот есть у тебя дерево — 3 уровня. Наложил отбор, ему соответствует только самая нижняя строка. Куда бежать, как отображать?
(9) Мне (и платформе, кстати, тоже) мало интересно, какое у тебя «там» дерево. В (8) конкретный пример — опиши, как должно выглядеть дерево после наложения отбора.
Ну и если дерево одноуровневое — может пора перестать стесняться и сделать его таблицей?
(11) Не стесняюсь, тупо лень)))
Там весь док переписывать прийдётся(
А выглядеть после наложения отбора так же могло бы)))
Но конечно случай единичный и годиться только для одноуровневого дерева.
(10) (7)
Добавляешь элемент условного оформления,
Оформление — Видимость = Ложь, Отображать = Ложь
Условие — при котором нужно скрыть неугодные строки,
Оформляемые поля — элементы формы — сама таблица и все ее колонки.
Однако возможна беда — иногда у вертикального скроллера срывает кукушку и он дико колбасится при скроллинге (по-моему появилась в 8.3).
Поэтому завести два дерева будет более стабильным решением.
Но смотри чтобы форму не порвало.
(15) Что то ругается «Недоступен в данных формах»
Это же реквизит дерева с типом «УсловноеОформление» или не туда полез?
(21) Как в СКД отчета.
— находишь элемент условного оформления через свойство управляемой формы УсловноеОформление.Элементы.
— в найденном элементе корячишь отборы через его свойство .Отбор.Элементы
(35) Док по типу установки цен в УТ 11
С возможностью добавления любого количества периодов (в виде колонок)
Вот теперь надо сделать ещё одну ТЧ (само собйо тупо на форме) в которой будут выводится сгруппированные контрагенты.
и при выделении нужного контрагента в левой части в правой показывается товар выписанный на него.
Сложности то бы не было если бы не механизм этого дерева, данные из которого скидываются в ТЧ при записи. Причем пишютяс данные дерева в уже очищенную ТЧ.
Т.к. что если делать отбор приформировании дерева на форме будет часть данных только и обратно в ТЧ попадет тоже только эта часть.
Сделаю либо запоминание удаленных и добавленных строк, с переделкой механизма записи данных дерева в ТЧ либо все перепишу на таблицу и буду юзать отборы.
Посмотрю что менее трудозатратно.
Хотя таблица значений разумеется будет работать быстрее — всегда когда есть возможность лучше использовать таблицу вместо дерева.
(39) Элементарно!
При заполнении дерева вычисляется флажок Булево — скрывать или показывать ли эту строку дерева.
Соответственно строчка верхнего уровня скрывается если скрыты все подчиненные.
Источник