Здравствуйте! Прошу помощи у форумчан. УТП 8.3
У меня есть табличная часть документа, в которую выгружаются задачи. У каждой задачи есть значение ID, а у подзадачи есть и ID Родителя, которое равно значению ID родительской задачи. Я бы хотел узнать, как сгруппировать подзадачи к их задачам?(Чтобы подзадачи немного сдвигались и было отличимы от задач)
Табличную часть я заполняю таким образом:

```1c
    Для ЭлементРезультата = 0 По Результат.result.tasks.Количество()-1 Цикл
    Если Результат.result.tasks[ЭлементРезультата].groupId = Контрагент.IDКлиентаВБитрикс Тогда
    НоваяСтрока = Расшифровка.Добавить();
    НоваяСтрока.Задание = Результат.result.tasks[ЭлементРезультата].title;
    НоваяСтрока.ID = Результат.result.tasks[ЭлементРезультата].ID;
    НоваяСтрока.IDРодителя = Результат.result.tasks[ЭлементРезультата].parentId;
    НоваяСтрока.Исполнитель = Результат.result.tasks[ЭлементРезультата].responsible.name;
    НоваяСтрока.КоличествоЧасов = Результат.result.tasks[ЭлементРезультата].timeSpentInLogs;
    НоваяСтрока.КоличествоЧасов = НоваяСтрока.КоличествоЧасов / 3600;
    НоваяСтрока.Цена = НоваяСтрока.КоличествоЧасов * ЦенаПолучить;
    КонецЕсли;
    КонецЦикла;
```
---
В табЧасти никак не сделаете, потому что там нельзя просто деревозначений сделать. По поводу дублей тут странно так как реквизит формы не должен влиять на печать никак...
По поводу группировки, да тут видать все таки сортировка не совсем так отрабатывает, лучше все таки через двойной перебор сделать, он подстроки не создал здесь;

```1c
    ТЧРасшифровка = ЭтотОбъект.Расшифровка.Выгрузить();
    Соответствие = Новый Соответствие;
    Для Каждого СтрокаРасшифровки Из ТЧРасшифровка Цикл

    Если НЕ ЗНачениеЗаполнено(СтрокаРасшифровки.IDРодителя) Тогда

    НоваяСтрока = РасшифровкаДерево.Строки.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаРасшифровки);
    Соответствие.Вставить(СтрокаРасшифровки.ID,НоваяСтрока);

    КонецЕсли;

    КонецЦикла;

    Для Каждого СтрокаРасшифровки Из ТЧРасшифровка Цикл

    Если ЗНачениеЗаполнено(СтрокаРасшифровки.IDРодителя) Тогда
    Если НЕ Соответствие.Получить(СтрокаРасшифровки.IDРодителя) = Неопределено ТОгда
    НоваяСтрока = Соответствие.Получить(СтрокаРасшифровки.IDРодителя).Строки.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаРасшифровки);
    Иначе
    НоваяСтрока = РасшифровкаДерево.Строки.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаРасшифровки);
    КонецЕсли;

    КонецЕсли;

    КонецЦикла;
```

Соответствие тут нужно для быстрого поиска родителей...
---
У меня есть табличная часть документа, в которую выгружаются задачи.
Выводи как ДеревоЗначений.
---
как это правильно сделать? Я ни разу с этим не сталкивался просто
---
Вот тут можно посмотреть подробнее.
---
```1c
    Если Результат.result.tasks[ЭлементРезультата].groupId = Контрагент.IDКлиентаВБитрикс Тогда
    НоваяСтрока = Расшифровка.Добавить();
    НоваяСтрока.Задание = Результат.result.tasks[ЭлементРезультата].title;
    НоваяСтрока.ID = Результат.result.tasks[ЭлементРезультата].ID;
    НоваяСтрока.IDРодителя = Результат.result.tasks[ЭлементРезультата].parentId;
    НоваяСтрока.Исполнитель = Результат.result.tasks[ЭлементРезультата].responsible.name;
    НоваяСтрока.КоличествоЧасов = Результат.result.tasks[ЭлементРезультата].timeSpentInLogs;
    НоваяСтрока.КоличествоЧасов = НоваяСтрока.КоличествоЧасов / 3600;
    НоваяСтрока.Цена = НоваяСтрока.КоличествоЧасов * ЦенаПолучить;
    КонецЕсли
```
;

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

```1c
    СоответствиеРодителей = Новый Соответствие;
    Индекс = 0;
    Для ЭлементРезультата = 0 По Результат.result.tasks.Количество()-1 Цикл
    Если Результат.result.tasks[ЭлементРезультата].groupId = Контрагент.IDКлиентаВБитрикс Тогда
    Если НЕ ЗначениеЗаполнено(Результат.result.tasks[ЭлементРезультата].parentId) Тогда

    НоваяСтрока = Расшифровка.ПолучитьЭлементы().Добавить();
    НоваяСтрока.Задание = Результат.result.tasks[ЭлементРезультата].title;
    НоваяСтрока.ID = Результат.result.tasks[ЭлементРезультата].ID;
    //НоваяСтрока.IDРодителя = Результат.result.tasks[ЭлементРезультата].parentId;
    НоваяСтрока.Исполнитель = Результат.result.tasks[ЭлементРезультата].responsible.name;
    НоваяСтрока.КоличествоЧасов = Результат.result.tasks[ЭлементРезультата].timeSpentInLogs;
    НоваяСтрока.КоличествоЧасов = НоваяСтрока.КоличествоЧасов / 3600;
    НоваяСтрока.Цена = НоваяСтрока.КоличествоЧасов * ЦенаПолучить;
    СоответствиеРодителей.Вставить(НоваяСтрока.ID,Индекс);
    Индекс = Индекс + 1;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;

    Для ЭлементРезультата = 0 По Результат.result.tasks.Количество()-1 Цикл
    Если Результат.result.tasks[ЭлементРезультата].groupId = Контрагент.IDКлиентаВБитрикс Тогда
    Если ЗначениеЗаполнено(Результат.result.tasks[ЭлементРезультата].parentId) Тогда
    ИндексСтроки = СоответствиеРодителей.Получить(Результат.result.tasks[ЭлементРезультата].parentId);
    Если НЕ ИндексСтроки = Неопределено Тогда
    НоваяСтрока = Расшифровка.ПолучитьЭлементы().Получить(ИндексСтроки).ПолучитьЭлементы().Добавить();
    Иначе
    НоваяСтрока = Расшифровка.ПолучитьЭлементы().Добавить();
    КонецЕсли;
    НоваяСтрока.Задание = Результат.result.tasks[ЭлементРезультата].title;
    НоваяСтрока.ID = Результат.result.tasks[ЭлементРезультата].ID;
    НоваяСтрока.IDРодителя = Результат.result.tasks[ЭлементРезультата].parentId;
    НоваяСтрока.Исполнитель = Результат.result.tasks[ЭлементРезультата].responsible.name;
    НоваяСтрока.КоличествоЧасов = Результат.result.tasks[ЭлементРезультата].timeSpentInLogs;
    НоваяСтрока.КоличествоЧасов = НоваяСтрока.КоличествоЧасов / 3600;
    НоваяСтрока.Цена = НоваяСтрока.КоличествоЧасов * ЦенаПолучить;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
```

ТаблицаФормы должна быть с типом ДеревоЗначений
---
а если эта процедура у меня находится в модуле документа, то удастся обратиться к дереву значений с модуля?
---
а если эта процедура у меня находится в

Если в модуле объекта, тогда у вас там ДеревоЗначений будет уже, и работать надо с деревом значений
Все примерно также, только вместо
```1c
    ПолучитьЭлементы()
```
 будет
```1c
    Строки
```

т.е.
```1c
    НоваяСтрока = Расшифровка.Строки.Добавить()
```
;

```1c
    НоваяСтрока = Расшифровка.Строки.Получить(ИндексСтроки).Строки.Добавить();
```
---
простите, я слишком глуп чтобы сразу всё понять...

На данный момент я заполнял Табличное поле "Расшифровка", которое берет данные с Табличной части "Расшифровка". Заполняется при нажатии на кнопку и вызывает процедуру с модуля объекта

Чтобы сделать так, как вы сказали, то мне надо удалить эту табличную часть "Расшифровка" и вместо неё на форму добавить ДеревоЗначений?
Я пробовал вместо табличного поля создать дерево значений РасшифровкаДерево, но когда к нему пытаюсь обратиться с модуля объекта, то пишет, что Переменная не определена
Простите за глупые вопросы, просто хочу понять как это правильно делается
---
сделал так, но вывело в таком случае только основные задачи, подзадачи не показывает
---
самое простое добавляй в для подзадачи в поле таблицы "задание" впереди пробелы, получится типа такое
Группа заданий 1
__Задание1
__ Задание2
Группа заданий 2
__Задание3
__Задание4
Добавил вместо пробелов подчеркивание. а то месседж съедает пробелы
---
Доброе утро. Я бы реализовал так. Обработку табличной части, я бы оставил как есть, не важно в модуле объекта или в модуле формы. Далее в самой форме добавил реквизит формы, например "РасшифровкаДерево" (тип ДеревоЗначений), вывел бы его в Элементы, затем бы делал формирование дерева по ТЧ "Расшифровка".
---
Доброе утро. И я бы не хотел удалять табличную часть и менять её на дерево значений, ибо потом с этого и печать придется переделывать и много чего слетит.(так как вы и написали)
 Реквизит "РасшифровкаДерево" я добавил в реквизиты формы, дальнейшие действия не очень понял)
прошу пожалуйста чуточку объяснить, очень бы хотел чтобы вышло сделать. Это обычные формы
---
, дальнейшие действия не очень понял

ПриСозданииНаСервере, заполняйте этот реквизит из вашей табличнойЧасти, по первому методу

Типа такого

```1c
    ТЧРасшифровка = Объект.Расшифровка.Выгрузить();
    ТЧРасшифровка.Сортировать("IDРодителя,ID");
    Родитель = Неопределено;
    Для Каждого СтрокаРасшифровки Из ТЧРасшифровка Цикл

    Если НЕ ЗНачениеЗаполнено(СтрокаРасшифровки.IDРодителя) ИЛИ Родитель <> СтрокаРасшифровки.IDРодителя Тогда

    НоваяСтрока = РасшифровкаДерево.ПолучитьЭлементы().Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаРасшифровки);
    Если НЕ ЗНачениеЗаполнено(СтрокаРасшифровки.IDРодителя) Тогда
    Родитель = СтрокаРасшифровки.ID
    Иначе
    Родитель = СтрокаРасшифровки.IDРодителя;
    КонецЕсли;
    Иначе
    НовПодстрока = НоваяСтрока.ПолучитьЭлементы().Добавить();
    ЗаполнитьЗначенияСвойств(НовПодстрока ,СтрокаРасшифровки);
    КонецЕсли;

    КонецЦикла;
```

Тут попытка все в один цикл запихать, по идее должно сработать так как у нас отсортировано все как надо
---
ПриСозданииНаСервере это в Событиях должно быть?
---
Да ток это в событиях формы, а кстати у вас формы управляемые ? или обычные ?
---
обычные, я в теме забыл указать, только в 12 сообщении. Спасибо вам за терпение)
---
Там тогда при открытииформы надо делать, и работать как с ДеревомЗначений...т.е. через строки..
---
Я не уверен, что подойдет ПриОткрытии. Ибо по умолчанию этот табличная часть у документов не заполнена, она заполняется при нажатии на кнопку "Заполнить ТЧ" и собственно выгружает эти задачи. Я сделал, кажется, так как вы сказали. В Процедуру ПриОкрытии вставил этот фрагмент кода, но ничего не происходит:

```1c
    ТЧРасшифровка = ЭтотОбъект.Расшифровка.Выгрузить();
    ТЧРасшифровка.Сортировать("IDРодителя,ID");
    Родитель = Неопределено;
    Для Каждого СтрокаРасшифровки Из ТЧРасшифровка Цикл

    Если НЕ ЗНачениеЗаполнено(СтрокаРасшифровки.IDРодителя) ИЛИ Родитель <> СтрокаРасшифровки.IDРодителя Тогда

    НоваяСтрока = РасшифровкаДерево.Строки.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаРасшифровки);
    Если НЕ ЗНачениеЗаполнено(СтрокаРасшифровки.IDРодителя) Тогда
    Родитель = СтрокаРасшифровки.ID
    Иначе
    Родитель = СтрокаРасшифровки.IDРодителя;
    КонецЕсли;
    Иначе
    НовПодстрока = НоваяСтрока.Строки.Добавить();
    ЗаполнитьЗначенияСвойств(НовПодстрока ,СтрокаРасшифровки);
    КонецЕсли;

    КонецЦикла;
```
---
"
И не покажет у вас Элемент связан с таб частью заказа клиента,а не с реквизитом формы "РасшифровкаДерево".
Вам бы немного мат часть подтянуть ..просто этак я долго объяснять буду, я в принципе почему сказал что приоткрытии это делать, по умолчанию при записи документа у вас должна сохраниться эта табличная часть "Расшифровка", и что бы при открытии в следующий раз документа заполнять реквизит формы, который не сохраняется в отличие от табличной части документа..., в вашем случае при нажатии на кнопку заполнить расшифровку, после того как заполните табличную часть "Расшифровка", надо еще заполнить "РасшифровкаДерево", и элемент связать с этим реквизитом...
---
кажется я понял. Попытаюсь это реализовать как-то
То есть мне надо данные табличного поля заменить чтобы вместо табличной части "Расшифровка" отображался этот реаквизит РасшифровкаДерево?

Спасибо
---
я слабоват ещё для такой задачи..
---
а нет, шеф, вывело :)
Я очень рад, правда теперь новые вопросы с этого вылезли. Эта группировка не очень соблюдается
---
В табЧасти никак не сделаете, потому что там нельзя просто деревозначений сделать. По поводу дублей тут странно так как реквизит формы не должен влиять на печать никак...
По поводу группировки, да тут видать все таки сортировка не совсем так отрабатывает, лучше все таки через двойной перебор сделать, он подстроки не создал здесь;

```1c
    ТЧРасшифровка = ЭтотОбъект.Расшифровка.Выгрузить();
    Соответствие = Новый Соответствие;
    Для Каждого СтрокаРасшифровки Из ТЧРасшифровка Цикл

    Если НЕ ЗНачениеЗаполнено(СтрокаРасшифровки.IDРодителя) Тогда

    НоваяСтрока = РасшифровкаДерево.Строки.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаРасшифровки);
    Соответствие.Вставить(СтрокаРасшифровки.ID,НоваяСтрока);

    КонецЕсли;

    КонецЦикла;

    Для Каждого СтрокаРасшифровки Из ТЧРасшифровка Цикл

    Если ЗНачениеЗаполнено(СтрокаРасшифровки.IDРодителя) Тогда
    Если НЕ Соответствие.Получить(СтрокаРасшифровки.IDРодителя) = Неопределено ТОгда
    НоваяСтрока = Соответствие.Получить(СтрокаРасшифровки.IDРодителя).Строки.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаРасшифровки);
    Иначе
    НоваяСтрока = РасшифровкаДерево.Строки.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаРасшифровки);
    КонецЕсли;

    КонецЕсли;

    КонецЦикла;
```

Соответствие тут нужно для быстрого поиска родителей...
---
тут ругается
{Документ.ЗаказПокупателя.Форма.ФормаДокумента.Форма(739)}: Преобразование значения к типу Булево не может быть выполнено
             Если Соответствие.Получить(СтрокаРасшифровки.IDРодителя) ТОгда
---
Поправил(изменения смотрите, там просто не булево а неопределено, без редактора кода сложновато писать
---
вроде свернуло группировку. А как делается это "разворачивание"? Или есть вариант как-то это со смещением сделать, для визуального вида просто?

Я поражаюсь как вы всё это в голове держите, я уже кучу страниц форума перерыл и не мог понять как это сделать, а вы слёту сообразили)
---
Там в свойствах элемента формы должно быть что то типа этого "Начальное Отображение Дерева" Надо поставить расрывать и где то на обычных формах указывается на какой колонке должны быть полюсики для раскрытия..дааавно с ними не работал..
, так же у элемента есть метод развернуть(), можно и программно это сделать..
---
щас буду щупать как это реализовать, чтобы плюсик был этот
Спасибо вам огромное, вы очень крутой)
---
Я вы хотел уточнить чисто, что это изменяется в НачальноеОтображениеДерева.
Но есть возможность визуально чтобы можно отличить подзадачу от задачи? Или они только так могут выглядетЬ?
---
НачальноеОтображениеДерев
Не они должны сдвигаться подстроки, и на главных строках должен быть виден или плюс или минус
---
просто ПриОткрытии это немного странно работает. У меня из-за этого дерева и печать дублировать начала, но не суть
А есть какой-то может вариант эту визуальную группировку в табличной части сделать? Может вы знаете варианты, а то я не до конца понимаю как это можно сделать