|
v7: Excel через OLE вылетает | ☑ | ||
---|---|---|---|---|
0
Aristo
26.12.13
✎
12:25
|
Добрый день. Есть большой отчет, который на выходе заполняет книгу Excel из 7 листов, в последнюю очередь заполняется 1 лист с диаграммами. Данных много, до 1000 строк в каждом листе.
Примерно в 50% случаев Excel вылетает с ошибкой и выбивает 1С. Вылетает на разных местах, на разных листах. На разных компьютерах и даже на разных копиях базы. В других 50% случаев отрабатывает до конца. В чем может быть проблема ? В какую сторону хотя бы смотреть ? |
|||
1
Aristo
26.12.13
✎
12:30
|
Ексель = СоздатьОбъект("Excel.Application");
Ексель.DisplayAlerts = 0; Ексель.Workbooks().Close(); СделатьПаузу(5); Ексель.DisplayAlerts = 1; //Ексель = СоздатьОбъект("Excel.Application"); Ексель.Visible = -1; //Ексель.Visible = -1; Книга = Ексель.WorkBooks.Open(КаталогИБ()+"ШаблонОтчета.xls"); // Книга.Visible=0; ИмяФайла = КаталогВременныхФайлов()+"УниверсальныйОтчет_"+СтрЗаменить(Строка(ДатаКонцаОтчета),".","_")+"__"+СтрЗаменить(ТекущееВремя(),":","_")+".xls"; Книга.SaveAs(ИмяФайла); ЛистДиаграммы = Книга.Sheets(1); ЛистДни = Книга.Sheets(2); ЛистНедели = Книга.Sheets(3); ЛистМесяцы = Книга.Sheets(4); ЛистКварталы = Книга.Sheets(5); ЛистДоговоры = Книга.Sheets(6); ЛистСпрос = Книга.Sheets(7); //Перейти ~Метка; //ПодготовитьРазмерЛистов(); //Ексель.Visible = -1; //Возврат; //СделатьПаузу(5); ... дальше идет заполнение листов, с 2 по 7, затем заполнение 1го листа. |
|||
2
dk
26.12.13
✎
12:32
|
может ты в коде через activesheet, activecell, activebook ..
а в это время пользователь играется тоже с excel |
|||
3
DJ Anthon
26.12.13
✎
12:33
|
может, антивирь...
|
|||
4
Aristo
26.12.13
✎
12:44
|
Отрубал. Грешу что памяти не хватает, где то протечка. Потому что отрубается в основном на последних листах
Пробую сейчас засейвить файл после каждого листа |
|||
5
Aristo
26.12.13
✎
12:45
|
(2) ActiveSheet,ActiveBook не используется, это можно увидеть по коду
|
|||
6
Aristo
26.12.13
✎
12:47
|
Сделал Книга.Save() после каждого листа, теперь вылетает не в 50, а в 20% случаев. Видимо, несохраненные сделанные через OLE изменения жрут память.
|
|||
7
aka AMIGO
26.12.13
✎
12:48
|
(6) а тебе обязательно весь отчет надо запихнуть в один Excel-файл?
|
|||
8
dk
26.12.13
✎
12:50
|
ну видимость то поставил
не работает-то у тебя, когда по клаве и мышке не стучат, или у пользователя? |
|||
9
dk
26.12.13
✎
12:52
|
да и Перейти ~Метка; как-то настораживает
|
|||
10
Aristo
26.12.13
✎
12:52
|
(8) от видимости не зависит
(7) требование заказчика. Кроме того, ячейки связаны формулами с диаграммами, параметры которых тоже выставляются через OLE |
|||
11
Aristo
26.12.13
✎
12:52
|
(9) сорри, это последствия отладки
в рабочей версии этого нет, что не мешает глючить |
|||
12
Aristo
26.12.13
✎
12:53
|
(9) и уж тем более что пугаться, если это закомментировано.
|
|||
13
dk
26.12.13
✎
12:54
|
хз, освобождай ненужные переменные
приведи хоть текст ошибок-то --- есть рабочий отчет с 20-30 листами (правда там строк мало) |
|||
14
Aristo
26.12.13
✎
12:55
|
(13) да обычное окошко смерти (память не может быть read), excel при этом зависает
|
|||
15
пипец
26.12.13
✎
12:58
|
если во время заполнения листов работают какие то функции и вычисления - выкинь нафик их в предзаполнение ТЗ
тоесь вычисляй и заполняй ТЗ и только потом наполняй ексель из уже имеющихся значений ЗЫ СделатьПаузу ??? это чоу /вайщефингня |
|||
16
dk
26.12.13
✎
12:59
|
с DEP поиграться
|
|||
17
Aristo
26.12.13
✎
13:01
|
Парни, мне кажется я понял. На будущее напишу, возможно кому - то поможет.
Save() во временный файл несколько раз между заполнения листов и посередине большого листа в данный момент решил проблему. До этого сохранение было пустого шаблона перед началом заполнения и затем вывод на экран. Вылетало. После изменения - при 20 запусках не вылетел. Похоже ошибка вызывается из-за переполнения кеша истории изменений. Каждое действие у нас запоминается и его можно стрелкой откатить. Видимо, построчное заполнение убивало этот буфер и выбивало 1С. Save() этот буфер очищает. Добрый, добрый майкрософт :))) |
|||
18
Aristo
26.12.13
✎
13:07
|
(15) СделатьПаузу() это фича Formex, на глюки не влияет, как раз была попытка решить с помощью него. Ни холодно ни жарко. Уберу.
С функциями и вычислениями так и делается. По каждому листу заполняется индексированная таблица значений (из 1С++), эта часть работает безукоризненно. Листы заполняются уже линейно из таблицы, без вычислений. Единственное что - лист при создании берется из шаблона, там есть еще ячейки которые не заполняются программно, а рассчитываются по формулам из текущих. Откуда идет глюк - уже есть гипотеза (промежуточный save спасает), она не связана с формулами ячеек и расчетом данных. |
|||
19
dk
26.12.13
✎
13:09
|
(17) странная теория тогда заполнение листа 4-8 тыс строк на 30-40 колонок вообще должно Excel в ступор вгонять, но этого не происходит
кстати можно еще автокалькуляцию попробовать отключить и включить в конце, особенно если формулы сложные типа впр или другие по работе с массивами |
|||
20
Aristo
26.12.13
✎
13:13
|
(19) да это просто гипотеза, возможно это и автокалькуляция.
Потому что как раз 3000 срок и 30 колонок, из которых навскидку 20 заполняется а 10 рассчитывается. Хоть там и просто сложение, но массовость может повлиять Попробую отключить. |
|||
21
Aristo
26.12.13
✎
13:14
|
(19) а как кстати отключить и включить ? если навскидку не помнишь - не отвечай, я погуглю
|
|||
22
dk
26.12.13
✎
13:16
|
Application.AutoCalculation = ...
как-то так выключать после открытия книги |
|||
23
Aristo
26.12.13
✎
13:24
|
(22) а вот нет, поставил автокалькуляцию, убрал save() и все вылетать начало.
|
|||
24
Torquader
27.12.13
✎
00:34
|
(22) Её выключить в начале, а потом в конце - включить.
Тоже можно проделать и с обновлением (рисованием) - особенно печальна отработка рисования диаграмм, когда их отрисовывает отдельный процесс - он-то и теряет ссылки - просто Save вносит задержку при выполении, и кто-то успевает всё отрисовать. |
|||
25
DES
27.12.13
✎
01:31
|
Попробуй отключить в реестре стек откатов http://www.excel2003.ru/uvelichenie-kolichestva-otkatov-v-excel.html
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |