Имя: Пароль:
1C
1C 7.7
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
Ошибка? Это не ошибка, это системная функция.