1с дерево значений нет узлов

Дерево значений верхний узел

Возможно ли реализовать дерево значений с несколькими верхними уровнями/верхними строками/главными узлами). Идея сводиться к тому, что необходимо во внешней обработке производить заполнение таб. частей нескольких документов(дети) и создание новых документов(верхний узел).

Если НЕ Результат = Неопределено Тогда
Если Элементы.ПереченьРаботУслугДерево.ТекущиеДанные<>Неопределено Тогда
Родитель=Элементы.ПереченьРаботУслугДерево.ТекущиеДанные.ПолучитьРодителя();
Иначе
Родитель=Родитель;
КонецЕсли;
Родитель=Неопределено;
Элементы.ПереченьРаботУслугДерево.ДобавитьСтроку();
Элементы.ПереченьРаботУслугДерево.ТекущийРодитель=Родитель;

что означает магическая фраза Родитель = Родитель; .

и загадочное Родитель=Неопределено;
.

&НаКлиенте
Процедура СоздатьРаздел(Команда)
СтруктураПараметров = Новый Структура;
Результат = ОткрытьФормуМодально(«Справочник.РаботыУслуги.ФормаВыбора», СтруктураПараметров);
Если НЕ Результат = Неопределено Тогда
Если Элементы.ПереченьРаботУслугДерево.ТекущиеДанные<>Неопределено Тогда
Родитель=Элементы.ПереченьРаботУслугДерево.ТекущиеДанные.ПолучитьРодителя();
Иначе
Родитель=Неопределено;
КонецЕсли;

Элементы.ПереченьРаботУслугДерево.ДобавитьСтроку();
Элементы.ПереченьРаботУслугДерево.ТекущийРодитель=Родитель;
Элементы.ПереченьРаботУслугДерево.ТекущиеДанные.РаботаУслуга=Результат;
Элементы.ПереченьРаботУслугДерево.ЗакончитьРедактированиеСтроки(Ложь);
Иначе
Возврат;
КонецЕсли;
КонецПроцедуры

(0) на клюшках забавные связанные между собой ТЗ реализовывал (сложная структура подчинённости) а тут такие возможности для творчества. в типовом ДЗ 1 элемент верхнего уровня, или смиритесь с необходимостью иметь этот всего 1 элемент на самом верхнем уровне или рисуйте сами

(18) Ну, в данном конкретном случае, в 1С — да.
Если рассуждать про сферические деревья в вакууме (или про те, что в саду) — то оно-то может быть, но мы же какбе одинэснеги тут 🙂

ТвоеДерево.Строки.Добавить(); повторять нужное количество раз

добейте моё гармоничное восприятие вселенной. скажите, что мир неприятно пахнет, все женщины легки на поведение, а солнце — просто газовый фонарь

Давайте по существу как добавить строку в дерево на форме без родителя то есть узел верхнего уровня, один узел верхнего уровня в дереве уже имеется.

Хорошо, я конечно понимаю, что краткость сестра таланта, но вопрос остается открытым как это реализовать тогда?

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

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

ТвоеДеревоЗначений = ЭлементыФормы.ТвоеДеревоНаФорме.Значение; // вроде как Значение .
ВерхниеСтроки = ТвоеДеревоЗначений.Строки;

//Процедура вычисления количества строк для определения ключа
&НаСервере
Функция ПолучитьКоличествоСтрокДерева(Дерево)
Количество=0;
Для А = 0 По Дерево.Строки.Количество()-1 Цикл
Количество=Количество+ПолучитьКоличествоСтрокДерева(Дерево.Строки[А]);
Количество=Количество+1;
КонецЦикла;
Возврат Количество;
КонецФункции

//Создание строки с определенным родителем и заполнение полей строки
&НаСервере
Процедура СоздатьСтрокуДереваНаСервере(Родитель,Элемент)
Дерево=РеквизитФормыВЗначение(«ПереченьРаботУслугДерево»);
СтрокаРодитель=Дерево.Строки.Найти(Родитель,»Ключ»,Истина);
НовыйКлюч=ПолучитьКоличествоСтрокДерева(Дерево)+1;
Если СтрокаРодитель=Неопределено Тогда
НоваяСтрока=Дерево.Строки.Добавить();
Иначе
НоваяСтрока=СтрокаРодитель.Строки.Добавить();
КонецЕсли;
НоваяСтрока.РаботаУслуга=Элемент;
НоваяСтрока.Ключ=НовыйКлюч;
ЗначениеВРеквизитФормы(Дерево,»ПереченьРаботУслугДерево»);
КонецПроцедуры

//Создадим раздел(Родителем будет выступать родитель выделенного элемента)
&НаКлиенте
Процедура СоздатьРаздел(Команда)
СтруктураПараметров = Новый Структура;
Результат = ОткрытьФормуМодально(«Справочник.РаботыУслуги.ФормаВыбора», СтруктураПараметров);
Если НЕ Результат = Неопределено Тогда
Если Элементы.ПереченьРаботУслугДерево.ТекущиеДанные<>Неопределено Тогда
Родитель=Элементы.ПереченьРаботУслугДерево.ТекущиеДанные.ПолучитьРодителя();
Если Родитель=Неопределено Тогда
Родитель=0;
Иначе
Родитель=Родитель.Ключ;
КонецЕсли;
Иначе
Родитель=0;
КонецЕсли;
СоздатьСтрокуДереваНаСервере(Родитель,Результат);
Элементы.ПереченьРаботУслугДерево.ЗакончитьРедактированиеСтроки(Ложь);
Иначе
Возврат;
КонецЕсли;
КонецПроцедуры

//Создадим подраздел(Родителем будт выступать выделенный элемент)
&НаКлиенте
Процедура СоздатьПодраздел(Команда)
Результат = ОткрытьФормуМодально(«Справочник.РаботыУслуги.ФормаВыбора»);
Если НЕ Результат = Неопределено Тогда
Если Элементы.ПереченьРаботУслугДерево.ТекущиеДанные<>Неопределено Тогда
Родитель=Элементы.ПереченьРаботУслугДерево.ТекущиеДанные.Ключ;
Иначе
Родитель=0;
КонецЕсли;
СоздатьСтрокуДереваНаСервере(Родитель,Результат);
Элементы.ПереченьРаботУслугДерево.ЗакончитьРедактированиеСтроки(Ложь);
Иначе
Возврат;
КонецЕсли;
КонецПроцедуры

//Процедура удаления
&НаСервере
Процедура УдалитьСтроку(Ключ)
Дерево=РеквизитФормыВЗначение(«ПереченьРаботУслугДерево»);
СтрокаУдаления=Дерево.Строки.Найти(Ключ,»Ключ»,Истина);
ПересчитатьКлючиРекурсия(Дерево,Ключ);
Если СтрокаУдаления.Родитель=неопределено Тогда
Дерево.Строки.Удалить(СтрокаУдаления);
Иначе
СтрокаУдаления.Родитель.Строки.Удалить(СтрокаУдаления);
КонецЕсли;
ЗначениеВРеквизитФормы(Дерево,»ПереченьРаботУслугДерево»);
КонецПроцедуры

//Перед удалением
&НаКлиенте
Процедура ПереченьРаботУслугДеревоПередУдалением(Элемент, Отказ)
Отказ=Ложь;
Если Элементы.ПереченьРаботУслугДерево.ТекущиеДанные<>Неопределено Тогда
УдалитьСтроку(Элементы.ПереченьРаботУслугДерево.ТекущиеДанные.Ключ);
Иначе
Возврат;
КонецЕсли;
КонецПроцедуры

Источник

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:  Пейзаж горы деревья река

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

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

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

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

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

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

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

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

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

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

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

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

Источник

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