Имя: Пароль:
1C
1С v8
1С в Эксель, выедает память
0 AndreyBorovkov
 
26.11.13
12:22
Здравствуйте уважаемые форумчане!
Посоветуйте что можно предпринять в таком случае:
При сохранении отчета (с картинками) занимается много памяти и после сохранения файла память остается занятой (см. фото). Сама процедура такая - сохраняется вся таблица одним методом в эксель , потом открывается этот файл и происходит обход необходимых ячеек в которые вставляется формула).

Оптимизируется както этот процес сохранения или как можно освободить память после сохранения файла?

http://piccy.info/view3/5496659/195d1bf2e5dbfd63bdec54e396331b05/
1 dj_serega
 
26.11.13
12:24
Как сохраняешь?
Может COM не сбрасываешь?
2 AndreyBorovkov
 
26.11.13
12:30
Excel  = New COMObject("Excel.Application");
                ExcelФайл = Excel.WorkBooks.Open(FileName);
                ExcelЛист = Excel.Sheets(1);     //Номер/Название  Листа
                xlCellTypeLastCell = 11;
                
                ExcelПоследняяСтрока = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Row;        
                ExcelПоследняяКолонка = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Column;    //Обход ячеек
                ExcelФайл.Save();
                Excel.Quit();
3 Maxus43
 
26.11.13
12:31
(2) используй Excel.comconnector например
4 Maxus43
 
26.11.13
12:35
тьфу, это к 1с так можно, к экселю через АДОДБ, http://help1c.com/faq/view/166.html

вобще со временем размер должен уменьшится, мусорщики памяти не спят
5 grayshadow
 
26.11.13
12:46
память выжирается, когда срабатывает
ExcelФайл = Excel.WorkBooks.Open(FileName)
?

можно еще добавить ExcelФайл.Close()
6 H A D G E H O G s
 
26.11.13
12:59
(5) Память выжирается, когда формируется отчет с картинками.
7 AndreyBorovkov
 
26.11.13
13:09
Процедура СохранитьВExcellНажатие(Элемент)
    ЭлементыФормы.Индикатор.Значение = 0;
    Если КомпоновщикНастроек.Настройки.Структура[2].Настройки.Выбор.Элементы[4].Использование = Ложь
        Тогда
        БезФото = Истина ;
    Иначе
        БезФото = Ложь;
    КонецЕсли;  
    
    FileDialog = New FileDialog(FileDialogMode.Save);
    FileDialog.FullFileName = "Прайс-лист "+?(ЗначениеЗаполнено(Организация),Организация.Наименование,"")+ " на " + Формат(Период1, "ДЛФ=Д") + " г";
    FileDialog.Filter       = "Excel 2007 (*.xlsx)|*.xlsx";
    
    FileDialog.Multiselect  = False;
    FileDialog.Title        = "Выберите файл";
    
    If FileDialog.Choose() Then
        Состояние("Сохранение файла Microsoft Excel...");        
        Extention = ".xlsx";
        FileName  = Left(FileDialog.SelectedFiles[0], StrLen(FileDialog.SelectedFiles[0]) - StrLen(Extention))+Extention;
        
        //////////////
        ИмяФайла1 = "Прайс-лист на " + Формат(Период1, "ДЛФ=Д") + " г";
        ИмяФайла = Строка(ИмяФайла1);
        //////////////        
        ЭлементыФормы.Результат.Записать(Строка(FileName),ТипФайлаТабличногоДокумента.XLSX);
        
        //Если СГруппировками Тогда
        //    ЭлементыФормы.Индикатор.Значение = 100;
        //    Сообщить("Записан новый файл " + Строка(FileName));
        //КонецЕсли;
        
        Если НЕ СГруппировками Тогда
            Попытка
                Excel  = New COMObject("Excel.Application");
                ExcelФайл = Excel.WorkBooks.Open(FileName);
                ExcelЛист = Excel.Sheets(1);     //Номер/Название  Листа
                xlCellTypeLastCell = 11;
                
                ExcelПоследняяСтрока = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Row;        
                ExcelПоследняяКолонка = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Column;    
                
                //Выясняем номер последней заполненой строки Акционного прайса
                Для Строка1 = 9 По ExcelПоследняяСтрока Цикл
                    Если  ТипЗнч(ExcelЛист.Cells(Строка1, 12).Value) = Тип("Неопределено")     Тогда
                        Прервать;
                    КонецЕсли;
                КонецЦикла;
                КоличествоЗапСтрокАкционногоПрайса =Строка1-1;
                
                Для НомерПП = 9 По КоличествоЗапСтрокАкционногоПрайса Цикл
                    ExcelЛист.Cells(НомерПП,?(БезФото,24,21)).Value=0;    
                    ExcelЛист.Cells(НомерПП,?(БезФото,26,22)).Formula = ?(БезФото,"=RC[-6]*RC[-2]","=RC[-4]*RC[-1]");
                    ЭлементыФормы.Индикатор.Значение = Цел(НомерПП/ExcelПоследняяСтрока*100);
                КонецЦикла;
                
                Для НомерПП = КоличествоЗапСтрокАкционногоПрайса+6 По ExcelПоследняяСтрока Цикл
                    ExcelЛист.Cells(НомерПП,?(БезФото,22,21)).Value=0;    
                    ExcelЛист.Cells(НомерПП,?(БезФото,24,22)).Formula = ?(БезФото,"=RC[-5]*RC[-2]","=RC[-4]*RC[-1]");
                    ЭлементыФормы.Индикатор.Значение = Цел(НомерПП/ExcelПоследняяСтрока*100);
                КонецЦикла;
                /////////////////////////////////////////////////////////////////////////////////////////////    
                //////Если БезФото Тогда  
                //////    ExcelЛист.Cells(3,10).Value = Число(0);
                //////    ExcelЛист.Cells(3,12).FormulaR1C1 = "=SUM(SUM(R[6]C[14]:R["+ПолучитьСтрокуБезЛишнихПробелов(Строка(КоличествоЗапСтрокАкционногоПрайса-3))+"]C[14])*RC[-2]"+"/100,"
                //////    +"SUM(R["+ПолучитьСтрокуБезЛишнихПробелов(Строка(КоличествоЗапСтрокАкционногоПрайса+3))+"]C[12]:R["+ПолучитьСтрокуБезЛишнихПробелов(Строка(ExcelПоследняяСтрока-3))+"]C[12])*RC[-2]"+"/100)";
                //////Иначе
                //////    ExcelЛист.Cells(3,10).Value = Число(0);
                //////    ExcelЛист.Cells(3,12).FormulaR1C1 = "=SUM(SUM(R[6]C[10]:R["+ПолучитьСтрокуБезЛишнихПробелов(Строка(КоличествоЗапСтрокАкционногоПрайса-3))+"]C[10])*RC[-2]"+"/100,"
                //////    +"SUM(R["+ПолучитьСтрокуБезЛишнихПробелов(Строка(КоличествоЗапСтрокАкционногоПрайса+3))+"]C[10]:R["+ПолучитьСтрокуБезЛишнихПробелов(Строка(ExcelПоследняяСтрока-3))+"]C[10])*RC[-2]"+"/100)";
                //////КонецЕсли;    
                Если БезФото Тогда  
                    ExcelЛист.Cells(3,10).Value = Число(0);
                    ExcelЛист.Cells(3,12).FormulaR1C1 = "=SUM(R["+ПолучитьСтрокуБезЛишнихПробелов(Строка(КоличествоЗапСтрокАкционногоПрайса+3))+"]C[12]:R["+ПолучитьСтрокуБезЛишнихПробелов(Строка(ExcelПоследняяСтрока-3))+"]C[12])*RC[-2]"+"/100";
                Иначе
                    ExcelЛист.Cells(3,10).Value = Число(0);
                    ExcelЛист.Cells(3,12).FormulaR1C1 = "=SUM(R["+ПолучитьСтрокуБезЛишнихПробелов(Строка(КоличествоЗапСтрокАкционногоПрайса+3))+"]C[10]:R["+ПолучитьСтрокуБезЛишнихПробелов(Строка(ExcelПоследняяСтрока-3))+"]C[10])*RC[-2]"+"/100";
                КонецЕсли;    
                
                
                ExcelФайл.Save();
                Excel.Quit();
                Сообщить("Записан новый файл " + Строка(FileName));                 
            Исключение
                Message(ОписаниеОшибки(), MessageStatus.Important);
            КонецПопытки;    
        ИначеЕсли СГруппировками Тогда//Если с группировками    
            Попытка
                Excel  = New COMObject("Excel.Application");
                ExcelФайл = Excel.WorkBooks.Open(FileName);
                ExcelЛист = Excel.Sheets(1);     //Номер/Название  Листа
                xlCellTypeLastCell = 11;
                
                ExcelПоследняяСтрока = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Row;        
                ExcelПоследняяКолонка = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Column;    
                Если Не БезФото Тогда
                    Если мКоличествоГруппировок = 3 Тогда
                        КолонкаНаименование = 8;
                        КолонкаЗаказа  = 17;
                        КолонкаСумма  = 18;
                        КолонкаПроцентСкидки  = 10;
                        КолонкаСФормулой =11;
                        КолонкаДляФормулы =7;
                        ПерваяСтрокаАкцПрайса = 15;
                        РазницаМеждуПрайсами = 12; //
                        ПерваяСтрокаАкцПрайсаЕслиПустойПрайс = 12;
                    ИначеЕсли мКоличествоГруппировок = 2 Тогда
                        КолонкаНаименование = 9;
                        КолонкаЗаказа  = 18;
                        КолонкаСумма  = 19;
                        КолонкаПроцентСкидки  = 10;
                        КолонкаСФормулой =12;
                        КолонкаДляФормулы =7;
                        ПерваяСтрокаАкцПрайса = 13;
                        РазницаМеждуПрайсами = 10; //
                        ПерваяСтрокаАкцПрайсаЕслиПустойПрайс =11;
                    ИначеЕсли мКоличествоГруппировок = 1 Тогда
                        КолонкаНаименование = 16;
                        КолонкаЗаказа  = 19;
                        КолонкаСумма  = 20;
                        КолонкаПроцентСкидки  = 10;
                        КолонкаСФормулой =12;
                        КолонкаДляФормулы =8;
                        ПерваяСтрокаАкцПрайса = 11;
                        РазницаМеждуПрайсами = 8; //
                        ПерваяСтрокаАкцПрайсаЕслиПустойПрайс = 10;
                    КонецЕсли;
                    КоординатаФормулыВысота = 3;
                    КоординатаФормулыШирина = 12;
                    ТЗКоординат = Новый ТаблицаЗначений;                          
                    ТЗКоординат.Колонки.Добавить("НачЯч");
                    ТЗКоординат.Колонки.Добавить("КонЯч");
                    Счетчик = 1;
                    ПредСтрока = 1;
                    ПредНачальнаяСтрока = 1;
                    СтрокаФормулы = "";
                    ПустаяПерваяСтрока = Ложь;
                    ПредНомерСтроки = 1;
                    /////////
                    //Если нет акционного товара
                    Если  (ТипЗНЧ(ExcelЛист.Cells(ПерваяСтрокаАкцПрайсаЕслиПустойПрайс, КолонкаНаименование).Value) = Тип("Неопределено")     // поле наименования
                        И ТипЗНЧ(ExcelЛист.Cells(ПерваяСтрокаАкцПрайсаЕслиПустойПрайс, 1).Value) = Тип("Неопределено"))
                        И (ТипЗНЧ(ExcelЛист.Cells(ПерваяСтрокаАкцПрайсаЕслиПустойПрайс+1, КолонкаНаименование).Value) = Тип("Неопределено")
                        И ТипЗНЧ(ExcelЛист.Cells(ПерваяСтрокаАкцПрайсаЕслиПустойПрайс+1, 1).Value) = Тип("Неопределено")) Тогда
                        Если мКоличествоГруппировок = 3 Тогда
                            ПоследняяСтрокаАкцПрайса = ПерваяСтрокаАкцПрайса - 4;
                            ПерваяСтрокаАкцПрайса = ПерваяСтрокаАкцПрайса - 4;
                        ИначеЕсли мКоличествоГруппировок = 2 Тогда
                            ПоследняяСтрокаАкцПрайса = ПерваяСтрокаАкцПрайса - 3;
                            ПерваяСтрокаАкцПрайса = ПерваяСтрокаАкцПрайса - 3;
                        ИначеЕсли мКоличествоГруппировок = 1 Тогда
                            ПоследняяСтрокаАкцПрайса = ПерваяСтрокаАкцПрайса - 2;
                            ПерваяСтрокаАкцПрайса = ПерваяСтрокаАкцПрайса - 2;
                        КонецЕсли;
                    КонецЕсли;
                    ///////////////    
                    Для Строка = ПерваяСтрокаАкцПрайса по  ExcelПоследняяСтрока Цикл    
                        Если  (ТипЗНЧ(ExcelЛист.Cells(Строка, КолонкаНаименование).Value) = Тип("Неопределено")     // поле наименования
                            И ТипЗНЧ(ExcelЛист.Cells(Строка, 1).Value) = Тип("Неопределено")) Тогда
                            
                            Если ПустаяПерваяСтрока И (Строка-1)=ПредНомерСтроки Тогда
                                Прервать;
                            КонецЕсли;
                            ПустаяПерваяСтрока = Истина;
                            ПредНомерСтроки = Строка;
                        КонецЕсли;
                    КонецЦикла;
                    ПоследняяСтрокаАкцПрайса = Строка-2;
                    ////////
                    
                    Для Строка =1 по  ExcelПоследняяСтрока Цикл    
                        Если  (ТипЗНЧ(ExcelЛист.Cells(Строка, КолонкаНаименование).Value) <> Тип("Неопределено")     // поле наименования
                            И ТипЗНЧ(ExcelЛист.Cells(Строка, КолонкаЗаказа).Value) = Тип("Неопределено"))
                            ИЛИ Строка = ExcelПоследняяСтрока Тогда
                            ЭлементыФормы.Индикатор.Значение = Цел(Строка/ExcelПоследняяСтрока*100);
                            Если Строка >= (ПоследняяСтрокаАкцПрайса+РазницаМеждуПрайсами) Тогда //
                                Если Строка > ПредСтрока+1 ИЛИ Строка = ExcelПоследняяСтрока Тогда                                                   
                                    НачальнаяСтрока = "R["+Формат(Строка-КоординатаФормулыВысота,"ЧГ=0")+"]C["+КолонкаДляФормулы+"]";                    
                                    КонечнаяСтрока = "R["+Формат(ПредСтрока-КоординатаФормулыВысота,"ЧГ=0")+"]C["+КолонкаДляФормулы+"]";  
                                    Если Строка = ExcelПоследняяСтрока Тогда
                                        КонечнаяСтрока = "R["+Формат((Строка-1)-КоординатаФормулыВысота,"ЧГ=0")+"]C["+КолонкаДляФормулы+"]";
                                    КонецЕсли;
                                    Если  ПредСтрока <> 1 И ПредНачальнаяСтрока <> 1 Тогда
                                        НоваяСтрока = ТЗКоординат.Добавить();
                                        НоваяСтрока.НачЯч = ПредНачальнаяСтрока;
                                        НоваяСтрока.КонЯч = КонечнаяСтрока;
                                    КонецЕсли;
                                    
                                КонецЕсли;
                                ЕСЛИ Строка <> ExcelПоследняяСтрока Тогда
                                    ExcelЛист.Cells(Строка,КолонкаЗаказа).Value=0;    
                                    ExcelЛист.Cells(Строка,КолонкаСумма).Formula = "=RC[-4]*RC[-1]";
                                КонецЕсли;
                                Счетчик = 1;
                                ПредСтрока = Строка;
                                ПредНачальнаяСтрока = НачальнаяСтрока;
                            КонецЕсли;  //
                            ЕСЛИ Строка <> ExcelПоследняяСтрока Тогда
                                ExcelЛист.Cells(Строка,КолонкаЗаказа).Value=0;    
                                ExcelЛист.Cells(Строка,КолонкаСумма).Formula = "=RC[-4]*RC[-1]";
                            КонецЕсли;
                            
                        КонецЕсли;
                    КонецЦикла;
                    /////////////////////////////////
                    Счетчик = 0;
                    Для Каждого Стр из    ТЗКоординат Цикл
                        Если Счетчик = 0 Тогда
                            СтрокаФормулы = СтрокаФормулы+"SUM("+Стр.НачЯч+":"+Стр.КонЯч+")";
                            Счетчик = Счетчик+1;
                        Иначе
                            СтрокаФормулы = СтрокаФормулы+"+SUM("+Стр.НачЯч+":"+Стр.КонЯч+")";
                        КонецЕсли;
                    КонецЦикла;    
                    СтрокаФормулы1 = СтрокаФормулы;                    
                    СтрокаФормулы = "=SUM("+СтрокаФормулы+")"+"*RC[-"+Строка(КолонкаСФормулой-КолонкаПроцентСкидки)+"]/100";     // и умножаем на процент скидки;
                    ExcelЛист.Cells(3,КолонкаПроцентСкидки).Value = Число(0);
                    ExcelЛист.Cells(3,КолонкаСФормулой).Formula = ?(СтрокаФормулы1="",0,СтрокаФормулы);
                    
                ИначеЕсли БезФото Тогда    ///////////////////////////////////////
                    Если мКоличествоГруппировок = 3 Тогда
                        КолонкаНаименованиеАкц = 8;//
                        КолонкаНаименованиеОсн = 4; //
                        КолонкаЗаказаАкц  = 21;//
                        КолонкаЗаказаОсн  = 19;//
                        КолонкаСуммаАкц  = 23; //
                        КолонкаСуммаОсн  = 21; //
                        КолонкаПроцентСкидки  = 11; //
                        КолонкаСФормулой =12; //
                        КолонкаДляФормулыАкц =11; //
                        КолонкаДляФормулыОсн =9; //
                        ПерваяСтрокаАкцПрайса = 15; //
                        РазницаМеждуПрайсами = 12; //
                        ПерваяСтрокаАкцПрайсаЕслиПустойПрайс = 12;
                    ИначеЕсли мКоличествоГруппировок = 2 Тогда
                        КолонкаНаименованиеАкц = 9;//
                        КолонкаНаименованиеОсн = 8;//
                        КолонкаЗаказаАкц  = 22;//
                        КолонкаЗаказаОсн  = 20;//
                        КолонкаСуммаАкц  = 24;//
                        КолонкаСуммаОсн  = 22;//
                        КолонкаПроцентСкидки  = 11;//
                        КолонкаСФормулой =13;   //
                        КолонкаДляФормулыАкц =11; //
                        КолонкаДляФормулыОсн =9;    //
                        ПерваяСтрокаАкцПрайса = 13; //
                        РазницаМеждуПрайсами = 10; //
                        ПерваяСтрокаАкцПрайсаЕслиПустойПрайс = 11;
                    ИначеЕсли мКоличествоГруппировок = 1 Тогда
                        КолонкаНаименованиеАкц = 11;//
                        КолонкаНаименованиеОсн = 9; //
                        КолонкаЗаказаАкц  = 23;     //
                        КолонкаЗаказаОсн  = 21;     //
                        КолонкаСуммаАкц  = 25;     //
                        КолонкаСуммаОсн  = 23;     //
                        КолонкаПроцентСкидки  = 10;//
                        КолонкаСФормулой =12;      //
                        КолонкаДляФормулыАкц =13; //
                        КолонкаДляФормулыОсн =11; //  
                        ПерваяСтрокаАкцПрайса = 11;//
                        РазницаМеждуПрайсами = 8;  //
                        ПерваяСтрокаАкцПрайсаЕслиПустойПрайс = 10;
                    КонецЕсли;
                    КоординатаФормулыВысота = 3;
                    КоординатаФормулыШирина = 12;
                    ТЗКоординат = Новый ТаблицаЗначений;                          
                    ТЗКоординат.Колонки.Добавить("НачЯч");
                    ТЗКоординат.Колонки.Добавить("КонЯч");
                    Счетчик = 1;
                    ПредСтрока = 1;
                    ПредНачальнаяСтрока = 1;
                    СтрокаФормулы = "";
                    ПустаяПерваяСтрока =Ложь;
                    ПредНомерСтроки = 0;
                    
                    
                    Для Строка = ПерваяСтрокаАкцПрайса по  ExcelПоследняяСтрока Цикл    
                        Если  (ТипЗНЧ(ExcelЛист.Cells(Строка, КолонкаНаименованиеАкц).Value) = Тип("Неопределено")     // поле наименования
                            И ТипЗНЧ(ExcelЛист.Cells(Строка, 1).Value) = Тип("Неопределено")) Тогда
                            
                            Если ПустаяПерваяСтрока И (Строка-1)=ПредНомерСтроки Тогда
                                Прервать;
                            КонецЕсли;
                            ПустаяПерваяСтрока = Истина;
                            ПредНомерСтроки = Строка;
                        КонецЕсли;
                    КонецЦикла;
                    ПоследняяСтрокаАкцПрайса = Строка-2;
                    //Если нет акционного товара
                    Если  (ТипЗНЧ(ExcelЛист.Cells(ПерваяСтрокаАкцПрайсаЕслиПустойПрайс, КолонкаНаименованиеАкц).Value) = Тип("Неопределено")     // поле наименования
                        И ТипЗНЧ(ExcelЛист.Cells(ПерваяСтрокаАкцПрайсаЕслиПустойПрайс, 1).Value) = Тип("Неопределено"))
                        И (ТипЗНЧ(ExcelЛист.Cells(ПерваяСтрокаАкцПрайсаЕслиПустойПрайс+1, КолонкаНаименованиеАкц).Value) = Тип("Неопределено")
                        И ТипЗНЧ(ExcelЛист.Cells(ПерваяСтрокаАкцПрайсаЕслиПустойПрайс+1, 1).Value) = Тип("Неопределено")) Тогда
                        Если мКоличествоГруппировок = 3 Тогда
                            ПоследняяСтрокаАкцПрайса = ПерваяСтрокаАкцПрайса - 4;
                            ПерваяСтрокаАкцПрайса = ПерваяСтрокаАкцПрайса - 4;
                        ИначеЕсли мКоличествоГруппировок = 2 Тогда
                            ПоследняяСтрокаАкцПрайса = ПерваяСтрокаАкцПрайса - 3;
                            ПерваяСтрокаАкцПрайса = ПерваяСтрокаАкцПрайса - 3;
                        ИначеЕсли мКоличествоГруппировок = 1 Тогда
                            ПоследняяСтрокаАкцПрайса = ПерваяСтрокаАкцПрайса - 2;
                            ПерваяСтрокаАкцПрайса = ПерваяСтрокаАкцПрайса - 2;
                        КонецЕсли;
                    КонецЕсли;
                    
                    Для Строка = ПерваяСтрокаАкцПрайса по  (ПоследняяСтрокаАкцПрайса+1) Цикл
                        Если  (ТипЗНЧ(ExcelЛист.Cells(Строка, КолонкаНаименованиеАкц).Value) <> Тип("Неопределено")     // поле наименования
                            И ТипЗНЧ(ExcelЛист.Cells(Строка, КолонкаЗаказаАкц).Value) = Тип("Неопределено"))
                            ИЛИ Строка = ПоследняяСтрокаАкцПрайса+1 Тогда
                            ЭлементыФормы.Индикатор.Значение = Цел(Строка/ExcelПоследняяСтрока*100);
                            Если Строка > ПредСтрока+1 ИЛИ Строка = (ПоследняяСтрокаАкцПрайса+1) Тогда                                                   
                                НачальнаяСтрока = "R["+Формат(Строка-КоординатаФормулыВысота,"ЧГ=0")+"]C["+КолонкаДляФормулыАкц+"]";  &n
