Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
14 дек 2024, 03:27

Вывод элементов иерархического справочника

Автор rogaz, 05 дек 2014, 14:51

0 Пользователей и 1 гость просматривают эту тему.

rogaz

Добрый день! У меня имеется иерархический справочник с иерархией элементов, и я хочу вывести элементы в из ДереваЗначений в ТабличноеПоле. Вручную всё работает, но с рекурсивной фугкцией проблемы. Подскажите, пожалуйста, в чем ошибка:


Процедура ЗаполнениеДерева(Знач СсылкаНаЭлемент = Неопределено, Знач пробел = "");
Выборка = Справочник.Выбрать(?(СсылкаНаЭлемент = Неопределено,
Справочник.ПустаяСсылка(), СсылкаНаЭлемент));

Пока Выборка.Следующий() Цикл   
Сообщить(пробел + Выборка.Наименование);
ИмяРодителяЭлемента = Выборка.Родитель.Наименование;
Если СсылкаНаЭлемент = Неопределено Тогда
НовыйЭлемент = ДеревоРеквизитов.Строки.Добавить();
НовыйЭлемент.Наименование = Выборка.Наименование;
ЗаполнениеДерева(Выборка.Ссылка);
Иначе
СтрокаРодителя = ДеревоРеквизитов.Строки.Найти(ИмяРодителяЭлемента);
НовыйЭлемент = СтрокаРодителя.Строки.Добавить();
НовыйЭлемент.Наименование = Выборка.Наименование;
Если Справочник.Выбрать(Выборка.Ссылка).Следующий() Тогда
ЗаполнениеДерева(Выборка.Ссылка);
КонецЕсли;

КонецЕсли;    

КонецЦикла;
КонецПроцедуры

дфтын


Sinsinmin

Не совсем понятен код...комментируйте чтоле для приличия...
Непонятно как у вас происходит выборка.следующий() когда СсылкаНаЭлемент = неопределено...

rogaz

Цитата: дфтын от 05 дек 2014, 14:52
А в чем проблема?
Выдается ошибка - {Форма.Форма.Форма(94)}: Значение не является значением объектного типа (Строки)
         НовыйЭлемент = СтрокаРодителя.Строки.Добавить();

И это половина беды, когда я захожу в режим отладки, при выдаче ошибки с сообщениях выдается не тот же самый результат, что и без отладки. И хуже того, даже в режиме отладки с одной и той же точки останова результат может быть разным :dfbsdfbsdf:
Добавлено: 06 дек 2014, 07:03


Цитата: Sinsinmin от 05 дек 2014, 16:23
Не совсем понятен код...комментируйте чтоле для приличия...
Непонятно как у вас происходит выборка.следующий() когда СсылкаНаЭлемент = неопределено...
Когда неопределено, то Выборка в качестве параметра Родителя получает пустую ссылку на справочник, и выбирается верхний уровень элементов справочника.

Sinsinmin

В общем у вас проблема в том что вы ищете эээ Строку уровня выше и в итоге ничего не находит. Нужно искать на уровень ниже...туда куда добавляли строку.
Как это сделать пока не понял.
Добавлено: 06 дек 2014, 10:47


В общем нужно написать СтрокаРодителя = ДеревоРеквизитов.Строки.Найти(ИмяРодителяЭлемента, , Истина);

Вот мой пример кода для записи Иерархического Справочника в ДеревоЗначений

Перем Дерево;


Процедура КнопкаВыполнитьНажатие(Кнопка)
// Вставить содержимое обработчика.
Дерево = Новый ДеревоЗначений;
Дерево.Колонки.Добавить("Наименование");
Если ЭлементыФормы.ПолеВвода1.Значение <> Справочники.ПодразделенияОрганизаций.ПустаяСсылка() тогда
НоваяСтрока = Дерево.Строки.Добавить();
НоваяСтрока.Наименование = ЭлементыФормы.ПолеВвода1.Значение.Наименование;
КонецЕсли;
Сообщить(ЭлементыФормы.ПолеВвода1.Значение);
    РекурсияК(ЭлементыФормы.ПолеВвода1.Значение);
к = 1;
КонецПроцедуры

Процедура ДобавитьВДерево(Выборка, Дерево);
//ОбработкаПрерыванияПользователя();
КонецПроцедуры

Процедура РекурсияК(К)
Выборка = Справочники.ПодразделенияОрганизаций.Выбрать(К);
Пока Выборка.Следующий() цикл
Пробел = "";
УровеньК = Выборка.Ссылка.Уровень();
Для ц = 1 по УровеньК цикл
Пробел = Пробел + "   ";
КонецЦикла;
Сообщить(Пробел + Выборка.Наименование);
СтрокаУровеньВерх = Дерево.Строки.Найти(К.Наименование, ,Истина);
НоваяСтрока = СтрокаУровеньВерх.Строки.Добавить();
НоваяСтрока.Наименование = Выборка.Наименование;
ВыборкаУровеньНиже = Справочники.ПодразделенияОрганизаций.Выбрать(Выборка.Ссылка);
РекурсияК(Выборка.Ссылка);
КонецЦикла;

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

Добавлено: 06 дек 2014, 10:54


Вот улучшенный вариант для ПустойСсылки вернхего уровня...

Перем Дерево;


Процедура КнопкаВыполнитьНажатие(Кнопка)
// Вставить содержимое обработчика.
Дерево = Новый ДеревоЗначений;
Дерево.Колонки.Добавить("Наименование");
Если ЭлементыФормы.ПолеВвода1.Значение <> Справочники.ПодразделенияОрганизаций.ПустаяСсылка() тогда
НоваяСтрока = Дерево.Строки.Добавить();
НоваяСтрока.Наименование = ЭлементыФормы.ПолеВвода1.Значение.Наименование;
Сообщить(ЭлементыФормы.ПолеВвода1.Значение);
    РекурсияК(ЭлементыФормы.ПолеВвода1.Значение);
Иначе
РекурсияК(Справочники.ПодразделенияОрганизаций.ПустаяСсылка());
КонецЕсли;

к = 1;
КонецПроцедуры

Процедура ДобавитьВДерево(Выборка, Дерево);
//ОбработкаПрерыванияПользователя();
КонецПроцедуры

Процедура РекурсияК(К)
Выборка = Справочники.ПодразделенияОрганизаций.Выбрать(К);
Пока Выборка.Следующий() цикл
Пробел = "";
УровеньК = Выборка.Ссылка.Уровень();
Для ц = 1 по УровеньК цикл
Пробел = Пробел + "   ";
КонецЦикла;
Сообщить(Пробел + Выборка.Наименование);
Если УровеньК = 0 тогда
НоваяСтрока = Дерево.Строки.Добавить();
Иначе
СтрокаУровеньВерх = Дерево.Строки.Найти(К.Наименование, ,Истина);
НоваяСтрока = СтрокаУровеньВерх.Строки.Добавить();
КонецЕсли;
НоваяСтрока.Наименование = Выборка.Наименование;
ВыборкаУровеньНиже = Справочники.ПодразделенияОрганизаций.Выбрать(Выборка.Ссылка);
РекурсияК(Выборка.Ссылка);
КонецЦикла;

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

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск