1с корень дерева значений

ДеревоЗначений — создание нового «корневого» элемента

(4) Найти нужную строку, найти нужного родителя, в коллекцию строки родителя добавть строку и заполнить колоники из нужной строки, удалить нужную строку.

(5)Таким способом не переносятся подчиненные строки той строки, с которой копируются 🙁
Это получается, что еще надо рекурсию тут организовывать? Ужас-то какой.

(7) Дык это дерево значений запросом формируется.
Но за мысль спасибо!
Пошел искать способ «приручать» запрос 😉

Как вариант можно пробежаться по дереву и выгрузить его в таблицу значений, потом отсортировать таблицу значений и снова собрать дерево. Но и тут придется испльзовать рекурсию.

В результате «манипуляций» с деревом значений хочется иметь дерево значений со справочником номенклатуры, как бы «подчиненном» складу. При этом дерево номенклатуры должна сохранить иерархию «как в справочнике». Примерно вот так хочется это видеть.

Склад1
I…….ГруппаНоменклатуры1
I I…….ЭлементНоменклатуры1
I I…….ЭлементНоменклатуры2
I I…….ЭлементНоменклатуры2
I…….ГруппаНоменклатуры2
I I…….ЭлементНоменклатуры4
I I…….ЭлементНоменклатуры4
I…….ГруппаНоменклатуры3
Ну и так далее
Как получить запросом иерархию элементов — понятно.
А вот как потом ее «подчинить» складу — не вкуриваю 🙁

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

В результате иерархия получается, но немного другая:
Склад1
I…….ГруппаНоменклатуры1
I…….ЭлементНоменклатуры1
I…….ГруппаНоменклатуры2
I…….ЭлементНоменклатуры2
Т.е. дерево-то вроде как получается, но иерархия в справочнике номенклатуры «теряется».

Понимаю, что надо написать что-то другое в «ИТОГИ ПО», но что именно – вкурить не могу 🙁

Читайте также:  Можно ли сажать кустарники летом деревья

Буду признателен за помощь. Спасибо!

//такс.
//думаю удобнее работать с деревом где контрагенты узлы, а группы номенклатуры — листья
//заполним наше дерево значениями справочников
ДеревоДанных.Строки.Очистить();
ЗапросКонтрагентов = Новый Запрос(«ВЫБРАТЬ
| Контрагенты.Объект КАК Контрагент,
| Номенклатура.НомСсылка КАК Номенклатура
|ИЗ
| РегистрСведений.ЗначенияСвойствОбъектов КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
| ЗначенияСвойствОбъектов.Объект.Родитель КАК НомСсылка
| ИЗ
| РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
| ГДЕ
| ЗначенияСвойствОбъектов.Свойство = &Свойство
| И ЗначенияСвойствОбъектов.Значение = ИСТИНА
| ) КАК Номенклатура
| ПО (ИСТИНА)
|ГДЕ
| Контрагенты.Объект.Поставщик
| И Контрагенты.Свойство = &СвойствоК
|
|СГРУППИРОВАТЬ ПО
| Контрагенты.Объект,
| Номенклатура.НомСсылка
|ИТОГИ ПО
| Контрагент ИЕРАРХИЯ,
| Номенклатура ИЕРАРХИЯ»);
ЗапросКонтрагентов.УстановитьПараметр(«Свойство»,ПланыВидовХарактеристик.СвойстваОбъектов.КонсолидированнаяОтчетность);
ЗапросКонтрагентов.УстановитьПараметр(«СвойствоК»,ПланыВидовХарактеристик.СвойстваОбъектов.ТерриториальноеДеление);
РезультатЗапроса = ЗапросКонтрагентов.Выполнить();
ДеревоЗапроса = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

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

(12) Спасибо! Во, блин я облажался-то с этим «наименованием» 🙁
Заменил на
|ИТОГИ ПО
| ТорговаяТочка, Номенклатура.Ссылка ИЕРАРХИЯ»;
И все получилось как нада.
Спасибо.
.
(13) Про напоминание про типизацию — спасибо. Учту.

Источник

Работа с деревом значений в 1С

В последнее время аномально часто мне в работе попадалось дерево значений, поэтому решил написать на эту тему статью.

Попробую рассмотреть способы решения основных задач связанных с деревом значений, при этом постараюсь писать «без воды».

Дерево значений

Из названия объекта понятно, что дерево значений служит для хранения/отображения какой-либо иерархической информации. Каждая строка дерева значений может иметь какое-то количество подчиненных строк, при этом такие операции как поиск, сортировка, подсчет итогов можно проводит с учетом уровня иерархии и подчиненных строк.

Читайте также:  Отделка потолка деревом своими руками

Кроме этого, каждая строка дерева значений имеет свойства «Родитель» и «Строки».

Дерево значений на форме

Визуальное представление дерева значений обеспечивает элемент «Табличное поле».

Дерево значений на обычной форме Дерево значений на управляемой форме

Заполнение дерева значений

При заполнении дерева значений нужно помнить, что сам объект «ДеревоЗначений» и все его строки имеют свойство «Строки»и добавление новых строк на любом уровне дерева осуществляется через это свойство.

Сам же объект «ДеревоЗначений» имеет еще и свойство «Колонки», которое ничем не отличается от аналогичного свойства у таблицы значений.

Небольшой пример программного заполнения таблицы значений для управляемых форм:

Обход дерева значений

Обход всех строк дерева значений делается при помощи рекурсии, вот так будет выглядеть код для обхода дерева созданного в примере выше:

Как свернуть и развернуть дерево значений

Сворачивается и разворачивается дерево значений очень просто.

Привел три примера: для сворачивания текущей строки, для сворачивания строк верхнего уровня, для сворачивания вообще всех строк (рекурсия).

Два примера: для разворачивания текущей строки и для разворачивания всех строк. У метода «Развернуть» есть дополнительный параметр, который позволяет указать нужно ли разворачивать подчиненные строки.

Как удалить строку и очистить дерево значений

Тут опять же все просто, нужно помнить, что при удалении/очистке строки, все подчиненные строки удаляются.

Точно также можно очистить от подчиненных элементов другую другую строку.

Удалить строку дерева значений не сложнее — нужно только знать ее индекс:

Запрос и дерево значений

Результат выполнения запроса очень легко преобразовать в дерево значений, для этого нужно воспользоваться методом «Выгрузить» и указать параметр «ТипОбхода» отличным от того, что стоит по умолчанию, т.е. «ПоГруппировкам» или «ПоГруппировкамСИерархией».

Если на форме имеется реквизит «ДеревоЗначений» и связанный с ним визуальный элемент, то можно сделать примерно так:

Причем полного совпадения колонок и типов не требуется — лишние колонки будут просто отброшены, а колонки с различными типами будут заполнены пустыми значениями.

Читайте также:  Тропическое ореховое дерево 5 букв

Дерево значений в таблицу значений и обратно

Преобразовать дерево значений в таблицу значений и наоборот достаточно просто, ведь дерево значений это та же таблица значений, но с дополнительной колонкой — «Родитель». У меня есть отдельная статья о том как преобразовать дерево значений в таблицу значений и обратно.

Отбор в дереве значений

Стандартного отбора в дереве значений не предусмотрено. Так получилось потому, что непонятно как разрешать ситуацию, когда родительский элемент не удовлетворяет условию отбора, а подчиненные ему элементы удовлетворяют.

Таким образом, если Вам нужно реализовать отбор в дереве значений, то начать нужно с решения именно этой проблемы. А уже после этого можно придумать несколько способов реализовать задуманное.

Первый способ — накладывать отбор до вывода дерева значений (в запросе например). Это не классический отбор, но в тех случаях когда этот способ применим, то следует применять именно его, так как это почти всегда быстрее и правильнее чем что-либо другое.

Второй способ — перебор всех строк дерева значений. Описывать здесь особенно нечего, нужно просто взять обход дерева значений, проверять каждую строку на соответствие условию отбора и удалять лишние строки.

Еще один способ заключается в том, чтобы преобразовать дерево значений в таблицу значений, сделать отбор в таблице значений, проконтролировать результат (почистить «хвосты» — строки, родитель которых не удовлетворил условию отбора) и выполнить обратное преобразование в дерево значений.

На этом все, рассказал все, что знал, надеюсь мне удалось сэкономить Вам немного времени.

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

УжасноПлохоНеплохоХорошо Отлично(оценок: 36, средняя оценка: 4,64 из 5)

Источник

Оцените статью