При разработке каталогов, прайс-листов и отчетов по остаткам с графическими файлами номенклатуры разработчики часто сталкиваются с критическим падением производительности. В ситуациях, когда справочник насчитывает тысячи позиций, а к каждой карточке прикреплен файл размером 1–2 МБ, построение отчета может занимать десятки минут или приводить к аварийному завершению сеанса из-за нехватки оперативной памяти. Разберем основные причины медленной работы и рассмотрим эффективные способы решения этой задачи.
Прежде чем переходить к оптимизации, проанализируем узкие места архитектуры платформы 1С:
Рисунки (объекты РисунокТабличногоДокумента). При добавлении сотен и тысяч отдельных графических элементов платформа тратит значительные ресурсы на пересчет их позиционирования и координат в таблице, из-за чего время построения растет нелинейно.ХранилищеЗначения из таблиц присоединенных файлов в файловом режиме (.1CD) создает высокую нагрузку на дисковую подсистему и провоцирует длительные блокировки.Основная ошибка заключается в попытке выводить в отчет исходный графический файл высокого разрешения. Для ячейки таблицы размером 100х100 пикселей достаточно миниатюры весом 15–30 КБ вместо полноразмерного файла весом 2 МБ.
Рассмотрим правильный архитектурный подход: хранить оригиналы файлов для детального просмотра или печати полиграфии, а для отчетов и динамических списков генерировать и сохранять сжатые миниатюры при записи файла номенклатуры.
Начиная с версии 8.3.10, в платформе доступен встроенный объект ОбработкаКартинок, который позволяет выполнять масштабирование и сжатие без использования внешних библиотек. Посмотрим на пример программного сжатия:
// Функция создает уменьшенную копию переданного двоичного файла
Функция ПолучитьМиниатюру(ДвоичныеДанныеОригинала, Ширина = 120, Высота = 120)
ИсходноеИзображение = Новый Картинка(ДвоичныеДанныеОригинала);
Обработка = Новый ОбработкаКартинок;
Обработка.ДобавитьКомандуМасштабирования(Ширина, Высота);
Обработка.ДобавитьКомандуПреобразованияФормата(ФорматКартинки.JPEG);
СжатоеИзображение = Обработка.ВыполнитьОбработку(ИсходноеИзображение);
Возврат СжатоеИзображение.ПолучитьДвоичныеДанные();
КонецФункции
Сохраняйте полученные миниатюры в отдельный реквизит справочника присоединенных файлов или специальный регистр сведений. При формировании отчета запрос должен считывать только миниатюры.
Пользователю редко требуется визуализировать весь ассортимент из 7000 позиций одновременно. Проанализируем способы снижения объема выборки:
Остаток > 0).Если пользователю требуется просматривать информацию по всему прайс-листу, эффективным решением является отложенная загрузка. Отчет строится в виде стандартной таблицы с текстовыми данными (артикул, наименование, остаток, цена), а вывод графического содержимого происходит по требованию:
Если отчет предназначен исключительно для экранного просмотра интерактивного каталога, стандартный ТабличныйДокумент можно заменить на ПолеHTMLДокумента. Браузерный движок платформы оптимизирован для работы с большим количеством графических элементов: он выполняет кэширование, асинхронную подгрузку и освобождение памяти, что обеспечивает плавную прокрутку и мгновенное открытие каталога.
Если конечной целью является выгрузка каталога во внешний файл (например, формат XLSX для отправки клиентам), формирование непосредственно в сеансе пользователя блокирует его работу. Применим следующие решения:
ДлительныеОперации, выводя пользователю индикатор выполнения процесса.