|
Загрузка из Excel в УТ10. с иерархией | ☑ | ||
---|---|---|---|---|
0
LYuri
14.11.14
✎
11:28
|
Доброго времени суток.
Пытаюсь реализовать загрузку номенклатуры посредством внешней обработки. Исходные данные: ИБ - УТ 10.3.29.1 типовая, базовая. Файл экселя с группировками, т.е. иерархический. С чтением из фалы проблем нет. Уровень иерархии - проблем нет, получаю через свойство ExcelЛист.Rows(ТекСтр).OutlineLevel Проблема в следующем. Нужно реализовать правильную загрузку с учетом иерархии. Сам код не интересует, нужна блок-схема или примерный алгоритм. Может у кого есть рабочий пример. Заранее спасибо. |
|||
1
pessok
14.11.14
✎
11:29
|
А в чем проблема? При обходе записывай к текущей номенклатуре код родителя, а потом в 1С его и устанавливай
|
|||
2
Looser-1c
14.11.14
✎
11:30
|
читаем элемент, ищем для него родителя, не находим - см. пункт первый, находим - записываем
|
|||
3
Fish
14.11.14
✎
11:32
|
Сколько уровней иерархии, заранее известно или может быть разным?
|
|||
4
LYuri
14.11.14
✎
11:32
|
Сижу уже 2 часа, понлый "затык" )) Давайте подробнее. по шагам
|
|||
5
LYuri
14.11.14
✎
11:34
|
(3) Уровни динамические:
1---- -2--- --3-- ---4- ----5 ----5 ---4- ---4- ---4- --3-- ---4- ---4- -2--- -2--- -2--- Примерно так может быть. число вложений не ограничено |
|||
6
LYuri
14.11.14
✎
11:34
|
(3) Может быть и 10
|
|||
7
Looser-1c
14.11.14
✎
11:35
|
Рекурсия божественна, циклы - для людей (с) один из классиков
|
|||
8
LYuri
14.11.14
✎
11:36
|
Пытаюсь реализовать при помощи Дерева.
1 этап. создаю родителькую ветку |
|||
9
Fish
14.11.14
✎
11:36
|
(5) Тогда только рекурсия спасёт.
|
|||
10
LYuri
14.11.14
✎
11:36
|
(7) С рекурсией знаком, но на практике мало реализовывал
|
|||
11
Looser-1c
14.11.14
✎
11:37
|
(10) Вот и повод будет попрактиковаться
|
|||
12
LYuri
14.11.14
✎
11:39
|
(11) Обязательно, этим щас и занят. Но нужно быстрое решение. Времени нет на теорию,нужен практический пример
|
|||
13
Looser-1c
14.11.14
✎
11:40
|
(12) быстрые решения или неправильны, или платны ))
|
|||
14
Fish
14.11.14
✎
11:41
|
(12) Поиском не пробовал пользоваться? Иногда помогает: http://infostart.ru/public/252705/
|
|||
15
LYuri
14.11.14
✎
11:43
|
(14) Спасибо. Поиском пользовался, эта статья в закладках есть, но пока разобрать ход мысли автора не получилось до конца. Сижу ковыряю.
|
|||
16
LYuri
14.11.14
✎
11:44
|
(13) Цена вопроса?
|
|||
17
Looser-1c
14.11.14
✎
11:45
|
(16) Я не хочу в пятницу работать. Поэтому - стотыщьмильонов (с гарантией, чтобы не хватило ))
|
|||
18
LYuri
14.11.14
✎
11:51
|
Кто хочет поработать?
|
|||
19
LYuri
14.11.14
✎
11:52
|
2 этап - вызываю процедуру, которая перебирает строки экселя и вызывает рекурсивно сама себя.
|
|||
20
Fish
14.11.14
✎
12:00
|
(19) И этого в принципе должно быть достаточно.
|
|||
21
dk
14.11.14
✎
12:02
|
самый простой вариант - запись в 2 цикла
1. первый цикл пробегаешься эксель и дорисовываешь недостающих родителей 2. все родители уже есть - просто присваиваешь родителей элементам -------- или проблема в поиске родителя? у тебя группы по наименованию или коду дублируются? |
|||
22
LYuri
14.11.14
✎
12:07
|
(21) да именно проблема в поиске родителя. кодов нет. есть только наименования. могут дублироваться
|
|||
23
Fish
14.11.14
✎
12:10
|
(22) А в чём проблема? Ищешь по наименованию только внутри определённого родителя. Или у тебя внутри одного родителя могут быть одинаковые элементы/папки?
|
|||
24
LYuri
14.11.14
✎
12:11
|
(21) (7) Да чот не хочется в цикле. Чую, что 50000 наименований в цикле "опупеют" ))
|
|||
25
dk
14.11.14
✎
12:45
|
(24) я обычно из Экселя гружу в ТЗ и уже потом с ТЗ работаю
прочитал в тз добавил колонку родитель с ссылкой на группу в 1с заполнил родителя записал элементы |
|||
26
Maniac
14.11.14
✎
12:50
|
Короче не трахай мозг.
Заведи в 1С все папки. С иерархией. Не думаю что там у тебя их миллионы. Ну 50 штук. А потом грузи прайс ища только папку нижнего уровня, в которую непосредственно входит товар. |
|||
27
Maniac
14.11.14
✎
12:51
|
Илои можно всю иерарзхию загрузить в корень, в нее номенгклатуру. Потом просто поперекидывать папки в папки и все.
5 минут дел. Ты программировать будешь в мллиярд раз долше. |
|||
28
LYuri
14.11.14
✎
12:56
|
(26) Спасибо, наверное так и сделаю.
|
|||
29
LYuri
14.11.14
✎
13:05
|
Но в итоге нужно будет все таки вопрос решить
|
|||
30
Maniac
14.11.14
✎
13:12
|
Группы в одной колонке?
|
|||
31
Maniac
14.11.14
✎
13:13
|
с товарами?
|
|||
32
Maniac
14.11.14
✎
13:15
|
1) все загонял в ТЗ
2) В цикле бегу по ТЗ. Определяю если строка группа. Запихиваю в переменную (которая объявлена до цикла) Если определеил ее, то назначаю в продолжении цикла всем строкам товаров. Как только дошел до следующего определения группы. Опять в переменную и опять назначение всем слудующим строкам. |
|||
33
Maniac
14.11.14
✎
13:17
|
Определить группу достаточно легко.
У групп в прайсах всегда отсутствует одно из трех правил: если есть колонка артикул но пусто - группа. Если есть колонка цена - но пусто, тоже группа. Если есть единица и пуста - тоже группа. При выполнении хоть одного из этизх условий мы попадаем на группу в ТЗ, и ее с помощью запоминания в переменную распихиваем по строкам. Дальше простое дело техники. Итого всего навсего 1 пробежка чтобы по всем строкам группу определить и далее туда грузить. |
|||
34
Maniac
14.11.14
✎
13:18
|
||||
35
Управление торговлей
14.11.14
✎
13:27
|
(0) заведи список значений, при увеличении OutlineLevel кидай туда группу, при уменьшении OutlineLevel получай группу из списка, используя OutlineLevel как индекс
|
|||
36
МишельЛагранж
14.11.14
✎
17:23
|
(0) Выгружаем номенклатуру вместе с привязкой к папкам в виде "каталог/каталог1/каталог2/каталго3".
При загрузке - парсим привязку, ищем цепочки (начиная сверху с корня), если нашли всех потомков - пишем туда, нет - создаем на нужном уровне потомков до конца и пишем туда. Это единственный верный путь - и автоматически, и все будет правильно. Остальное - рекурсии, "заведи папки", OutlineLevel - не дадут точности и глубины, а следовавтельно - неправильный результат получишь. Все это рассчитано на 1-2 уровня вложенности. |
|||
37
МишельЛагранж
14.11.14
✎
17:28
|
(23)>>Или у тебя внутри одного родителя могут быть одинаковые элементы/папки?
- внутри разных родителей могут быть одинаковые наименования. Это как у вас - зовут Сергей, а рядом - еще целая лестничная клетка Сергеев. Но вы же все разные. Да еще и по поколениям. |
|||
38
МишельЛагранж
14.11.14
✎
17:30
|
(18) пиши мне, но два дня - слишком жесткий срок за небольшие деньги.
|
|||
39
Сияющий Асинхраль
14.11.14
✎
19:01
|
Есть процедурка в 20 строчек на 7.7, которая расставляет предков и потпков в тз где указаны уровни. Если надо могу сбросить
|
|||
40
Сияющий Асинхраль
14.11.14
✎
22:32
|
+(39) Вот так разбирается ТЗ, которая имеет колонку "Уровень", заполненная как в (5) и пару доп колонок "ЭлтТекУр" следующий в данной папке элемент текущего уровня (если они еще есть), "ЭлтВниз" - первый элемент входящий в текущую папку:
Процедура глРасстановкаПредковИПотомков(ТЗ) Экспорт сзПредкиПотомки = СоздатьОбъект("СписокЗначений"); ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку() = 1 Цикл Если ТЗ.Уровень = сзПредкиПотомки.РазмерСписка() Тогда стрТемп = ""; СтрокаДляУстановкиНомера = сзПредкиПотомки.ПолучитьЗначение(сзПредкиПотомки.РазмерСписка(), стрТемп); ТЗ.УстановитьЗначение(СтрокаДляУстановкиНомера, "ЭлтТекУр", ТЗ.НомерСтроки); сзПредкиПотомки.УстановитьЗначение(сзПредкиПотомки.РазмерСписка(),ТЗ.НомерСтроки, СокрЛП(сзПредкиПотомки.РазмерСписка())); ИначеЕсли (ТЗ.Уровень = (сзПредкиПотомки.РазмерСписка() + 1)) Тогда Если сзПредкиПотомки.РазмерСписка() > 0 Тогда СтрокаДляУстановкиНомера = (ТЗ.НомерСтроки - 1); ТЗ.УстановитьЗначение(СтрокаДляУстановкиНомера, "ЭлтВниз", ТЗ.НомерСтроки); КонецЕсли; сзПредкиПотомки.ДобавитьЗначение(ТЗ.НомерСтроки, СокрЛП(ТЗ.Уровень)); ИначеЕсли ТЗ.Уровень < сзПредкиПотомки.РазмерСписка() Тогда ВсегоВСписке = сзПредкиПотомки.РазмерСписка(); ТекУрТемп = ТЗ.Уровень; Для Счетчик = (- ВсегоВСписке) По (- ТекУрТемп) Цикл НомерИзСпискаДляУдаления = - Счетчик; СтрТемп = ""; СтрокаДляУстановкиНомера = сзПредкиПотомки.ПолучитьЗначение(НомерИзСпискаДляУдаления, СтрТемп); ТЗ.УстановитьЗначение(СтрокаДляУстановкиНомера, "ЭлтТекУр", ТЗ.НомерСтроки); сзПредкиПотомки.УдалитьЗначение(НомерИзСпискаДляУдаления); КонецЦикла; сзПредкиПотомки.ДобавитьЗначение(ТЗ.НомерСтроки, СокрЛП(ТЗ.Уровень)); КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
41
LYuri
15.11.14
✎
11:40
|
(36) Методом рекурсии получилось организовать загрузку с неограниченным уровнем вложенности. Воспользовался статьёй http://infostart.ru/public/252705/
Правда пришлось кардинально переработать алгоритм. Теперь всё работает. Доделываю, навожу лоск. Позже выложу на инфостарте. |
|||
42
LYuri
15.11.14
✎
13:42
|
А пока если кому надо, пишите в личку
|
|||
43
LYuri
15.11.14
✎
14:23
|
Может есть у кого информация дайте ссылку на информацию подобной функции на OpenOffice. Хочу сделать возможность работать через свободный офис.
|
|||
44
LYuri
15.11.14
✎
14:24
|
функцию имел ввиду как ExcelЛист.Rows(ТекСтр).OutlineLevel
|
|||
45
LYuri
16.11.14
✎
15:40
|
Почти доделал обработку. получилась универсальная. Тестировал на основной прайсе от 1С. Загрузка всего прайса занимает не более 5 минут
|
|||
46
LYuri
16.11.14
✎
15:41
|
Пришлось повоевать с рекурсиями )) 2 дня тренировок и 5 минут полёта
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |