При разработке функционала для работы со сканами документов, сертификатами качества или фото номенклатуры разработчики часто сталкиваются с проблемой: при выборе элемента списка предпросмотр изображения на форме задерживается на несколько секунд. Рассмотрим причину возникновения таких задержек и разберем практические способы оптимизации работы с изображениями в платформах 1С.
Проанализируем типовой код, который используется для вывода картинки на форму из локального файла или сетевого ресурса:
Процедура ПоказатьКартинку(Путь)
Файл = Новый Файл(Путь);
Если Файл.Существует() Тогда
Картинка = Новый Картинка(Путь);
ЭлементыФормы.ПредПросмотрКартинка.Картинка = Картинка;
ЭлементыФормы.УвеличитьИзображение.Доступность = Истина;
КонецЕсли;
КонецПроцедуры
Замер производительности показывает, что основной объем времени уходит на исполнение конструктора Новый Картинка(Путь). Это происходит по следующим причинам:
Картинка из сжатого файла (например, JPEG или PNG высокого разрешения с 300–600 DPI) платформа производит полное декодирование изображения в несжатый массив в оперативной памяти.Главная ошибка при работе со сканами — попытка отобразить полноразмерный документ высокого разрешения в небольшом окне предпросмотра. Разберем, как исправить эту ситуацию.
Для экранного предпросмотра на форме достаточно создать уменьшенную копию (миниатюру) размером порядка 150×200 пикселей или с разрешением 100–150 DPI. Для этого можно задействовать объект ОбработкаКартинок или подготовить уменьшенные файлы на этапе их первоначального сохранения.
Преимущества подхода:
Новый Картинка отрабатывает мгновенно.В Библиотеке Стандартных Подсистем (БСП) реализована универсальная архитектура для работы с присоединенными файлами. Она решает большинство проблем с производительностью и хранением.
Рассмотрим особенности работы с файлами в БСП:
НоменклатураПрисоединенныеФайлы, а двоичные данные — в отдельном регистре сведений ДвоичныеДанныеФайлов или в специализированной папке на диске.ХранилищеЗначения) или в томах на диске.КаталогВременныхФайлов()), что минимизирует повторные сетевые обращения.Если структура приложения не позволяет использовать БСП, проанализируем варианты решения на уровне логики формы.
Кэширование в памяти:
При открытии формы или активизации списка можно заранее считывать и создавать объекты Картинка для видимых строк и записывать их в массив или соответствие. При переходе по строкам форма будет мгновенно брасывать уже созданный объект из памяти без повторного обращения к диску.
Асинхронная или фоновая загрузка:
В управляемых формах вместо прямого чтения файла на клиенте принято переносить загрузку на сервер: файлы помещаются во временное хранилище через метод ПоместитьВоВременноеХранилище(), а поле формы связывается с полученным навигационным адресом (вида e1cib/tempstorage/...).
Выясним плюсы и минусы обоих подходов, чтобы выбрать оптимальный для конкретного проекта.
Хранение на диске / в сетевой папке:
Хранение в базе данных (в ХранилищеЗначения):
Таким образом, для достижения максимальной скорости работы интерфейса рекомендуется сочетать создание миниатюр для быстрого предпросмотра и использование подсистемы работы с файлами БСП.