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)

Источник

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