|
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
|
||||
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
|
(44) А ты хитрец! http://cs411625.userapi.com/v411625700/388e/ozkSBllIgxU.jpg
|
|||
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
|
||||
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 их сам вставляет
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |