|   |   | 
| 
 | 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     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |