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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(оценок: 36, средняя оценка: 4,64 из 5)

Источник

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