Имя: Пароль:
1C
1С v8
1C отъедает оперативную память терминального сервера при просмотре картинок
,
0 al_zzz
 
24.03.14
13:52
Процессы 1с пользователей "отъедают" оперативку терминального сервера после того, как пользователи начинают пользоваться подбором номенклатуры (форма подбора помещает изображения товаров во временное хранилище с диска). Уже пытались и чистить его (хранилище) - не помогает. Память не освобождается при этом. Подскажите, пожалуйста, как с этим бороться? Заранее спасибо!
1 H A D G E H O G s
 
24.03.14
13:54
Никак.
2 cons74
 
24.03.14
13:57
если это ут10 - там вроде можно отключить вывод картинки в подборе.
3 Hmster
 
24.03.14
13:58
(0) Переписать подбор по уму или купить нормальное железо. Картинки у вас надеюсь не по 20МБ ?
4 13_Mult
 
24.03.14
14:07
(3)+1 сто пудов метров по 5 не меньше.
У нас как то оракловцы наши пытались вгрузить пикчи не обжатые, лан вовремя заметил. Пережал раз в 7 меньше весить стали (по качеству для 1С пойдет)
5 al_zzz
 
24.03.14
21:28
(1) Если это действительно так, то очень печально. И всё таки...
(2) Это Далион переписанный. Заказчик однозначно будет против отключения картинок в подборе.
(3) Насчет железа ничего тут поделать не могу. Картинки небольшие - не более 1Мб. Можно по-подробнее про подбор. На данный момент у нас так сделан он в плане вывода картинок:
При перемещении по списку номенклатуры заполняется элемент диалога:
ЭтаФорма.ЭлементыФормы.ОсновноеИзображение.Картинка = [code]НайтиВернутьИзображение(ТекТовар.Код);[/code]
Функция из общего модуля:
[code]
Функция НайтиВернутьИзображение(Код)Экспорт
    мПустаяКартинка = Новый Картинка;

    КаталогКартинок = ПолучитьЗначениеИзСохраненныхНастроек("КаталогКартинок");
    Если КаталогКартинок = Неопределено тогда
        Возврат мПустаяКартинка;
    КонецЕсли;
    
    ИмяФайла = КаталогКартинок + "\" +СокрЛП(Код) + ".jpg";
    
    НайденныеФайлы = НайтиФайлы(ИмяФайла);
    
    Если НайденныеФайлы.Количество() = 0 Тогда
        Возврат мПустаяКартинка;    
    Иначе
        
        Попытка
            ПолноеИмяФайла = НайденныеФайлы.Получить(0).ПолноеИмя;
            Изображение = Новый Картинка(НайденныеФайлы.Получить(0).ПолноеИмя, Ложь);
        
            Хранилище = Новый ХранилищеЗначения(Изображение, Новый СжатиеДанных);
            Возврат Хранилище.Получить();
        Исключение
            Возврат мПустаяКартинка;    
        КонецПопытки;
    КонецЕсли;
    
КонецФункции

[/code]
Что здесь надо изменить, чтоб 1с-ка освобождала память?
6 H A D G E H O G s
 
24.03.14
21:33
(5) ничего.

p.s.

убрать вот эту хрень
Хранилище = Новый ХранилищеЗначения(Изображение, Новый СжатиеДанных);
            Возврат Хранилище.Получить();

и делать так

Изображение = Новый Картинка(НайденныеФайлы.Получить(0).ПолноеИмя, Ложь);

Возврат Изображение;
7 H A D G E H O G s
 
24.03.14
21:43
процитирую мои высказывания

Проблема стара, как платформа 8.2.

Утечка (ну или "кэширование") есть. Причем, при достижении порога в 800-900 Мбайт, изображения могут не показываться (печататься) вовсе. Действительно, через несколько минут память сбрасывается (при выполнении произвольного  кода). Но это трудновоспроизводимо. Лечиться использованием ПоляHTMLДокумента, который использует типовой GDI Windows.

На самом деле все не так просто.

Все нижесказанное справедливо для всех "сложных" объектов 1С (ТаблицыЗначений, ТабличныеДокументы, Картинки).

Память не очищается, а переводится из состояния commited в reserved (терминами virtualalloc, ну да ладно), что приводит к следующим эффектам:

1) Диспетчер Windows видит, что память свободна.
2) При повторном выводе даже совершенно другого "сложного объекта". - эти зарезервированные кучи будут использованы.
3) При попытке создания не "сложного объекта", а например, большой строки, XMLЗаписи - эти кучи не использованы и памяти может не хватить.

Данный механизм "кэширования" мне непонятен.
8 H A D G E H O G s
 
24.03.14
21:43
Для временного решения данной проблемы с изображениями могу порекомендовать ПолеHTMLДокумента + хранения изображения во временный файл и его отображение через код:

        Текст=
        "<HTML><HEAD>
        |<META http-equiv=Content-Type content=""text/html; charset=utf-8"">
        |<META content=""MSHTML 6.00.2900.6287"" name=GENERATOR></HEAD>
        |<BODY><IMG src="""+ИмяВременогоФайлаНаОтображение+""" width=400 align=""middle"" border=2></BODY></HTML>";
        
        ЭлементыФормы.ПолеHTMLДокумента.УстановитьТекст(Текст);


Проблема с памятью уйдет, останется только с печатью, так как ПолеHTMLДокумента всегда будет выводить диалог выбора принтера.
9 МихаилМ
 
24.03.14
21:54
(7)(8) спасибо. интересно.
10 al_zzz
 
25.03.14
07:26
H A D G E H O G s, спасибо за помощь!
11 kauksi
 
25.03.14
08:29
(6)-(8) в книгу знаний, однозначно