Имя: Пароль:
1C
1С v8
Excel.Application слишком медленно работает
,
0 terr
 
01.11.11
09:08
Нужно сделать прайс с кучей колонок для номенклатуры (over9000 позиций)
при этом по группам сделать раскрывающиеся группировки и прочие ништяки с форматированием.

Беда в том, что в цикле по выборке идет запись значений в ячейки - ну как в большинстве случаев и делают через COM-объект... Вот эта вся процедура занимает просто тучу времени.

Вопрос - можно ли как-то сделать в табдок предварительный прайс а потом каким-то образом скопировать через буфер обмена и вставить в экселевский лист?  Есть примеры кода богатырского?
1 terr
 
01.11.11
09:09
ну понятно, что скорее всего форматирование потом придется доделывать отдельно, но это все равно уже проще... Интересует этап "скопировать-вставить"
2 Александр_
Тверь
 
01.11.11
09:12
а почему нельзя таб док сохранить в экселе? не подходит?
3 Александр_
Тверь
 
01.11.11
09:15
ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS) не подходит?
4 SuperMario
 
01.11.11
09:15
(1) +1
5 бомболюк
 
01.11.11
09:18
Можно читать/писать данные диапазонами (Range). Получается очень быстро.
6 terr
 
01.11.11
09:44
дело в том что экселевский прайс содержит еще ряд листов, формул, макросов, гиперссылок. По любому придется копипастить
7 vmv
 
01.11.11
09:46
(6) конечно, делать программный вывод в экзел из 1С, подписываясь на макросы и формулы - это абсурд.
8 terr
 
01.11.11
09:46
(5) а как именно?
(6) есть устоявшаяся форма прайса к которой привыкли клиенты. Менять ее не хотят
9 smaharbA
 
01.11.11
09:53
Иассив=Диапазон.Value;
10 KishMish
 
01.11.11
09:56
можно сделать макрос в шаблоне екселя и вызывать его с передачей параметров по каждой колонке.
за раз всю строку.
11 manyak
 
01.11.11
10:41
(1) слишком медленно работает - это сколько конкретно по времени?

до начала работы с прайсом отключай обн. экрана и пересчет формул:
excell.Calculation = -4135
excell.screenupdating = false


после окончания включи обратно:
excell.screenupdating = true
excell.Calculation = -4105

значительно ускорит процесс формирования
12 izekia
 
01.11.11
10:44
(0) можно хмлтаблицу формировать, правда как я понял технология уже не модная, но поддерживаться будет
из минусов - там нельзя сделать раскрывающиеся группировки, те только доп обработкой, все остальное формируется и читается достаточно быстро
13 izekia
 
01.11.11
10:45
(11) да судя по (0) нет у него там пересчетов, тупо данные
14 mikecool
 
01.11.11
10:45
если надо только через олю, то - выводить сначала данные, а оформлять уже в конце - ускорение наблюдал до двух порядков
15 izekia
 
01.11.11
10:47
(!4) за счет того что оформление применяется сразу ко всей таблице?)
16 manyak
 
01.11.11
10:47
идет запись значений в ячейки - excell.screenupdating=true хорошо замедляет работу.
Два основных момента:
1) Обновление - перерисовка экрана
2) Обновление - пересчет формул
17 mikecool
 
01.11.11
10:48
(15) именно
18 mikecool
 
01.11.11
10:49
+17 ибо выводил прайсы по 200-300 тыщ строк с разбивкой по листам
офрмление при выводе занимало часа полтора, после вывода на всю таблицу - минут до 20
19 izekia
 
01.11.11
10:49
(16) вроде когда у приложения визибл = фалс ... то это ни на что не влияет ... насколько я помню
20 izekia
 
01.11.11
10:51
ну и комсейфмассив никто не отменял, судя по (0) это то что и нужно
21 KishMish
 
01.11.11
10:55
еще можно сформировать в 1с. сохранить как ексель. и через оле вставить/подменить нужный лист в шаблоне.
22 terr
 
01.11.11
10:58
(11) проверил спасибо, но ускорение составило не более 5%
а висибл сразу false стоял, чтоб не перерисовывало

(21) - вот это я и хочу узнать - как?
23 izekia
 
01.11.11
11:05
(22) своего поста не нашел
но вот что-то в тему v8: А вы знали, что можно так вот хитро ускорить выгрузку в Эксель?
вкратце можно данные сохранять как чистый хмл и потом на основе какого-то шаблона производить хслт преобразование и получать нужный документ, минус, как я уже писал в (12) - отсутствие разворачивающихся группировок
24 KishMish
 
01.11.11
11:17
(22) вот этот кусок у меня на 8 работает
ДобавляемыйФайл=Excel.WorkBooks.Open(ВременнаяПапка+НужноеИмяФайла);                
ДобавляемыйФайл.Sheets(1).Copy(,НоваяКнига.Sheets(НоваяКнига.Sheets.Count));          
НоваяКнига.Sheets(НоваяКнига.Sheets.Count).Name=Название;            
ДобавляемыйФайл.Close();
25 smaharbA
 
01.11.11
14:18
в ветке готовый код, автору нас рать
26 Паланик
 
01.11.11
14:27
(22)
1. У меня та же беда была, раньше прайс фигачился за час-полтора, теперь минут 5-10, юзал отключение прорисовки скрина и пересчет формул, как советует manyak в (11).
2. в (3) намисано.
27 terr
 
02.11.11
02:12
Спасибо всем