Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ПолеКартинки, что делаю не так?
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
onsamuy
Платформа 8.2.16.368, имеется форма, на форме имеется поле картинки, также табличное поле ТПСписокФайловКартинокСерфитикатов.
в табличном поле при активизации строки выполняется код:
Процедура ТПСписокФайловКартинокСерфитикатовПриАктивизацииСтроки(Элемент)
    
    Изображение = Новый Картинка(ИмяКаталогаИзображений+"\"+Элемент.Текущаястрока.Файл);
    ЭлементыФормы.ПолеКартинки.Картинка = Изображение;    
    
КонецПроцедуры


то есть, в каталоге ИмяКаталогаИзображений имеются bmp файлы изображений, которые таким образом выводятся в поле картинки. При активизации строки (вывод изображения на поле картинки) увеличивается объем процесса 1сv8.exe на 20 Мб. Таким образом, при переходе по строкам, через минуту объем процесса с 200 Мб вырастает до 1 000 Мб. Почему переменная Изображение не обнуляется? По идее каждый раз при выводе строки она должна сбрасываться?
logist
Попробуйте в начале процедуры указать
ЭлементыФормы.ПолеКартинки.Картинка = Неопределено;
onsamuy
Ругается на несоответствие типов. Но даже если я присваиваю
ЭлементыФормы.ПолеКартинки.Картинка = БиблиотекаКартинок.Пустая;
все равно процесс разрастается. Порылся на форумах, похоже это глюк платформы. Можно провести эксперимент, откройте Элемент справочника Номенклатура в УТП, Кликните на картинку номенклатуры, выберите какое либо изображение, даже не сохраняйте, кликните еще раз, выберите изображение. И так повторите раз 10-20. Откройте диспетчер задач, будете "приятно" удивлены размером процесса вашей 1с smile.gif.
Похоже, конструктор
Новый Картинка ("ПутьКФайлу")
при каждом вызове добивает в память, а не обнуляет, даже если картинку присваивать одной и той же переменной.
Пришлось идти через ж..., то есть сначала поднимать все картинки в память, в таблицу значений, и при выводе строки искать картинку в таблице, а не вызывать конструктор новой картинки. То есть когда при выборе каталога читаю список файлов, еще и поднимаю их в таблицу:
Процедура ПрочитатьСписокФайлов()
    
    ТПСписокФайловКартинокСерфитикатов.Очистить();
    НайденныеФайлы = НайтиФайлы(ИмяКаталогаИзображений,"*.bmp");    
    
    мТаблицаИзображений = Новый ТаблицаЗначений;
    мТаблицаИзображений.Колонки.Добавить("Путь");
    мТаблицаИзображений.Колонки.Добавить("Картинка");
    
    Для Каждого Файл Из НайденныеФайлы Цикл
        НоваяСтрока = ТПСписокФайловКартинокСерфитикатов.Добавить();
        НоваяСтрока.Файл = Файл.Имя;
        новаястр = мТаблицаИзображений.Добавить();
        новаястр.Путь     = Файл.Имя;
        новаястр.Картинка = Новый Картинка(Файл.ПолноеИмя);
    КонецЦикла;
    
    Если ТПСписокФайловКартинокСерфитикатов.Количество()>0 Тогда
        ЭлементыФормы.ТПСписокФайловКартинокСерфитикатов.ТекущаяСтрока = ТПСписокФайловКартинокСерфитикатов[0];
    КонецЕсли;
    
КонецПроцедуры


а уж потом при выводе строки присваиваю элементу ПолеКартинки изображение из ТЗ:
Процедура ТПСписокФайловКартинокСерфитикатовПриАктивизацииСтроки(Элемент)

    ЭлементыФормы.ПолеКартинки.Картинка = мТаблицаИзображений.Найти(Элемент.Текущаястрока.Файл,"Путь").Картинка;    
    
КонецПроцедуры


Конечно, метод найти() может вернуть и Неопределено, но пока для отладки это не столь важно smile.gif
И все равно (!!!) при переходе по строкам память забивается. Забивается, пока не перекликаешь все строки smile.gif Когда проходишь строки по второму разу, размер процесса стабилен. И то хорошо, благо, файлов в каталог кладут пока немного, а там, видишь, разрабы исправят баг платформы. Вернее, как они сами выразились, "Это не ошибка.
Особенность поведения кэш 1С предприятия."
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.