- Дерево значений на форме
- Работа с деревом значений в 1С
- Дерево значений
- Дерево значений на форме
- Заполнение дерева значений
- Обход дерева значений
- Как свернуть и развернуть дерево значений
- Как удалить строку и очистить дерево значений
- Запрос и дерево значений
- Дерево значений в таблицу значений и обратно
- Отбор в дереве значений
Дерево значений на форме
Как получить текущий элемент в дереве значений и обращаясь к нему добавить подчиненную группу? Но у меня группа добавляется только в корень дерева.
ДеревоОбъектов на форме обработки
КорневыеЭлементы = ДеревоОбъектов.ПолучитьЭлементы(); НовыйКорневойЭлемент = КорневыеЭлементы.Добавить(); ДочерныеЭлементыНовогоКорневого = НовыйКорневойЭлемент.ПолучитьЭлементы(); НовыйВложенныйЭлемент = ДочерныеЭлементыНовогоКорневого.Добавить(); НовыйВложенныйЭлемент.Код = ЛистЭксель.Cells(Строка, 1).value; НовыйВложенныйЭлемент.Наименование = ЛистЭксель.Cells(Строка, 2).value; НовыйВложенныйЭлемент.ЭтоГруппа = Истина;
Элементы.дерево.текущаястрока — это идентификатор. Дерево.найти по идентификатор(текстрока).
ПолучитьЭлементы().добавить() — это добавить элемент с текущей строкой в качестве родителя.
Элементы.дерево.текущаястрока — это идентификатор. Дерево.найти по идентификатор(текстрока).
ПолучитьЭлементы().добавить() — это добавить элемент с текущей строкой в качестве родителя.
через текущую строку не получается, она не определена, получается обратиться только по индексу Элемент1 = ДеревоОбъектов.ПолучитьЭлементы()[0].ПолучитьЭлементы(); но только это не правильно, мне нужно каждый раз получать следующий элемент
(4)
(5) ну Вы же пишите, что «текущий элемент» хотите «обработать», а как Вы узнаете, какой из элементов «Текущий»? Если у Вас в «ТекущаяСтрока» «неопределено», то это значит, что нет у Вас «текущего элемента» — печалька.
Для работы с деревом значений в управляемых формах подход такой: само дерево значений как реквизит формы, может быть обработано как обычное дерево значений с той разницей, что подчиненные строки не из ЭлементДерева.Строка доступны, а из «ЭлементДерева.ПолучитьЭлементы()», а вот выделенные строки, текущая строка, на которой пользователь жамкнул и прочее — это все в Элементы.Дерево.ТекущаяСтрка/ВыделенныеСтроки. И последние содержат либо идентификатор строки, который уже в реквизите ищется через «ПолучитьПоИдентификатору(Идентификатор)», а если в текущей строке «неопределено», а в выделенных строках — пустой массив, то это говорит о том, что пользователь на элемент дерева не жамкнул. И в этом случае что=то добавлять следует, полагаю, в корень (т.е. Дерево.ПолучитьЭлементы().Добавить», а не «Дерево.ПолучитьПоИдентификатору(ТекСтрока).ПолучитьЭлементы().Добавить()» — вот и вся суть всей разницы.
Источник
Работа с деревом значений в 1С
В последнее время аномально часто мне в работе попадалось дерево значений, поэтому решил написать на эту тему статью.
Попробую рассмотреть способы решения основных задач связанных с деревом значений, при этом постараюсь писать «без воды».
Дерево значений
Из названия объекта понятно, что дерево значений служит для хранения/отображения какой-либо иерархической информации. Каждая строка дерева значений может иметь какое-то количество подчиненных строк, при этом такие операции как поиск, сортировка, подсчет итогов можно проводит с учетом уровня иерархии и подчиненных строк.
Кроме этого, каждая строка дерева значений имеет свойства «Родитель» и «Строки».
Дерево значений на форме
Визуальное представление дерева значений обеспечивает элемент «Табличное поле».
Заполнение дерева значений
При заполнении дерева значений нужно помнить, что сам объект «ДеревоЗначений» и все его строки имеют свойство «Строки»и добавление новых строк на любом уровне дерева осуществляется через это свойство.
Сам же объект «ДеревоЗначений» имеет еще и свойство «Колонки», которое ничем не отличается от аналогичного свойства у таблицы значений.
Небольшой пример программного заполнения таблицы значений для управляемых форм:
Обход дерева значений
Обход всех строк дерева значений делается при помощи рекурсии, вот так будет выглядеть код для обхода дерева созданного в примере выше:
Как свернуть и развернуть дерево значений
Сворачивается и разворачивается дерево значений очень просто.
Привел три примера: для сворачивания текущей строки, для сворачивания строк верхнего уровня, для сворачивания вообще всех строк (рекурсия).
Два примера: для разворачивания текущей строки и для разворачивания всех строк. У метода «Развернуть» есть дополнительный параметр, который позволяет указать нужно ли разворачивать подчиненные строки.
Как удалить строку и очистить дерево значений
Тут опять же все просто, нужно помнить, что при удалении/очистке строки, все подчиненные строки удаляются.
Точно также можно очистить от подчиненных элементов другую другую строку.
Удалить строку дерева значений не сложнее — нужно только знать ее индекс:
Запрос и дерево значений
Результат выполнения запроса очень легко преобразовать в дерево значений, для этого нужно воспользоваться методом «Выгрузить» и указать параметр «ТипОбхода» отличным от того, что стоит по умолчанию, т.е. «ПоГруппировкам» или «ПоГруппировкамСИерархией».
Если на форме имеется реквизит «ДеревоЗначений» и связанный с ним визуальный элемент, то можно сделать примерно так:
Причем полного совпадения колонок и типов не требуется — лишние колонки будут просто отброшены, а колонки с различными типами будут заполнены пустыми значениями.
Дерево значений в таблицу значений и обратно
Преобразовать дерево значений в таблицу значений и наоборот достаточно просто, ведь дерево значений это та же таблица значений, но с дополнительной колонкой — «Родитель». У меня есть отдельная статья о том как преобразовать дерево значений в таблицу значений и обратно.
Отбор в дереве значений
Стандартного отбора в дереве значений не предусмотрено. Так получилось потому, что непонятно как разрешать ситуацию, когда родительский элемент не удовлетворяет условию отбора, а подчиненные ему элементы удовлетворяют.
Таким образом, если Вам нужно реализовать отбор в дереве значений, то начать нужно с решения именно этой проблемы. А уже после этого можно придумать несколько способов реализовать задуманное.
Первый способ — накладывать отбор до вывода дерева значений (в запросе например). Это не классический отбор, но в тех случаях когда этот способ применим, то следует применять именно его, так как это почти всегда быстрее и правильнее чем что-либо другое.
Второй способ — перебор всех строк дерева значений. Описывать здесь особенно нечего, нужно просто взять обход дерева значений, проверять каждую строку на соответствие условию отбора и удалять лишние строки.
Еще один способ заключается в том, чтобы преобразовать дерево значений в таблицу значений, сделать отбор в таблице значений, проконтролировать результат (почистить «хвосты» — строки, родитель которых не удовлетворил условию отбора) и выполнить обратное преобразование в дерево значений.
На этом все, рассказал все, что знал, надеюсь мне удалось сэкономить Вам немного времени.
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
(оценок: 36, средняя оценка: 4,64 из 5)
Источник