Удаление дублей иерархии при получении результата запроса

При использовании запросов с оператором ИЕРАРХИЯ и последующей выгрузке в дерево есть проблема, с которой знакомы большинство программистов — наличие дублей в иерархии, на справочника номенклатуры:

Запрос и результат:

request

Чтобы убрать дубли после получения дерева значений из результата запроса можно воспользоваться функциями ниже. Поле ключа — поле иерархии (Номенклатура).

Функция УдалитьДублирующиесяУзлыДерева(Дерево, _ПоляКлюча) Экспорт

ПоляКлюча = СтрРазделить(_ПоляКлюча, «,»);
Дерево2 = новый ДеревоЗначений;
для каждого колонка из Дерево.Колонки цикл
Дерево2.Колонки.Добавить(колонка.Имя, колонка.ТипЗначения);
КонецЦикла;
для каждого СтрКорня из Дерево.Строки цикл
НС = Дерево2.Строки.Добавить();
ЗаполнитьЗначенияСвойств(НС, СтрКорня);
СкопироватьРекурсивно(НС, СтрКорня, ПоляКлюча);
КонецЦикла;

Возврат Дерево2;

КонецФункции

Процедура СкопироватьРекурсивно(СтрокаКопия, СтрДерева, ПоляКлюча)

для каждого СтрПотомка из СтрДерева.Строки цикл
ЕстьРазличия = ложь;
для каждого ПолеКлюча из ПоляКлюча цикл
Если СтрПотомка[ПолеКлюча] <> СтрДерева[ПолеКлюча] тогда
ЕстьРазличия = истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЕстьРазличия тогда
НС = СтрокаКопия.Строки.Добавить();
ЗаполнитьЗначенияСвойств(НС, СтрПотомка);
СкопироватьРекурсивно(НС, СтрПотомка, ПоляКлюча);
Иначе
СкопироватьРекурсивно(СтрокаКопия, СтрПотомка, ПоляКлюча);
КонецЕсли;
КонецЦикла;

КонецПроцедуры