Группировка табличной части документа

1. Tailor_Made 16.10.19 16:56 Сейчас в теме
Здравствуйте! Прошу помощи у форумчан. УТП 8.3
У меня есть табличная часть документа, в которую выгружаются задачи. У каждой задачи есть значение ID, а у подзадачи есть и ID Родителя, которое равно значению ID родительской задачи. Я бы хотел узнать, как сгруппировать подзадачи к их задачам?(Чтобы подзадачи немного сдвигались и было отличимы от задач)
Табличную часть я заполняю таким образом:
Для  ЭлементРезультата = 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;
			НоваяСтрока.Цена 									= НоваяСтрока.КоличествоЧасов * ЦенаПолучить;
		КонецЕсли;
	КонецЦикла;
Показать
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
24. bmk74 234 17.10.19 18:58 Сейчас в теме +0.2 $m
(22) В табЧасти никак не сделаете, потому что там нельзя просто деревозначений сделать. По поводу дублей тут странно так как реквизит формы не должен влиять на печать никак...
По поводу группировки, да тут видать все таки сортировка не совсем так отрабатывает, лучше все таки через двойной перебор сделать, он подстроки не создал здесь;

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

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


Соответствие тут нужно для быстрого поиска родителей...
Tailor_Made; +1 Ответить
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
3. wertep 23 16.10.19 17:25 Сейчас в теме
(1)
У меня есть табличная часть документа, в которую выгружаются задачи.

Выводи как ДеревоЗначений.
4. Tailor_Made 16.10.19 17:26 Сейчас в теме
(3)как это правильно сделать? Я ни разу с этим не сталкивался просто
6. bmk74 234 16.10.19 18:32 Сейчас в теме
(1)
 Если  Результат.result.tasks[ЭлементРезультата].groupId = Контрагент.IDКлиентаВБитрикс Тогда 
            НоваяСтрока = Расшифровка.Добавить();
            НоваяСтрока.Задание                                 = Результат.result.tasks[ЭлементРезультата].title;
            НоваяСтрока.ID                                         = Результат.result.tasks[ЭлементРезультата].ID;
            НоваяСтрока.IDРодителя                                 = Результат.result.tasks[ЭлементРезультата].parentId;
            НоваяСтрока.Исполнитель                             = Результат.result.tasks[ЭлементРезультата].responsible.name;
            НоваяСтрока.КоличествоЧасов                         = Результат.result.tasks[ЭлементРезультата].timeSpentInLogs;
            НоваяСтрока.КоличествоЧасов                         = НоваяСтрока.КоличествоЧасов / 3600;
            НоваяСтрока.Цена                                     = НоваяСтрока.КоличествоЧасов * ЦенаПолучить;
        КонецЕсли
Показать
;


Ну так как у вас тут нет иерархии то придется два раза переборку делать, что бы сначала вывести строки родителей а уже потом в данные строки добавлять детей
ну как то так
СоответствиеРодителей = Новый Соответствие;
Индекс = 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;
               НоваяСтрока.Цена                                     = НоваяСтрока.КоличествоЧасов * ЦенаПолучить;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
Показать


ТаблицаФормы должна быть с типом ДеревоЗначений
Tailor_Made; +1 Ответить
7. Tailor_Made 16.10.19 19:12 Сейчас в теме
(6) а если эта процедура у меня находится в модуле документа, то удастся обратиться к дереву значений с модуля?
8. bmk74 234 16.10.19 19:18 Сейчас в теме
(7)
а если эта процедура у меня находится в


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

т.е.
 НоваяСтрока = Расшифровка.Строки.Добавить()
;
НоваяСтрока = Расшифровка.Строки.Получить(ИндексСтроки).Строки.Добавить();
9. Tailor_Made 16.10.19 19:31 Сейчас в теме
(8)
простите, я слишком глуп чтобы сразу всё понять...

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

Чтобы сделать так, как вы сказали, то мне надо удалить эту табличную часть "Расшифровка" и вместо неё на форму добавить ДеревоЗначений?
Я пробовал вместо табличного поля создать дерево значений РасшифровкаДерево, но когда к нему пытаюсь обратиться с модуля объекта, то пишет, что Переменная не определена
Простите за глупые вопросы, просто хочу понять как это правильно делается
Прикрепленные файлы:
10. Tailor_Made 16.10.19 20:42 Сейчас в теме
(6)сделал так, но вывело в таком случае только основные задачи, подзадачи не показывает
2. user598323_svdok 2 16.10.19 17:10 Сейчас в теме
самое простое добавляй в для подзадачи в поле таблицы "задание" впереди пробелы, получится типа такое
Группа заданий 1
__Задание1
__ Задание2
Группа заданий 2
__Задание3
__Задание4
Добавил вместо пробелов подчеркивание. а то месседж съедает пробелы
11. magvay_k 63 17.10.19 09:54 Сейчас в теме
Доброе утро. Я бы реализовал так. Обработку табличной части, я бы оставил как есть, не важно в модуле объекта или в модуле формы. Далее в самой форме добавил реквизит формы, например "РасшифровкаДерево" (тип ДеревоЗначений), вывел бы его в Элементы, затем бы делал формирование дерева по ТЧ "Расшифровка".
12. Tailor_Made 17.10.19 10:01 Сейчас в теме
(11) Доброе утро. И я бы не хотел удалять табличную часть и менять её на дерево значений, ибо потом с этого и печать придется переделывать и много чего слетит.(так как вы и написали)
Реквизит "РасшифровкаДерево" я добавил в реквизиты формы, дальнейшие действия не очень понял)
прошу пожалуйста чуточку объяснить, очень бы хотел чтобы вышло сделать. Это обычные формы
13. bmk74 234 17.10.19 11:27 Сейчас в теме
(12)
, дальнейшие действия не очень понял


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

Типа такого
ТЧРасшифровка = Объект.Расшифровка.Выгрузить();
ТЧРасшифровка.Сортировать("IDРодителя,ID");
 Родитель = Неопределено;
Для  Каждого СтрокаРасшифровки Из ТЧРасшифровка Цикл
        
       Если  НЕ ЗНачениеЗаполнено(СтрокаРасшифровки.IDРодителя) ИЛИ  Родитель <> СтрокаРасшифровки.IDРодителя Тогда
                    
                НоваяСтрока = РасшифровкаДерево.ПолучитьЭлементы().Добавить();
                ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаРасшифровки);
                Если НЕ ЗНачениеЗаполнено(СтрокаРасшифровки.IDРодителя) Тогда
                          Родитель = СтрокаРасшифровки.ID
                 Иначе 
                          Родитель = СтрокаРасшифровки.IDРодителя;
                 КонецЕсли;
     Иначе
               НовПодстрока = НоваяСтрока.ПолучитьЭлементы().Добавить();
               ЗаполнитьЗначенияСвойств(НовПодстрока ,СтрокаРасшифровки);
     КонецЕсли;
 
КонецЦикла;
Показать


Тут попытка все в один цикл запихать, по идее должно сработать так как у нас отсортировано все как надо
magvay_k; Tailor_Made; +2 Ответить
14. Tailor_Made 17.10.19 11:45 Сейчас в теме
(13) ПриСозданииНаСервере это в Событиях должно быть?
Прикрепленные файлы:
15. bmk74 234 17.10.19 11:48 Сейчас в теме
(14) Да ток это в событиях формы, а кстати у вас формы управляемые ? или обычные ?
16. Tailor_Made 17.10.19 11:50 Сейчас в теме
(15)обычные, я в теме забыл указать, только в 12 сообщении. Спасибо вам за терпение)
17. bmk74 234 17.10.19 12:41 Сейчас в теме
Там тогда при открытииформы надо делать, и работать как с ДеревомЗначений...т.е. через строки..
Tailor_Made; +1 Ответить
18. Tailor_Made 17.10.19 12:53 Сейчас в теме
(17)
Я не уверен, что подойдет ПриОткрытии. Ибо по умолчанию этот табличная часть у документов не заполнена, она заполняется при нажатии на кнопку "Заполнить ТЧ" и собственно выгружает эти задачи. Я сделал, кажется, так как вы сказали. В Процедуру ПриОкрытии вставил этот фрагмент кода, но ничего не происходит:
ТЧРасшифровка = ЭтотОбъект.Расшифровка.Выгрузить();
	ТЧРасшифровка.Сортировать("IDРодителя,ID");
	Родитель = Неопределено;
	Для  Каждого СтрокаРасшифровки Из ТЧРасшифровка Цикл
	        
	       Если  НЕ ЗНачениеЗаполнено(СтрокаРасшифровки.IDРодителя) ИЛИ  Родитель <> СтрокаРасшифровки.IDРодителя Тогда
	                    
	                НоваяСтрока = РасшифровкаДерево.Строки.Добавить();
	                ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаРасшифровки);
	                Если НЕ ЗНачениеЗаполнено(СтрокаРасшифровки.IDРодителя) Тогда
	                          Родитель = СтрокаРасшифровки.ID
	                 Иначе 
	                          Родитель = СтрокаРасшифровки.IDРодителя;
	                 КонецЕсли;
	     Иначе
	               НовПодстрока = НоваяСтрока.Строки.Добавить();
	               ЗаполнитьЗначенияСвойств(НовПодстрока ,СтрокаРасшифровки);
	     КонецЕсли;
	 
	КонецЦикла;
Показать
Прикрепленные файлы:
19. bmk74 234 17.10.19 17:05 Сейчас в теме
(18)"
И не покажет у вас Элемент связан с таб частью заказа клиента,а не с реквизитом формы "РасшифровкаДерево".
Вам бы немного мат часть подтянуть ..просто этак я долго объяснять буду, я в принципе почему сказал что приоткрытии это делать, по умолчанию при записи документа у вас должна сохраниться эта табличная часть "Расшифровка", и что бы при открытии в следующий раз документа заполнять реквизит формы, который не сохраняется в отличие от табличной части документа..., в вашем случае при нажатии на кнопку заполнить расшифровку, после того как заполните табличную часть "Расшифровка", надо еще заполнить "РасшифровкаДерево", и элемент связать с этим реквизитом...
20. Tailor_Made 17.10.19 18:01 Сейчас в теме
(19)кажется я понял. Попытаюсь это реализовать как-то
То есть мне надо данные табличного поля заменить чтобы вместо табличной части "Расшифровка" отображался этот реаквизит РасшифровкаДерево?

Спасибо
21. Tailor_Made 17.10.19 18:07 Сейчас в теме
(19)я слабоват ещё для такой задачи..
22. Tailor_Made 17.10.19 18:11 Сейчас в теме
(19)а нет, шеф, вывело :)
Я очень рад, правда теперь новые вопросы с этого вылезли. Эта группировка не очень соблюдается
Прикрепленные файлы:
24. bmk74 234 17.10.19 18:58 Сейчас в теме +0.2 $m
(22) В табЧасти никак не сделаете, потому что там нельзя просто деревозначений сделать. По поводу дублей тут странно так как реквизит формы не должен влиять на печать никак...
По поводу группировки, да тут видать все таки сортировка не совсем так отрабатывает, лучше все таки через двойной перебор сделать, он подстроки не создал здесь;

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

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


Соответствие тут нужно для быстрого поиска родителей...
Tailor_Made; +1 Ответить
25. Tailor_Made 17.10.19 19:02 Сейчас в теме
(24) тут ругается
{Документ.ЗаказПокупателя.Форма.ФормаДокумента.Форма(739)}: Преобразование значения к типу Булево не может быть выполнено
Если Соответствие.Получить(СтрокаРасшифровки.IDРодителя) ТОгда
26. bmk74 234 17.10.19 19:03 Сейчас в теме
(25) Поправил(изменения смотрите, там просто не булево а неопределено, без редактора кода сложновато писать
27. Tailor_Made 17.10.19 19:06 Сейчас в теме
(26)вроде свернуло группировку. А как делается это "разворачивание"? Или есть вариант как-то это со смещением сделать, для визуального вида просто?

Я поражаюсь как вы всё это в голове держите, я уже кучу страниц форума перерыл и не мог понять как это сделать, а вы слёту сообразили)
Прикрепленные файлы:
29. bmk74 234 17.10.19 19:14 Сейчас в теме +0.27 $m
(27) Там в свойствах элемента формы должно быть что то типа этого "Начальное Отображение Дерева" Надо поставить расрывать и где то на обычных формах указывается на какой колонке должны быть полюсики для раскрытия..дааавно с ними не работал..
, так же у элемента есть метод развернуть(), можно и программно это сделать..
31. Tailor_Made 17.10.19 19:44 Сейчас в теме
(29)щас буду щупать как это реализовать, чтобы плюсик был этот
Спасибо вам огромное, вы очень крутой)
28. Tailor_Made 17.10.19 19:13 Сейчас в теме
(26)Я вы хотел уточнить чисто, что это изменяется в НачальноеОтображениеДерева.
Но есть возможность визуально чтобы можно отличить подзадачу от задачи? Или они только так могут выглядетЬ?
30. bmk74 234 17.10.19 19:20 Сейчас в теме
(28)
НачальноеОтображениеДерев

Не они должны сдвигаться подстроки, и на главных строках должен быть виден или плюс или минус
23. Tailor_Made 17.10.19 18:24 Сейчас в теме
(19)просто ПриОткрытии это немного странно работает. У меня из-за этого дерева и печать дублировать начала, но не суть
А есть какой-то может вариант эту визуальную группировку в табличной части сделать? Может вы знаете варианты, а то я не до конца понимаю как это можно сделать
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)