Имя: Пароль:
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
По описанию очень похоже на типичную утечку памяти. Необходимо сообщить разработчикам платформы, что бы пофиксили этот баг.
Программист всегда исправляет последнюю ошибку.