Построение ДеревоЗначений

1. BackinSoda 25.05.17 09:47 Сейчас в теме
Подскажите алгоритм, есть таблица аля Колонка кодов План Счетов>вывести список в табличный документ. Как обратно вернуть иерархию в виде дерева значений ?
	901	             " "
	901.1	     901
	901.1.1	     901.1
	901.2	     901
	901.2.1	     901.2
	901.2.1.1	     901.2.1
	901.2.2	     901.2
	901.2.2.1	     901.2.2
	901.2.2.2	     901.2.2
Показать

зы: вторая колонка для примера что чему подчинено.
обычные формы
По теме из базы знаний
Найденные решения
4. NeviD 25.05.17 11:25 Сейчас в теме
На вход подается ТаблицаЗначений с колонкой Код.


Функция ПреобразоватьВДерево(ТаблицаЗначений)
	
	ДеревоЗначений = Новый ДеревоЗначений;
	ДеревоЗначений.Колонки.Добавить("Код");
	
	ТекСтрокаДерева = Неопределено;
	Для каждого СтрокаТЗ Из ТаблицаЗначений Цикл
		Пока Истина Цикл
			Если ТекСтрокаДерева = Неопределено Тогда
				ТекСтрокаДерева = ДеревоЗначений.Строки.Добавить();
				ТекСтрокаДерева.Код = СтрокаТЗ.Код;
				Прервать;
			ИначеЕсли Лев(СтрокаТЗ.Код, СтрДлина(ТекСтрокаДерева.Код)) = ТекСтрокаДерева.Код Тогда
				ТекСтрокаДерева = ТекСтрокаДерева.Строки.Добавить();
				ТекСтрокаДерева.Код = СтрокаТЗ.Код;
				Прервать;
			КонецЕсли;
			ТекСтрокаДерева = ТекСтрокаДерева.Родитель;
		КонецЦикла;
	КонецЦикла;
	
	Возврат ДеревоЗначений;
	
КонецФункции
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. SyachinS 25.05.17 10:29 Сейчас в теме
Работающий пример для номенклатуры:

Запрос:
ВЫБРАТЬ
	СписокНоменклатуры.Ссылка КАК Номенклатура
ИЗ
	Справочник.Номенклатура КАК СписокНоменклатуры

УПОРЯДОЧИТЬ ПО
	СписокНоменклатуры.Ссылка ИЕРАРХИЯ,
	СписокНоменклатуры.Наименование
Показать


Обработчик:
РезультатЗапроса = Запрос.Выполнить();
		
		Выборка = РезультатЗапроса.Выбрать();
		
		ТекущийУровень = 0;
		ТекЭлемент = ТаблицаТоваров.ПолучитьЭлементы();
		
		Пока Выборка.Следующий() Цикл
			УровеньЭлемента = Выборка.Номенклатура.Уровень();
			Если УровеньЭлемента = ТекущийУровень И УровеньЭлемента = 0 Тогда
				ТекЭлемент = ТаблицаТоваров.ПолучитьЭлементы().Добавить();
				ТекущийУровень = УровеньЭлемента;
			ИначеЕсли УровеньЭлемента = ТекущийУровень Тогда
				ТекЭлемент = ТекЭлемент.ПолучитьРодителя().ПолучитьЭлементы().Добавить();
				ТекущийУровень = УровеньЭлемента;
			ИначеЕсли УровеньЭлемента < ТекущийУровень Тогда
				Если УровеньЭлемента = 0 Тогда
					ТекЭлемент = ТаблицаТоваров.ПолучитьЭлементы().Добавить();
				Иначе
					КоличествоУровней = ТекущийУровень - УровеньЭлемента;
					Для Н = 0 По КоличествоУровней Цикл
						Если Не ТекЭлемент.ПолучитьРодителя() = Неопределено Тогда
							ТекЭлемент = ТекЭлемент.ПолучитьРодителя();
						КонецЕсли;
					КонецЦикла;
					ТекЭлемент = ТекЭлемент.ПолучитьЭлементы().Добавить();
				КонецЕсли;
				ТекущийУровень = УровеньЭлемента;
			ИначеЕсли УровеньЭлемента > ТекущийУровень Тогда
				ТекЭлемент = ТекЭлемент.ПолучитьЭлементы();
				ТекЭлемент = ТекЭлемент.Добавить();
				ТекущийУровень = УровеньЭлемента;
			КонецЕсли;
			
			ТекЭлемент.Номенклатура = Выборка.Номенклатура;
		КонецЦикла;
Показать
3. BackinSoda 25.05.17 10:36 Сейчас в теме
Была бы иерархия, то можно было бы по группировкам обойти итоги. Увы её и надо получить обходом строк
4. NeviD 25.05.17 11:25 Сейчас в теме
На вход подается ТаблицаЗначений с колонкой Код.


Функция ПреобразоватьВДерево(ТаблицаЗначений)
	
	ДеревоЗначений = Новый ДеревоЗначений;
	ДеревоЗначений.Колонки.Добавить("Код");
	
	ТекСтрокаДерева = Неопределено;
	Для каждого СтрокаТЗ Из ТаблицаЗначений Цикл
		Пока Истина Цикл
			Если ТекСтрокаДерева = Неопределено Тогда
				ТекСтрокаДерева = ДеревоЗначений.Строки.Добавить();
				ТекСтрокаДерева.Код = СтрокаТЗ.Код;
				Прервать;
			ИначеЕсли Лев(СтрокаТЗ.Код, СтрДлина(ТекСтрокаДерева.Код)) = ТекСтрокаДерева.Код Тогда
				ТекСтрокаДерева = ТекСтрокаДерева.Строки.Добавить();
				ТекСтрокаДерева.Код = СтрокаТЗ.Код;
				Прервать;
			КонецЕсли;
			ТекСтрокаДерева = ТекСтрокаДерева.Родитель;
		КонецЦикла;
	КонецЦикла;
	
	Возврат ДеревоЗначений;
	
КонецФункции
Показать
5. BackinSoda 25.05.17 11:46 Сейчас в теме
(4) Спасибо, то что надо !
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот