Имя: Пароль:
1C
1С v8
Загрузка из 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 минут полёта
Программист всегда исправляет последнюю ошибку.