Имя: Пароль:
1C
1С v8
Рисунки забивают память
, , , , ,
0 Spider244
 
25.10.11
12:20
Всем Привет!

    Проблема следующая. Есть отчет (обычный, без использования СКД). Макет отчета содержит рисунки. Рисунки заполняются программно. Вот фрагмент кода:

    КартинкаВПамяти=Выборка.Флаг.ДанныеФайла.Получить();      
    Область.Рисунки.Флаг.Картинка=Новый Картинка(КартинкаВПамяти);
    -------------------------------------------------------------
    ТД.Вывести(Область);

    Здесь Выборка - выборка из результата запроса; Флаг - справочник, в котором хранятся рисунки; ДанныеФайла - реквизит справочника типа ХранилищеЗначения, Область.Рисунки.Флаг - рисунок в макете.
    Алгоритм работает прекрасно. Все рисунки отображаются, но проблема в том что оперативная память забивается напрочь. Не сразу, а по мере того как отчет построишь несколько раз. То есть при перестроении отчета (кнопка Сформировать на форме) картинки не удаляются из памяти, хотя табличный документ на форме я очищаю (метод Очистить()). Как это исправить?

    Спасибо за внимание!

    P.S. Конфа самописная. Платформа 8.2.14.
1 vicof
 
25.10.11
12:22
Запоминай свои картинки один раз, а потом их выводи.
2 H A D G E H O G s
 
25.10.11
12:22
Очисть картинки  в таб документе предварительно.
3 Spider244
 
25.10.11
12:26
(1) Отчет строится с различными параметрами, поэтому картинки каждый раз разные. Так что это не вариант.
(2) Пробовал через метод Очистить() коллекции рисунков табличного документа. Результат нулевой.
4 Lama12
 
25.10.11
12:27
(3) Купить больше памяти.
5 Spider244
 
25.10.11
12:28
(4) Очень смешно ))))))))))))
6 Axel2009
 
25.10.11
12:31
а после закрытия открытия формы - память очищается?
7 Spider244
 
25.10.11
12:34
(6) Нет
8 Axel2009
 
25.10.11
12:36
а если для каждого рисунка писать = Новый Картинка;?
9 Spider244
 
25.10.11
12:37
(8) Это как? У меня вроде так и есть.
10 Axel2009
 
25.10.11
12:40
(9) Новый Картинка - фактически пустая картинка. прежде чем очищать таб док пройтись по рисункам и присвоить им это значение
11 Spider244
 
25.10.11
12:46
(10) Попробовал так:

    Для Ном=0 По Результат.Рисунки.Количество()-1 Цикл
         Результат.Рисунки[Ном]=Новый Картинка;
    КонецЦикла;

    Вылетает с ошибкой: Индексированное значение доступно только для чтения
12 Spider244
 
25.10.11
12:52
Вот так рисунки в документе очищаются, но память по прежнему не освобождается:

    Для Ном=0 По Результат.Рисунки.Количество()-1 Цикл
         Рис=Результат.Рисунки.Получить(Ном);
         Рис.Картинка=Новый Картинка;
    КонецЦикла;
13 Spider244
 
25.10.11
12:57
Заметил ещё что память забивается в момент отображения картинки на экране. То есть, если отчет большой и весь не умещается на экране, то при прокрутке его вниз занимаемая память начинает увеличиваться.
14 Spider244
 
25.10.11
13:02
Up.
15 Spider244
 
25.10.11
14:06
Вверх.
16 Иван Болван
 
25.10.11
14:33
8.2 ещё сырая
17 Spider244
 
25.10.11
14:39
(16) Ну не на столько же.
18 Axel2009
 
25.10.11
14:39
(17) да они только в 8.2.14 научились с монохромными рисунками работать.
19 Spider244
 
25.10.11
14:43
Короче все предлагают сдаться?
20 Axel2009
 
25.10.11
14:48
уменьшай размер рисунков. у нас прайсы подбирают по картинкам в 8.2.13. и проблем вроде не было. но мы сделали ограничение на размер файла, он получается порядка 70-100КБ
21 qeos
 
25.10.11
14:50
(12) чейто она должна очищаться?
во-вторых ты создаешь одинаковые рисунки? или _все_ "Новый Картинка(КартинкаВПамяти)" разные?
22 Spider244
 
25.10.11
14:52
(21) Все разные.
23 qeos
 
25.10.11
14:53
(22) думаю надо Рис.Картинка=Неопределено;
24 Spider244
 
25.10.11
14:53
(20) У меня рисунки в среднем порядка 20КБ весят, куда уж меньше.
25 qeos
 
25.10.11
14:55
(24) тогда грузи не все картинки, а только выводимые..
26 Spider244
 
25.10.11
14:56
(25) Они все выводимые.
27 qeos
 
25.10.11
14:58
(26) все? сколько их? 20?
28 Spider244
 
25.10.11
15:02
(27) В базе порядка 1500 картинок. Запрос можно составить таким образом что и все придется выводить. Сейчас я тестирую запрос, который выдает 40 картинок.
29 Spider244
 
25.10.11
15:18
Up.
30 Axel2009
 
25.10.11
15:21
Для Ном=0 По Результат.Рисунки.Количество()-1 Цикл
         Результат.Рисунки[Ном].Картинка=Новый Картинка;
    КонецЦикла;
а так?
31 Axel2009
 
25.10.11
15:22
(30)+сори, не заметил, что уже есть
32 kuza2000
 
25.10.11
15:30
По описанию очень похоже на типичную утечку памяти. Необходимо сообщить разработчикам платформы, что бы пофиксили этот баг.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан