Имя: Пароль:
1C
1С v8
Подчиненные строки дерева в таблицу значений
,
0 STAYEKR
 
27.09.12
14:56
1. я знаю как и подскажу 0% (0)
2. я не знаю как но попробую 0% (0)
3. многабукафниасилил 0% (0)
4. я тупо сижу на ветке 0% (0)
5. я не буду подсказывать, нубье маст дай!!11 0% (0)
Всего мнений: 0

Всем добра! Стоит задача выгрузки данных 1с в ексель. Выгрузка осуществляется некорректно, т.к. выгружаются только "родительские" строки. Возник вопрос: как сделать так, чтобы выгружались и вложенные строки? Использую следующий код (нашел в инете):

Процедура ВыгрузитьРезультатВExcel(ТаблицаРезультата)
//ЦЕЛЬ: Выгрузить данные табличной части формы в файл Excel
   Попытка
       ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
   Исключение
       Предупреждение(ОписаниеОшибки() + Символы.ПС + "программа OpenOffice не установлена на данном компьютере!");
       Возврат;
   КонецПопытки;
   Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
   Свойства = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
   Свойства.Name = "AsTemplate";
   Свойства.Value = Истина;
   Args = Новый COMSafeArray("VT_VARIANT", 3);
   Args.SetValue(0, Свойства);
   Свойства1 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
   Свойства1.Name = "Hidden";
   Свойства1.Value = Истина;
   Args.SetValue(1, Свойства1);
   Document = Desktop.LoadComponentFromURL("private:factory/scalc", "_blank", 0, Args);
   Sheets = Document.getSheets();
   Sheet = Sheets.getByIndex(0);
   мИтКол = 0;
   Для каждого кол из ТаблицаРезультата.Колонки Цикл
       Sheet.getCellByPosition(мИтКол,0).setString(кол.Имя);
       мИтКол = мИтКол + 1;
   КонецЦикла;
   
   ВсегоСтрок = ТаблицаРезультата.Количество();
   ВсегоКолонок = ТаблицаРезультата.Колонки.Количество();
   МассивКОМ = Новый COMSafeArray("VT_VARIANT", ВсегоСтрок,ВсегоКолонок);
   иткол = 0;
   итстр = 0;

   Для каждого стр из ТаблицаРезультата Цикл                                      
       Для каждого кол из ТаблицаРезультата.Колонки Цикл
           стрРез = СокрЛП(стр[кол.Имя]);
           МассивКОМ.SetValue(итстр,иткол,стрРез);
           иткол = иткол+1;
        КонецЦикла;
       иткол = 0;
       итстр = ?(итстр=ВсегоСтрок,0,итстр+1);
   КонецЦикла;
   begCol = 0;
   begRow = 1;
   endCol = ВсегоКолонок-1;
   endRow = ВсегоСтрок;
   Range = Sheet.getCellRangeByPosition(begCol, begRow, endCol, endRow);
   Range.setDataArray(МассивКОМ);
   //Document.storeToURL(ПривестиФайлКУРЛ(ПутьКФайлу),Args);
   Свойства2 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
   Свойства2.Name = "FilterName";
   Свойства2.Value = "MS Excel 97";
   Args.SetValue(2,Свойства2);
   Document.GetCurrentController().GetFrame().GetContainerWindow().SetVisible(Истина);
КонецПроцедуры;

Буду признателен за любую помощь
1 STAYEKR
 
27.09.12
14:59
+(0) при этом выводить "корневую" строку не надо. А с этим кодомона выводится
2 Азат
 
27.09.12
15:00
(0) идею могу подсказать за косарик
3 Азат
 
27.09.12
15:00
слово РЕ-КУР-СИЯ ни о чем не говорит?
4 STAYEKR
 
27.09.12
15:01
(2) Косарика у меня нету, любезнейший. Рекурсия - страшное слово, мало о чем говорит
5 Мимо Проходил
 
27.09.12
15:03
(3) Чтобы понять рекурсию, надо понять рекурсию (с) не мое
6 STAYEKR
 
27.09.12
15:03
(3) но от Вашей идейки не отказался бы!
7 Maxus43
 
27.09.12
15:04
зачем именно дерево выгружать? выгружай ТЗ с добавлением колонки "Родитель" типа таго
8 STAYEKR
 
27.09.12
15:06
(3) про рекурсия прочитал, проникся. А при чем здесь она?
(7) можно примерчик, уважаемый?
9 STAYEKR
 
27.09.12
15:07
(7)я в отдельной процедуре перегоняю ДЗ в ТЗ, а ТЗ потом уже выгружаю в ОО.
10 zladenuw
 
27.09.12
15:07
При работе с деревом главное понять, что каждая строка дерева это коллекция подчиненных строк (возможно пустая)
11 Maxus43
 
27.09.12
15:08
(9) ну фигово перегоняеш, если строк подчинённых нет
12 STAYEKR
 
27.09.12
15:09
(10) я догадываюсь об этом. Только не могу понять, как выгружать вложенные строки, а не родительскую.
13 STAYEKR
 
27.09.12
15:10
Вот так перегоняю. Что не так?


Функция ВыгрузитьДеревоЗначенийВТаблицуЗначений(ДеревоЗаказы, ТаблицаРезультата)
   Если ТаблицаРезультата = Неопределено Тогда
       ТаблицаРезультата = Новый ТаблицаЗначений;
       Для Каждого Колонка Из ДеревоЗаказы.Колонки Цикл
           ТаблицаРезультата.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
       КонецЦикла;
   КонецЕсли;
   Для Каждого СтрокаДерева Из ДеревоЗаказы.Строки Цикл
       ЗаполнитьЗначенияСвойств(ТаблицаРезультата.Добавить(), СтрокаДерева.Строки);
       //ВыгрузитьДеревоЗначенийВТаблицуЗначений(СтрокаДерева, ТаблицаРезультата);
   КонецЦикла;
   Возврат ТаблицаРезультата;
КонецФункции;
14 Kashemir
 
27.09.12
15:11
Процедура ОбходимДЗ(Строки)
Для каждого Строка из Строки Цикл
Если Строка.Строки.Количество() = 0 Тогда
// это нижняя ветка
Иначе
ОбходимДЗ(Строка.Строки);
КонецЕсли;
КонецЦикла
КонецПроцедуры

ОбходимДЗ(ДеревоЗначение.Строки);
15 zladenuw
 
27.09.12
15:11
16 STAYEKR
 
27.09.12
15:13
(15) Спасибо, но не осилил.
(14) Это для перегона из ДЗ в ТЗ?
17 Kashemir
 
27.09.12
15:14
(16) Неа - просто получение "кроны" дерева.
18 КуплюКровать
 
27.09.12
15:15
нужно учить одно из двух слов: рекурсия, косарик
19 STAYEKR
 
27.09.12
15:22
(18) Косарик поможет осуществить твою голубую мечту?
(17) "Крона" уже с вложенными строками будет?
20 STAYEKR
 
27.09.12
15:27
Помогите нубу, гуры и гурии!
21 Kashemir
 
27.09.12
15:28
Процедура ОбходимДЗ(Строки)
Для каждого Строка из Строки Цикл
Если Строка.Строки.Количество() = 0 Тогда
// в переменной Строка ветка самого нижнего уровня... без подчиненных
Сообщить("Прувет - я мелкая Ветка ");  
Иначе
// здесь в переменной Строка ветка, имеющая подчиненные
Сообщить("Хеллоу - я большаяВетка");
ОбходимДЗ(Строка.Строки);
КонецЕсли;
КонецЦикла
КонецПроцедуры

ОбходимДЗ(ДеревоЗначение.Строки);
22 STAYEKR
 
27.09.12
15:37
(21) Прошу прощения за откровенную тупежку, но никак не пойму, что нужно писать в закомментаренных Вами областях :(
23 Kashemir
 
27.09.12
15:43
(22) В закомментаренных областях переменная Строка принимает последовательно (в иерархии) значения каждой ветки дерева. Следовательно можно вставить нужный обработчик для строки
24 STAYEKR
 
27.09.12
15:56
(23) Беда. Как эту иерархию описать?
25 Kashemir
 
27.09.12
16:00
Представь себе дерево:

Элемент 1
- Элемент 1.1
- Элемент 1.2
-- Элемент 1.2.1
-- Элемент 1.2.2
--- Элементы 1.2.2.1
-- Элемент 1.2.3
- Элемент 1.3
Элемент 2
- Элемент 2.1


Именно в током порядке как видишь и будет осуществлен обход дерева приведенной функцией. Так где стоят комментарии, переменная Строка принимаем значение Элемент N

Может хоть так понятнее ?
26 STAYEKR
 
27.09.12
16:04
Дерево себе представляю. Из Ваших постов понял (возможно, ошибочно), что в зависимости от "Строка.Строки.Количество()" циклом должны обходится либо вложенные ветки, либо родительские. Так? Если так, то не могу себе представить сам цикл
27 STAYEKR
 
27.09.12
16:06
+(26) т.е. ЧТО должно быть написано в каждом случае (кол-во = о и иначе)
28 Kashemir
 
27.09.12
16:08
(27) Проверка на количество подчиненных нужна в случае если надо разделить обработчики конечных строк и имеющих подчиненные. Если такового не требуется

Процедура ОбходимДЗ(Строки)
Для каждого Строка из Строки Цикл

// вставляем обработчик для Строка
// ...

ОбходимДЗ(Строка.Строки);
КонецЕсли;
КонецЦикла
КонецПроцедуры

ОбходимДЗ(ДеревоЗначение.Строки);
29 STAYEKR
 
27.09.12
16:41
Для Каждого СтрокаДерева Из ДеревоЗаказы.Строки Цикл
Для н=0 по ДеревоЗаказы.Строки.Количество()-1 Цикл
ЗаполнитьЗначенияСвойств(ТаблицаРезультата.Добавить(), СтрокаДерева.Строки[н]);
КонецЦикла;
КонецЦикла;

не так должно примерно выглядеть?
30 Kashemir
 
27.09.12
16:42
(29) А где рекурсивный вызов ? Ну обойдешь ты первый уровень ... а глубже ?
31 vmv
 
27.09.12
16:44
тупая ветка
32 STAYEKR
 
27.09.12
16:45
Вот и не знаю :( Поэтому, собсно, обратился. ПомогЁте?
33 STAYEKR
 
27.09.12
16:45
(31) Не спорю. От Ваших гениальных постов она умней не станет, дядя
34 Kashemir
 
27.09.12
16:46
(32) Ты не в состоянии использовать готовое решение. Не вижу чем тут еще можно помочь.
35 STAYEKR
 
27.09.12
16:47
(34) Большое спасибо за потраченное на меня время! Буду курить матан
36 STAYEKR
 
27.09.12
16:49
(34) рекурсивный вызов это вызов процедуры в самой себе?
37 Kashemir
 
27.09.12
16:50
(36) Да
38 STAYEKR
 
27.09.12
16:51
Запилил так: (процедра называется "ВыгрузитьДеревоЗначенийВТаблицуЗначений(ДеревоЗаказы, ТаблицаРезультата)")

Для Каждого СтрокаДерева Из ДеревоЗаказы.Строки Цикл
   Для н=0 по ДеревоЗаказы.Строки.Количество()-1 Цикл
       ЗаполнитьЗначенияСвойств(ТаблицаРезультата.Добавить(), СтрокаДерева.Строки[н]);
       ВыгрузитьДеревоЗначенийВТаблицуЗначений(ДеревоЗаказы, ТаблицаРезультата);
   КонецЦикла;
КонецЦикла;


Рухнуло все и 1с закрылась :(
39 vmv
 
27.09.12
16:52
(36) его уже в школе в старших классах учат, зачем ты с 5-го решил заняться программированием, подрасти надо
40 STAYEKR
 
27.09.12
16:54
(39) А я люблю сразу со сложного начинать. Вот сидел, беседовал с мудрым человеком. А тут рррраз! и Наимудрейший самый ценный в этой ситуации Секрет открыл! Расти, говорит, надо! Спасибо огромное! Жизнь моя отныене никогда не будет прежней! Спасибо!
41 vmv
 
27.09.12
16:55
(40) главное - скажи нет наркотикам и все получиться)
42 STAYEKR
 
27.09.12
16:56
(37) в (38) суть верна? Не могу проверить, падает 1с :(
43 STAYEKR
 
27.09.12
16:57
(41) Я с постижением Великой Истины сказал нет всему: еде, друзьям, сну. На наркотики и раньше не было времени, куда уж теперь
44 vmv
 
27.09.12
16:58
ВыгрузитьДеревоЗначенийВТаблицуЗначений(ДеревоЗаказы

ты в рекурсию передаешь тот же узел, что вошел в текущий вызов и как итог зацикленность и падение, я же говорю расти надо
45 STAYEKR
 
27.09.12
16:58
(44) Спасибо. А как же её тогда вызывать, енту рекурсию?
46 vmv
 
27.09.12
16:59
(45) загуглить и найти на викии статью "Рекурсия для самых маленьких"
47 STAYEKR
 
27.09.12
17:01
(46) в вики про рекурсию все ясно. Даже для не самых маленьких. А в 1С не совсем. Думаю, подсказав чуток, Добрый Дядя приблизил бы Юного Падавана к изучению Матана.
48 Kashemir
 
27.09.12
17:02
(45) Падает очевидно потому что зацикливается. Как вызывать смотри (14) (21) (28)
49 vmv
 
27.09.12
17:03
(47) рекурсия в Африке рекурсия и нечего врать, что в 1С она по другим правилам работает

и я не потакаю лени, хотел написать и тупости тоже, но это будет не политкорректно
50 STAYEKR
 
27.09.12
17:05
(49) а что же так несмело? или боитесь, что пативен выедет в НЭзалЭжну? Так и написали бы. Я не говорю, что в 1С она работает по другому. Пршу ткнуть носом посильнее в то место, где её внедрить.
51 Kashemir
 
27.09.12
17:06
По мотивам (13) твое творения должно выглядеть примерно так:


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

   ОбходимДЗ(ДеревоЗаказы.Строки, ТаблицаРезультата);
       Возврат ТаблицаРезультата;
КонецФункции;



Процедура ОбходимДЗ(Строки, ТЗ)
   Для каждого Строка из Строки Цикл
       ЗаполнитьЗначенияСвойств(ТЗ.Добавить(), Строка);
       ОбходимДЗ(Строка.Строки, ТЗ);
   КонецЦикла;
КонецПроцедуры
52 vmv
 
27.09.12
17:06
(50) на понт меня решил взять, щенок?)

тебя уже ткнули и не раз, до свидания
53 STAYEKR
 
27.09.12
17:11
На кол бы Вас взять, дядя. прямо неполиткорректной хохляцкой ж*пой, да погулбже! А вообще, в хохлостане, я гляжу, все боксеры! Кто в Раде, кто по-переписке! Неунывающие такие пенсионеры))
54 vmv
 
27.09.12
17:13
(53) да я живу в демократической стране, в которой каждый имеет право быть клоуном - не завидуй!)
55 STAYEKR
 
27.09.12
17:15
(54) Не забудьте, пожалуйста, принять свой галоперидол. Сегодня лучше даже двойную дозу. До свидания!
56 vmv
 
27.09.12
17:16
(55) пока, карапуз)
57 STAYEKR
 
27.09.12
17:22
(51) Огромное спасибО! Все работает! Еще раз благодарю за потраченные нервы и время!
58 Stim
 
27.09.12
17:23
деньги в кассу форума занесите, не забудьте
59 STAYEKR
 
27.09.12
17:27
(58) а вы не подмазывайтесь, гражданин! Вот заебдетесь также, тогда поговорим