Имя: Пароль:
1C
1С v8
Иерархическая загрузка из EXCEL
0 _stay true_
 
22.09.16
16:39
Здравствуйте. Прошу помощи, ибо мозга немного перегрета и четверг.

Есть у нас таблица значений вида
Код    Иерархия    Классификатор
4195    4.1    A00-В99 КЛАСС I Некоторые инфекционные и паразитарные болезни
4196    4.1.1    A00-A09 Кишечные инфекции
4197    4.1.1.1    A00 Холера
4264    4.1.1.10    A09 Диарея и гастроэнтерит предположительно инфекционного происхождения (дизентерия)
4201    4.1.1.2    A01 Тиф и паратиф
4202    4.1.1.2.1    A01.0 Брюшной тиф
4206    4.1.1.2.2    A01.4 Паратиф неуточненный
4207    4.1.1.3    A02 Другие сальмонеллезные инфекции
4208    4.1.1.3.1    A02.0 Сальмонеллезный энтерит
4212    4.1.1.3.2    A02.9 Сальмонеллезная инфекция неуточненная
4213    4.1.1.4    A03 Шигеллез
4220    4.1.1.5    A04 Другие бактериальные кишечные инфекции




Нужно загрузить в таблицу значений типа

Родитель1    Родитель2  Родитель3   Родититель4
4.1.1.2.1     4.1.1.2      4.1.1        4.1
4.1.1.2.1     4.1.1.2      4.1.1
Т.е. Самый "глубокий" элемент - это первый родитель, самый "мелкий" - это самый последний. Максимально возможная "глубина" известна - 6.

Знаю, что нужно смотреть в сторону рекурсии, читал несколько статей. Но ничего толком не понял. Если у кого есть похожий пример кода, подскажите, как иерархический "столбик" конвертнуть в "строку".
Заранее спасибо.
1 Garykom
 
гуру
22.09.16
16:46
Ты куда МКБ10 засовываешь?
2 _stay true_
 
22.09.16
16:48
(1) В ERP))
Но пока что просто в таблицу значений.
3 Garykom
 
гуру
22.09.16
16:51
Да рекурсивно самое простое через ПолучитьРодителя() где внутри берется родитель или ничего если достигли корня.

2 цикла, 1-й по всем элементам и выбираем только те которые без детей-потомков.

Затем 2-й цикл (можно рекурсивный цикл но не обязательно так как уровень ребенка известен) внутри каждого конечного для восстановления цепочки родителей до самого корня.
4 Garykom
 
гуру
22.09.16
16:54
Или можно запросами, вот http://its.1c.ru/db/metod8dev/content/2659/hdoc и т.д.

смотри "Проверка наличия подчиненных элементов у элемента справочника"
5 Garykom
 
гуру
22.09.16
16:55
(4)+ Но это будет тормоза с классически осуждаемым "запрос в цикле"
6 _stay true_
 
22.09.16
16:56
(3) 2 цикла, 1-й по всем элементам и выбираем только те которые без детей-потомков.

Проверить, входит ли более "короткий"(по длине строки) в следующий более "Длинный"(по длине строки)? Если входит - идем мимо, если не входит - добавляем, к примеру, в массив. Я верно понял?

По второму вообще не понял если честно. Можно какой-нибудь простой наглядный пример. Правда не могу никак понять суть явления.
7 МихаилМ
 
22.09.16
16:57
8 ovrfox
 
22.09.16
16:58
Не нужна рекурсия. Просто упорядочиваешь список, полученный из EXCEL  по колонке Иерархия.
Первый элемент записываешь
Какждый следующий элемент перед записью ищешь родителя по сокращенному на один уровень полю ИЕРАРХИЯ и записываешь , если нашел. Если не нашел - значит что-то сделал не так или этот элемент и есть самого высокого уровня.
9 Garykom
 
гуру
22.09.16
16:58
Найди МКБ10 в нормальном dbf виде и заюзай если задачка реальная а не учебная
10 ovrfox
 
22.09.16
16:59
(8) Конечно поле иерархия должно быть записано в справочник. Зато без вложенных циклов и/или рекурсии
11 _stay true_
 
22.09.16
17:03
(10) Попробую. По результатам отпиишусь.
Только мне никуда ничего пока что записывать не нужно, просто таблицу получить с нужной структурой строк
12 ovrfox
 
22.09.16
17:04
(8) Ага, херню спорол. Нужно ТЗ, а не справочник.
Тогда тот же алгоритм, но пихаем в ДеревоЗначений.
Когда запихнули - тогда определям максимальный уровень. Добавляем соотвествующее количество родителей в колонки и рекурсией заполняем родителей сверху вниз (или снизу вверх, смотря как надо)
В таблицу значений переносим строки , не имеющие подчиненных элементов - готово.
13 _stay true_
 
22.09.16
17:11
(12) Попробую. Но завтра. Сейчас котелок уже как-то не соображает.

Спасибо тебе:)
14 Garykom
 
гуру
22.09.16
17:22
ipv6 хосты и подсетки ))
15 Garykom
 
гуру
22.09.16
17:37
Берем колонку иерархию, заменяем на стандартное 004.001.001.010 и далее простыми методами типа сортировки, определение "потомков" через есть ли еще рядом записи 004.001.001.010.XXX и т.д.
16 _stay true_
 
23.09.16
15:24
Получилось! Ура, товарищи! Спасибо большое!