8 H A D G E H O G s
 
26.11.13
13:10
колосок мне в носок...
9 AndreyBorovkov
 
26.11.13
13:12
И в конце

                    ExcelЛист.Cells(3,КолонкаПроцентСкидки).Value = Число(0);
                    ExcelЛист.Cells(3,КолонкаСФормулой).Formula = СтрокаФормулы;
                    
                КонецЕсли;//КонецЕсли БезФото
                /////////////////////        
                
                ExcelФайл.Save();
                ExcelФайл.Close();
                Excel.Quit();
                
                Сообщить("Записан новый файл " + Строка(FileName));
            Исключение
                Message(ОписаниеОшибки(), MessageStatus.Important);
            КонецПопытки;
10 Повелитель
 
26.11.13
13:13
(7) Зачем так извращаться?
Не проще было вывести все это в табдок и потом одним нажатием в эксель отправить?
11 grayshadow
 
26.11.13
13:39
вот прям интересно, у кого получалось запихать в эксель формулу, используя типовое сохранение табдока?
12 grayshadow
 
26.11.13
13:48
(6) минутку... в процедуре нету СформироватьОтчет, идет обращение к Результату
значит память жрецца не в процедуре:)
13 AndreyBorovkov
 
26.11.13
13:49
Может причиной быть что все это происходит в "попытке"?
14 grayshadow
 
26.11.13
13:51
и интересно что там за отчет... у меня аналогичный прайс с картинками и характеристиками, порядка 1000 строк, не жрал особо
15 AndreyBorovkov
 
26.11.13
14:03
Отчет скд, 2 вложеные схемы компоновки, картинки плюс формула Сумма = колонка цена * колонка заказ

и формула скидки = поле с процентом скидки * (Сумм(Яейка1:Ячейка2)+Сумм(Яейка3:Ячейка4)+....)/100
И таких сумм штук 50
16 grayshadow
 
26.11.13
14:07
повторюсь: если память жрется при формировании отчета, то процедура выгрузки тут ни при чем
17 AndreyBorovkov
 
26.11.13
14:10
нет! память начинает наростать как снежный ком только после нажатия сохранить в эксель! Отчет формируется как положено!
18 grayshadow
 
26.11.13
14:15
итоговый размер файла какой?
19 AndreyBorovkov
 
26.11.13
14:18
до 10 мб
20 dk
 
26.11.13
14:19
открой/создай книгу
отключи автокальк
пропиши формулы
включи автокальк
21 grayshadow
 
26.11.13
14:21
имхо тут не эксель тупит
на скрине видно, что процессов экселя нет
а интересно чему равен комобъект после application.quit()?
22 AndreyBorovkov
 
26.11.13
14:40
какие свойства интересуют?
23 grayshadow
 
26.11.13
14:51
хм, а он не умер,он все еще комобъект со свойствами
попробуйте Excel  = неопределено
24 AndreyBorovkov
 
26.11.13
14:54
да не умер, сейчас попробую..
25 grayshadow
 
26.11.13
14:56
и кстати почему на исключениях не убивается эксель?:)
26 AndreyBorovkov
 
26.11.13
15:12
(25)  не продумал(

Неа неопрделено не очищает память((((
27 AndreyBorovkov
 
26.11.13
15:13
Приходится 1с перезапускать что б память очистилась
28 AndreyBorovkov
 
26.11.13
15:19
http://us.ua/1285812/
Вот сам выходной отчет
Но обычно формируют в 1500 строк
29 AndreyBorovkov
 
26.11.13
15:42
Опрделили какая строка делает такой "прирост" памяти

        ЭлементыФормы.Результат.Записать(Строка(FileName),ТипФайлаТабличногоДокумента.XLSX);

Но почему память после сохранения не очищается?(((
30 AndreyBorovkov
 
26.11.13
15:44
Даже если сохранять Файл -> сохранить как -> имя.xlsx -> Сохранить
Происходит тоже самое
31 H A D G E H O G s
 
26.11.13
15:47
(30) картинки там потому что.
32 Кирпич
 
26.11.13
15:47
(29) потому что у нас теперь везде ООП и XML, много памяти и мощные процессоры.
33 AndreyBorovkov
 
26.11.13
15:48
(31) Как же так сделать что б память очистилась после сохранения?
34 Кирпич
 
26.11.13
15:49
+(32)да. ещё у нас сборщики мусора есть.
35 Кирпич
 
26.11.13
15:49
(33) жалуйся в 1с. по другому никак
36 H A D G E H O G s
 
26.11.13
15:51
(35) никак.
37 AndreyBorovkov
 
26.11.13
15:53
Пипец(((((
38 Кирпич
 
26.11.13
15:57
(37) а шо вы хотели. 1С она как антивирус. Только антивирус думает, компьютеры существуют для поиска вирусов, а 1с думает, что компьютеры нужны только для 1с.
39 AndreyBorovkov
 
26.11.13
16:01
(38) ))) ох уж эта 1с
40 H A D G E H O G s
 
26.11.13
16:02
Картинка остается в памяти еще жестче, чем просто СложныйОбъект.

СложныйОбъект после потери видимости переводит память в reserved и у меня есть мысли, как это исправить благодаря http://alexander-bagel.blogspot.ru/

Картинка не переводит память в reserved и все, никак.

Можно конечно сделать для процесса EmptyWorkingSet() но я не уверен, что это зашевелит сборщик.
41 Кирпич
 
26.11.13
16:04
(40) сборщик лучше вообще не трогать, я думаю. если он начнет работать, то остановится уже всё.
42 AndreyBorovkov
 
26.11.13
16:11
Спасибо всем за помощь .. жаль конечно что проблема не решаема
43 H A D G E H O G s
 
26.11.13
16:12
(42) Можно попробовать на вас Нетленку 3.0 :-)
44 Кирпич
 
26.11.13
16:14
(42) проблема то решаема. не забивай память и всё.
45 H A D G E H O G s
 
26.11.13
16:19
46 AndreyBorovkov
 
26.11.13
16:23
(43) ??
47 Кирпич
 
26.11.13
16:24
(45) хорошая картинка
48 Кирпич
 
26.11.13
16:25
надо будет на майку такую нафигачить
49 H A D G E H O G s
 
26.11.13
16:26
(46) Отправил на ящик.
50 Кирпич
 
26.11.13
16:27
(46) а откуда у тебя картинки беруться?
51 AndreyBorovkov
 
26.11.13
16:35
(50)

       Пока истина Цикл
           ЭлементРезультата = ПроцессорКомпоновки.Следующий();
          
           Если ЭлементРезультата = Неопределено Тогда
               прервать;
           КонецЕсли;    
           ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
           Если ЭлементРезультата.ЗначенияПараметров.Количество() > 0 Тогда
               ЗначениеВыводимыхДанных = Неопределено;
               Для каждого ЗначениеПараметра из ЭлементРезультата.ЗначенияПараметров Цикл
                   Если ТипЗнч(ЗначениеПараметра.Значение) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда
                       ПоляРасшифровки = ДанныеРасшифровки.Элементы[ЗначениеПараметра.Значение].ПолучитьПоля();
                       Для Каждого ПолеРасшифровки из ПоляРасшифровки Цикл
                           Если ПолеРасшифровки.Поле = ПолеПоКоторомуНеобходимоПолучитьЗначение Тогда
                               ЗначениеВыводимыхДанных = ПолеРасшифровки.Значение;
                               Прервать;
                           КонецЕсли;    
                       КонецЦикла;    
                   КонецЕсли;    
               КонецЦикла;    
               Если ЗначениеЗаполнено(ЗначениеВыводимыхДанных) Тогда
                   Рис = ДокументРезультат.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
                   Рис.РазмерКартинки = РазмерКартинки.РеальныйРазмер;
                   Индекс = ДокументРезультат.Рисунки.Индекс(Рис);
                  
                   Картинка = ЗначениеВыводимыхДанных.ОсновноеИзображение.Хранилище.Получить();
                  
                   Если Не Картинка = Неопределено Тогда
                       ДокументРезультат.Рисунки[Индекс].Картинка = Картинка ;
                       ДокументРезультат.Рисунки[Индекс].РазмерКартинки = РазмерКартинки.АвтоРазмер;
                   Иначе
                       ДокументРезультат.Рисунки[Индекс].Картинка = БиблиотекаКартинок.Справка;
                       ДокументРезультат.Рисунки[Индекс].РазмерКартинки = РазмерКартинки.РеальныйРазмер;
                   КонецЕсли;
                  
                   ВысотаТабДок = ДокументРезультат.ВысотаТаблицы;
                   ОбластьДляКартинки = ДокументРезультат.НайтиТекст("%Картинка%");
                   Если ОбластьДляКартинки <> Неопределено Тогда
                       ДокументРезультат.Рисунки[Индекс].Расположить(ОбластьДляКартинки);    
                       ОбластьДляКартинки.Текст = "%КартинкаДобавлена%"
                   КонецЕсли;
               КонецЕсли;    
           КонецЕсли;    
       КонецЦикла;
52 AndreyBorovkov
 
26.11.13
16:38
(49)
отправьте сюда
[email protected]
53 Кирпич
 
26.11.13
16:43
(51) а они у тебя не гигантские случайно?
54 Кирпич
 
26.11.13
16:47
ну самое тупое решение(если не вникать чо ты там вообще делаешь) - запустить еще один экземпляр 1с, который создаст прайс и захлопнется. по оле или там еще как нибудь.
55 AndreyBorovkov
 
26.11.13
16:54
(54)  Я вот думаю сначала сохранять без картинок а потом открывать и подставлять картинки по ячейкам.
56 Кирпич
 
26.11.13
16:57
ну если 1с картинки потом в памяти не оставляет, то вполне.
57 Кирпич
 
26.11.13
16:58
можно картинки выгрузить в файл и пускай excel их сам вставляет
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.