Имя: Пароль:
1C
1С v8
Загрузка номенклатуры из иерархического Excel
,
0 Anderson
 
29.08.11
14:45
Знаю что обсуждений было куча, и перечитал много статей. Но все же вопрос остается открытым.
Есть прайс номенклатуры вложенностью 7 или 8 уровней. Элементы можно отследить по артикулу, а вот с группами проблема. Знаю только уровень вложения, а вот определить родителя этого уровня не получается т.к. верхних уровней тоже может быть несколько штук.
Собственно вопрос: возможно ли как-то из Excel вытащить кроме уровня еще и родителя и как это сделать. Может у кого-то есть альтернативные решения!
1 Anderson
 
29.08.11
16:09
ап
2 izekia
 
29.08.11
16:10
ждем Евгения))
3 izekia
 
29.08.11
16:11
(0) формат в экселе какой, опиши примерно
4 Eugeneer
 
29.08.11
16:13
Есть конечно
5 Eugeneer
 
29.08.11
16:13
(2) )))
6 Eugeneer
 
29.08.11
16:14
(0) вес папки в одной колонке с номенклатурой?
7 Eugeneer
 
29.08.11
16:15
есть у меня определитель таких прайсов и групп в них. Алгоритм несложный. Но я пока делал три (можно сделать и 8).
8 Anderson
 
29.08.11
16:16
По виду это типовый прайс из УТ т.е.:
Группа1
 Группа1.2
   Группа1.2.1
     Группа1.2.1.1
      Элемент1...
     Группа1.2.1.2
      Элемент2...
   Группа1.2.2
    .....
 Группа1.3
   .....
Группа2
Группа2.1
  .....
Группа2.2
9 Anderson
 
29.08.11
16:17
(6)Можно по-подробней?
10 izekia
 
29.08.11
16:18
(7) lol
то есть у тебя отдельная обработка на каждый уровень?)
(8) у каждой отдельно взятой группы или элемента можно определить родителя?
11 Eugeneer
 
29.08.11
16:18
(9) все понятно. короче у тебя в прайсе есть колонка с номенклатурой. в ней и товары и папки. ты хочешь загрузить все по иерархии. нормальная хотелка каждого))
12 Eugeneer
 
29.08.11
16:19
(10) нет у меня обработка которая считывает три группы. пока максимум что встречалось у клиентов. но если надо 8 то можно и под 8 чделать. количество роли не играет. ну чуток кода будет больше.
13 Happy Bear
 
29.08.11
16:20
(0) пару дней назад писал загрузку. Задал количество уровней иерархии, на каждый уровень прописал номер колонки. Родителя ищу в цикле по наименованию.
14 Eugeneer
 
29.08.11
16:21
(8) если у тебя такая структура - вычисляй по количеству пробелов. ответ на лицо.
У меня нет пробелов у меня прайсы попадаются где все идет сплошным списком. Пришлось писать модуль по определению групп и иеархии
15 Eugeneer
 
29.08.11
16:21
(13) с отдельными колонками любой сделает)) а ты с одной сделал?)
16 mikecool
 
29.08.11
16:21
я делал загрузку - уровень группы отслеживался по размеру и жирности шрифта ))
17 Happy Bear
 
29.08.11
16:23
(15) надо поставщиков нормальных иметь, которые прайс нормальный выкладывают  ;).
18 Anderson
 
29.08.11
16:24
(14)Да но там количество пробелов может плясать -+4 символа
19 Eugeneer
 
29.08.11
16:24
Все гораздо проще.
У групп в прайсах как правило нет какого то заполненного поля. Единицы, количества.
При пробежке мы это можем получить. Потом все просто оказывается.
Получили строку (нет единицы) аха - это группа.
Бежим след строка - нет - аха это вторая группа.
И т.д.
Таким образорм получаем группы.
Для связки (т.е. аха 1 группа, 2 группа и т.д.)
Заводим переменные.

То есть на первой группе - аха это группа - в переменную
ПОлучили вторую группу - аха -0 в другую переменную.

Потом у нас получится переменные которые друг другу родители.

Как только вышли на товар. - аха это товар. Значит все переменные свыше - его группы.

Бегим пока после товаров опять группа не попадется. Обунляем переменные. Опять считываем.
20 Anderson
 
29.08.11
16:24
(16)как вариант
21 Eugeneer
 
29.08.11
16:25
(17) надо иметь нормальную купленную разработку сделанную мной))) Чем больше таких поставщиков тем у меня больше заработок ))
22 Eugeneer
 
29.08.11
16:25
(16) бывает одинаковым или вообще никак не выделено.
23 Eugeneer
 
29.08.11
16:25
и пробелов быть не может. надо отталкиватся от всех случаев.
24 mikecool
 
29.08.11
16:26
(19) а иерархия - какая группа чему принадлежит ?
25 Eugeneer
 
29.08.11
16:27
(24) так через временные переменный ты их все получаешь.
Перем Родитель1, Родитель 2 и т.д.
26 Eugeneer
 
29.08.11
16:27
Могу продать разработку. 1Сникам скидка 20 процентов)))
27 izekia
 
29.08.11
16:27
(20) ну если отступ больше, значит группа подчиненная и наоборот
+ проблема в том месте, где кончаются товары и появляется группа, сложно будет определить ее уровень
28 mikecool
 
29.08.11
16:28
(25) не, это не мой путь, при неопределенной иерархии запаришься
29 mikecool
 
29.08.11
16:28
(27) вот я про то же
30 Eugeneer
 
29.08.11
16:29
(24) у тебя переменные строк. которые хранятся пока не будет определена строка с товаром и опять найдена очередная группа.

Ясень пень что после строки с товаром если опять попалась группа. значит все переменные обнуляем.
А до этого времени все переменные это группы.
Просто проверяем заполненность переменных.
Получается
Родитель1
Родитель2
Родитель3
и т.д.
Все они между собой связаны.
31 mikecool
 
29.08.11
16:29
короче - задача тривиальная, главное - оперделить признаки, остальное 50-70 строк кода
32 mikecool
 
29.08.11
16:30
(30) т.е. ты бежишь по всему файлу, пытаясь определить группы?
и формируешь дерево групп?
33 Eugeneer
 
29.08.11
16:30
(28) никто не мешает тебе сделать ТЗ и показывать результат работы алгоритма перед тем как что то создавать в базе.
Через интерактивную таблицу моджно проверить правильность работы и на логическом уровне все отладить как часики.
34 Eugeneer
 
29.08.11
16:31
(32) конечно.
35 Anderson
 
29.08.11
16:32
А если какой-то идиот менеджер поставщика написал название группы или товара с пробелом в начале, то она получится в другом уровне.
(30)А если у меня на 40-м уровне есть 15 групп, то сколько мне надо переменных? Надо что-то более универсольное.
36 mikecool
 
29.08.11
16:32
не, у меня без дерева работала, нормально раскидывала
37 Eugeneer
 
29.08.11
16:32
(35) ну тогда продолжай ипать себе мосх))) универсальных не бывает в таких вещах.
38 Eugeneer
 
29.08.11
16:33
я прайсов столько перевидал шопипец. каждый дрочит как хочет.
39 Anderson
 
29.08.11
16:33
40-м = 4-ом
40 Eugeneer
 
29.08.11
16:33
любой алгоритм может слететь если появится новыйчудо прайс.
Там еще бывает что группы вообще влепливают в колонку с артикулом или даже номером строки. так вообще офигеешь такое считывать.
41 Anderson
 
29.08.11
16:35
Я не про универсальной загрузки всех прайсов, а про универсального алгоритма в плане обработки групп данного прайса.
42 Eugeneer
 
29.08.11
16:35
(41) я ж и говорю. под один прайс настроишь, прийдет другой прайс и уже надо новый алгоритм и т.д. и т.п.
43 Anderson
 
29.08.11
16:36
А из самого Excel'я никак не получится вытащить?
44 Anderson
 
29.08.11
16:37
Получаем же уровень нахождения, может можно как-то и родителя уровня вытащить?
45 Eugeneer
 
29.08.11
16:37
все это не так просто.
Если у тебя один прайс строгой формы то конечно тут смело можно делать один алгоритм не парясь.
По пробелам - тебе самый подходящий вариант и самый простой.
Проверку группы и товара легко определить по какой нить колонке типа единицы измерения или количества.
В прайсах у группы эти колонки пустые.
46 Eugeneer
 
29.08.11
16:37
а эксель у тебя у всех стоит?
47 Anderson
 
29.08.11
16:38
Да.
48 izekia
 
29.08.11
16:39
(47) кинь куда-нибудь пример?
49 izekia
 
29.08.11
16:39
прайса
50 mishmeister
 
29.08.11
16:44
Интересно стало, можно я присоединюсь?

А можно ведь сделать более универсально, без переменных.
Загружать прайс в дерево значений.

Т.е. получится как у Eugeneer, но сначала создаем группы, как дошли до товаров(Судя по колонке количество) пишем товары,при этом проверяя количество пробелов слева, как встретили группу, по тем же пробелам находим родителя в этой группе, и т.п.

В итоге получаем дерево, которое уже грузим в справочник после необходимых телодвижений.
51 mikecool
 
29.08.11
16:45
(50) можно и без дерева, повторюсь - главное определить признаки, а закодить уже мелочи
52 Anderson
 
29.08.11
16:47
53 izekia
 
29.08.11
16:48
(50) парни, ну накуй вам эти деревья или переменные, тут же линейная структура, все тупо сразу в справочник пишется

и вообще присоединюсь к (51) тут тонкости реализации - последнее дело
54 mishmeister
 
29.08.11
16:49
(51) ИМХО, если что грузить от поставщика, то перед записью в БД нужно пользователю дать шанс проверить.
А тут можно добавить колонки с найденными значениями в базе, дать возможность самостоятельно ввести корректировки, и т.п.

Размечтался что-то я, сам все равно по другому и проще делал:)
Но и задачи другие были.
55 izekia
 
29.08.11
16:52
(52) черт, тут вообще все просто, строки уже сгруппированы, даже напрягаться не нужно
56 mishmeister
 
29.08.11
16:52
(52) А его 1 раз загрузить надо, или периодически обновлять?
57 Anderson
 
29.08.11
16:52
Самая основная проблема сохранить иерархию. Допустим грузим группы 5-го уровня и тут группа 4-го уровня следовательно родителя надо искать 3-го уровня а их штук 5 и кто из них папочка?
58 Anderson
 
29.08.11
16:53
Обновлять конечно, если будут дополнения.
59 izekia
 
29.08.11
16:53
(57) глупости, тут родитель явно определяется, так как существуют группировки
60 Anderson
 
29.08.11
16:56
(59)Ты хотел сказать последняя группа из этого уровня т.к. загружаем последовательно?
61 Eugeneer
 
29.08.11
16:57
Чел не понимает как строками управлять))
предидущей и следующей))
62 mishmeister
 
29.08.11
16:59
(57) запоминай группы отдельно, и как найдешь следующую группу, то ищи предыдущую по количеству пробелов слева.
63 Anderson
 
29.08.11
16:59
по ходу я не въехал в (59)(61)
64 izekia
 
29.08.11
17:03
(62) ты файл смотрел?
там строки сгруппированы
65 Eugeneer
 
29.08.11
17:04
(63)
делаешь ТЗ для заполнения
Две колонки
Группа, Уровень

С\читываем файл
Пока Стр для Каждого ляляля Следующий

Если Ляляля проблелов = 1 Тогда
ТЗ.Группа = Стр.Значение
ТЗ. Уровень = 1

ИначеЕсли Пробелов ляляля = 2 Тогда
ТЗ.Группа = Стр.Значение
ТЗ.Уровень = 2

и т.д.

КонецЦИкла.

ВерхняяГруппа = "";
Для Каждого Стр из ТЗ ЦИкл
Если Стр.Уровень = 1 Тогда
ляляля найтигруппа
Не нашли создали
ВерхняяГруппа = СОзданнаяИлиНайденнаяГруппа

Если Уровень = 2 Тогда
лояляля - ищем.создаем
НайденнаяГруппа.РОдитель = ВерхняяГруппа;
ВерхняяГруппа = Найденнаягруппа.Ссылка;

и т.д. и т.п.
66 mishmeister
 
29.08.11
17:05
(64) Смотрел, он как раз как в (8)
67 izekia
 
29.08.11
17:07
(66) не обратил внимание на левое поле ... там типа плюсики и полоски какие-то
68 izekia
 
29.08.11
17:08
(65) зачем нужна твоя промежуточная структура ?
берешь все и пишешь в справочник в транзакции сразу, не надо ничего дополнительного
69 Eugeneer
 
29.08.11
17:13
(68) я не привык делать алгоритмы без проверки предварительной. Хочешь делай сразу! что проще проверить и кнопку нажать или насоздавать а потом мосх ипать и чистить все если где то глюк прошел или неправильно.
70 Eugeneer
 
29.08.11
17:14
вот так понажимают кнопок без контроля а потом сидят и дрочатся чтобы найти то что сделало. почистить и заного начинать.
71 Anderson
 
29.08.11
17:15
(65)Все проверки пробелов легко заменить Лист.Rows(Стр).OutlineLevel и получаешь готовую таблицу с уровнями.
72 Eugeneer
 
29.08.11
17:16
к тому же считывание экселя - тормознутая штука. а если ты еще пригрузишь его созданием. то будешь каждый раз процедуру выполнять в случае ошибок по 10 кругу! ну и зачем такое мосх..во?

Лучше считать, а потом записать (в одной транзакции пройдет моментально)
73 Eugeneer
 
29.08.11
17:16
Я видел кучу обработок где делают номенклатуру при считывании ячеек. я за такое бы уволил бы сразу....)))
74 Eugeneer
 
29.08.11
17:18
(71) это если они есть и если есть эксель, на который не каждый хочут 7 тыщ на юзера покупать, которые в нем никуя не делает.
75 izekia
 
29.08.11
17:21
(72)(73) дада, таблицу делать потом из нее создавать справочник - это намного быстрее и эффективнее ... извини, я как-то не подумал
а по поводу уволил - очевидно, отсюда и имеем обработки, которые только с тремя уровнями вложенности работают
76 Eugeneer
 
29.08.11
17:23
(75) да именно так. это будет мгновенно. Зато для отладки супер.
Основная теорема систематики: Новые системы плодят новые проблемы.