Вывод дерева в табличный документ СКД

0. 4107 08.07.20 21:52 Сейчас в теме
Вывод содержимого элемента формы "ДанныеФормыДерево" в табличный документ средствами СКД.

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. dkoder 4 09.07.20 10:31 Сейчас в теме
Отличная работа! Только на больших деревьях лучше делать псевдо рекурсию внутри процедуры, особенно, когда рекурсивно вызываются запросы. Производительность возрастает до порядка

Псевдо рекурсия делается, примерно, так
Процедура ВнутренняяРекурсия(Дерево)
                МассивСтрок = Новый Массив;
                Для Каждого СтрДерева Из Дерево.Строки Цикл
                               МассивСтрок.Добавить(СтрДерева);
                КонецЦикла;

                Пока МассивСтрок.Количество() > 0 Цикл
                               // тут можно вызвать общий запрос для всего уровня дерева... 

                               МассивСтрокНовый = Новый Массив;
                               Для Каждого СтрДерева Из МассивСтрок Цикл
                                               // обработка данных элемента дерева ....

                                               // Тут делаем псевдо рекурсию
                                               Для Каждого СтрДереваНовый Из СтрДерева.Строки Цикл
                                                               МассивСтрокНовый.Добавить(СтрДереваНовый);
                                               КонецЦикла;
                               КонецЦикла;

                               МассивСтрок = Новый Массив;
                               Для Каждого СтрДерева Из МассивСтрокНовый Цикл
                                               МассивСтрок.Добавить(СтрДерева);
                               КонецЦикла;
                КонецЦикла;
КонецПроцедуры 
Показать
3. Yashazz 4107 09.07.20 12:58 Сейчас в теме
(1) да знаю) можно ещё всяко циклом поизвращаться.
2. Yashazz 4107 09.07.20 12:57 Сейчас в теме
Ахтунг! Замечена недоработка: если в дереве как в элементе формы есть группы колонок, то лажа, т.к. внутрь этих групп не заходит и колонки не добавляет. Допилю - обновлю.
4. Yashazz 4107 14.07.20 09:09 Сейчас в теме
Сделал всё-таки без рекурсии. Заодно допилил вывод групп колонок, вывод реквизитов, ещё кое-что по мелочи.
5. mihanov 9 23.10.20 10:44 Сейчас в теме
Обнаружилась проблемка:
Не учтен случай когда в отборах "условного оформления" формы есть группы условий (И/ИЛИ...).
6. Yashazz 4107 23.10.20 11:39 Сейчас в теме
(5) А у меня это вроде учтено в более поздних доработках. Возможно, себе допилил, а сюда не выложил... Посмотрю.
7. mity1982 24.11.20 02:34 Сейчас в теме
Обход дерева без рекурсии:
Надо понимать что, если алгоритм предполагает формирование результата "от листьев к корню" то нужна рекурсия.
Если это последовательный вывод то можно так. Можно использовать для всяких интерактивно-асинхронных задач.


Процедура Обход()
.....
Текущий = Дерево;
Пока ДеревоСледующий(Текущий) Цикл
       .......  
КонецЦикла;
......
КонецПроцедуры;

Функция ДеревоСледующий(Текущий)
	
	Перем УзелНиже;
	
 	УзелНиже = ДеревоНиже(Текущий);	
	Если НЕ УзелНиже = Неопределено Тогда
		Текущий = УзелНиже;
		Возврат Истина;
	ИначеЕсли УзелНиже = Неопределено И ДеревоВыше(Текущий) = Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;	 

	Если НЕ ДеревоПравее(Текущий) = Неопределено Тогда
		Текущий = ДеревоПравее(Текущий);
		Возврат Истина;		
	КонецЕсли;
			
	//нет ни ниже ни правее
	Пока Истина Цикл
				
		Если ДеревоВыше(Текущий) = Неопределено Тогда Возврат Ложь; КонецЕсли;
		
		Текущий = ДеревоВыше(Текущий);
						
		Если НЕ ДеревоПравее(Текущий) = Неопределено И НЕ ДеревоВыше(Текущий) = Неопределено Тогда Прервать;КонецЕсли;
		
	КонецЦикла;
	
	Текущий = ДеревоПравее(Текущий);
	
	Возврат Истина;
	
КонецФункции

Функция ДеревоВыше(Знач Текущий)
	Если ТипЗнч(Текущий) = Тип("ДеревоЗначений") Тогда
		Возврат Неопределено;
	КонецЕсли;
	Если Текущий.Родитель = Неопределено Тогда
		Возврат Текущий.Владелец();
	КонецЕсли; 
	Возврат Текущий.Родитель; 
КонецФункции

Функция ДеревоНиже(Знач Текущий)
	Если Текущий.Строки.Количество() > 0 Тогда
		Возврат Текущий.Строки[0];
	КонецЕсли; 	
КонецФункции

Функция ДеревоПравее(Знач Текущий)
	Если ТипЗнч(Текущий) = Тип("ДеревоЗначений") Тогда
		Возврат Неопределено;
	КонецЕсли;
	Выше = Текущий.Родитель;
	Если Выше = Неопределено Тогда Выше = Текущий.Владелец(); КонецЕсли; 
	инд = Выше.Строки.Индекс(Текущий);
	Если инд < Выше.Строки.Количество() - 1 Тогда
		Возврат Выше.Строки[инд+1];
	КонецЕсли; 
КонецФункции
Показать
Оставьте свое сообщение
Вопросы с вознаграждением
Вакансии
Преподаватель 1С
Санкт-Петербург
зарплата от 100 000 руб. до 120 000 руб.
Временный (на проект)


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

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

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