Подскажите алгоритм, есть таблица аля Колонка кодов План Счетов>вывести список в табличный документ. Как обратно вернуть иерархию в виде дерева значений ?
зы: вторая колонка для примера что чему подчинено.
обычные формы
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
Показатьзы: вторая колонка для примера что чему подчинено.
обычные формы
По теме из базы знаний
- Восстановление развернутых строк ДереваЗначений после его обновления (управляемая форма)
- Добавление иерархии в типовой неиерархический справочник
- Полезняшки по СКД и построителям. Просто код
- Динамический список, ключи записей. Нюансы
- Чтение вложенных свойств Структур Структуры, Соответствий, свойства через точку, разбор JSON
Найденные решения
На вход подается ТаблицаЗначений с колонкой Код.
Функция ПреобразоватьВДерево(ТаблицаЗначений)
ДеревоЗначений = Новый ДеревоЗначений;
ДеревоЗначений.Колонки.Добавить("Код");
ТекСтрокаДерева = Неопределено;
Для каждого СтрокаТЗ Из ТаблицаЗначений Цикл
Пока Истина Цикл
Если ТекСтрокаДерева = Неопределено Тогда
ТекСтрокаДерева = ДеревоЗначений.Строки.Добавить();
ТекСтрокаДерева.Код = СтрокаТЗ.Код;
Прервать;
ИначеЕсли Лев(СтрокаТЗ.Код, СтрДлина(ТекСтрокаДерева.Код)) = ТекСтрокаДерева.Код Тогда
ТекСтрокаДерева = ТекСтрокаДерева.Строки.Добавить();
ТекСтрокаДерева.Код = СтрокаТЗ.Код;
Прервать;
КонецЕсли;
ТекСтрокаДерева = ТекСтрокаДерева.Родитель;
КонецЦикла;
КонецЦикла;
Возврат ДеревоЗначений;
КонецФункции
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Работающий пример для номенклатуры:
Запрос:
Обработчик:
Запрос:
ВЫБРАТЬ
СписокНоменклатуры.Ссылка КАК Номенклатура
ИЗ
Справочник.Номенклатура КАК СписокНоменклатуры
УПОРЯДОЧИТЬ ПО
СписокНоменклатуры.Ссылка ИЕРАРХИЯ,
СписокНоменклатуры.Наименование
ПоказатьОбработчик:
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
ТекущийУровень = 0;
ТекЭлемент = ТаблицаТоваров.ПолучитьЭлементы();
Пока Выборка.Следующий() Цикл
УровеньЭлемента = Выборка.Номенклатура.Уровень();
Если УровеньЭлемента = ТекущийУровень И УровеньЭлемента = 0 Тогда
ТекЭлемент = ТаблицаТоваров.ПолучитьЭлементы().Добавить();
ТекущийУровень = УровеньЭлемента;
ИначеЕсли УровеньЭлемента = ТекущийУровень Тогда
ТекЭлемент = ТекЭлемент.ПолучитьРодителя().ПолучитьЭлементы().Добавить();
ТекущийУровень = УровеньЭлемента;
ИначеЕсли УровеньЭлемента < ТекущийУровень Тогда
Если УровеньЭлемента = 0 Тогда
ТекЭлемент = ТаблицаТоваров.ПолучитьЭлементы().Добавить();
Иначе
КоличествоУровней = ТекущийУровень - УровеньЭлемента;
Для Н = 0 По КоличествоУровней Цикл
Если Не ТекЭлемент.ПолучитьРодителя() = Неопределено Тогда
ТекЭлемент = ТекЭлемент.ПолучитьРодителя();
КонецЕсли;
КонецЦикла;
ТекЭлемент = ТекЭлемент.ПолучитьЭлементы().Добавить();
КонецЕсли;
ТекущийУровень = УровеньЭлемента;
ИначеЕсли УровеньЭлемента > ТекущийУровень Тогда
ТекЭлемент = ТекЭлемент.ПолучитьЭлементы();
ТекЭлемент = ТекЭлемент.Добавить();
ТекущийУровень = УровеньЭлемента;
КонецЕсли;
ТекЭлемент.Номенклатура = Выборка.Номенклатура;
КонецЦикла;
Показать
На вход подается ТаблицаЗначений с колонкой Код.
Функция ПреобразоватьВДерево(ТаблицаЗначений)
ДеревоЗначений = Новый ДеревоЗначений;
ДеревоЗначений.Колонки.Добавить("Код");
ТекСтрокаДерева = Неопределено;
Для каждого СтрокаТЗ Из ТаблицаЗначений Цикл
Пока Истина Цикл
Если ТекСтрокаДерева = Неопределено Тогда
ТекСтрокаДерева = ДеревоЗначений.Строки.Добавить();
ТекСтрокаДерева.Код = СтрокаТЗ.Код;
Прервать;
ИначеЕсли Лев(СтрокаТЗ.Код, СтрДлина(ТекСтрокаДерева.Код)) = ТекСтрокаДерева.Код Тогда
ТекСтрокаДерева = ТекСтрокаДерева.Строки.Добавить();
ТекСтрокаДерева.Код = СтрокаТЗ.Код;
Прервать;
КонецЕсли;
ТекСтрокаДерева = ТекСтрокаДерева.Родитель;
КонецЦикла;
КонецЦикла;
Возврат ДеревоЗначений;
КонецФункции
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот