Как оптимизировать и ускорить формирование отчета с фотографиями номенклатуры в 1С

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке каталогов, прайс-листов и отчетов по остаткам с графическими файлами номенклатуры разработчики часто сталкиваются с критическим падением производительности. В ситуациях, когда справочник насчитывает тысячи позиций, а к каждой карточке прикреплен файл размером 1–2 МБ, построение отчета может занимать десятки минут или приводить к аварийному завершению сеанса из-за нехватки оперативной памяти. Разберем основные причины медленной работы и рассмотрим эффективные способы решения этой задачи.

Выясним причины медленной работы отчетов с графикой

Прежде чем переходить к оптимизации, проанализируем узкие места архитектуры платформы 1С:

  1. Особенности табличного документа: Графические объекты размещаются в специальной коллекции Рисунки (объекты РисунокТабличногоДокумента). При добавлении сотен и тысяч отдельных графических элементов платформа тратит значительные ресурсы на пересчет их позиционирования и координат в таблице, из-за чего время построения растет нелинейно.
  2. Объем передаваемых данных между клиентом и сервером: Передача готового сформированного табличного документа с внедренными бинарными данными сотен файлов вызывает резкий рост объема занимаемой памяти и блокирует клиентское приложение.
  3. Ограничения адресного пространства (Out of Memory): При использовании 32-разрядного клиента или сервера попытка сформировать отчет из нескольких тысяч полноразмерных файлов неизбежно упирается в ограничение адресного пространства (2 ГБ).
  4. Нагрузка на файловую базу: Чтение реквизитов типа ХранилищеЗначения из таблиц присоединенных файлов в файловом режиме (.1CD) создает высокую нагрузку на дисковую подсистему и провоцирует длительные блокировки.

Способ 1. Разделение оригиналов и миниатюр (превью)

Основная ошибка заключается в попытке выводить в отчет исходный графический файл высокого разрешения. Для ячейки таблицы размером 100х100 пикселей достаточно миниатюры весом 15–30 КБ вместо полноразмерного файла весом 2 МБ.

Рассмотрим правильный архитектурный подход: хранить оригиналы файлов для детального просмотра или печати полиграфии, а для отчетов и динамических списков генерировать и сохранять сжатые миниатюры при записи файла номенклатуры.

Начиная с версии 8.3.10, в платформе доступен встроенный объект ОбработкаКартинок, который позволяет выполнять масштабирование и сжатие без использования внешних библиотек. Посмотрим на пример программного сжатия:


// Функция создает уменьшенную копию переданного двоичного файла
Функция ПолучитьМиниатюру(ДвоичныеДанныеОригинала, Ширина = 120, Высота = 120)
    
    ИсходноеИзображение = Новый Картинка(ДвоичныеДанныеОригинала);
    
    Обработка = Новый ОбработкаКартинок;
    Обработка.ДобавитьКомандуМасштабирования(Ширина, Высота);
    Обработка.ДобавитьКомандуПреобразованияФормата(ФорматКартинки.JPEG);
    
    СжатоеИзображение = Обработка.ВыполнитьОбработку(ИсходноеИзображение);
    
    Возврат СжатоеИзображение.ПолучитьДвоичныеДанные();
    
КонецФункции

Сохраняйте полученные миниатюры в отдельный реквизит справочника присоединенных файлов или специальный регистр сведений. При формировании отчета запрос должен считывать только миниатюры.

Способ 2. Ограничение выборки и обязательные отборы

Пользователю редко требуется визуализировать весь ассортимент из 7000 позиций одновременно. Проанализируем способы снижения объема выборки:

  1. Установка обязательных параметров: Настройте схему компоновки данных (СКД) или форму отчета таким образом, чтобы формирование было невозможно без указания группы номенклатуры, склада, ценовой группы или наличия остатка на складе (Остаток > 0).
  2. Постраничный вывод (пагинация): Разделите вывод каталога на страницы по 30–50 позиций. При переходе по страницам отчет оперативно переформировывается только для выбранного диапазона строк.

Способ 3. Отложенная подгрузка данных по запросу

Если пользователю требуется просматривать информацию по всему прайс-листу, эффективным решением является отложенная загрузка. Отчет строится в виде стандартной таблицы с текстовыми данными (артикул, наименование, остаток, цена), а вывод графического содержимого происходит по требованию:

  1. При клике или расшифровке строки номенклатуры файл динамически считывается из базы и отображается в отдельном поле формы.
  2. Добавляется специальная команда на форме: «Отобразить графику для выделенных строк».

Способ 4. Использование поля HTML-документа вместо табличного документа

Если отчет предназначен исключительно для экранного просмотра интерактивного каталога, стандартный ТабличныйДокумент можно заменить на ПолеHTMLДокумента. Браузерный движок платформы оптимизирован для работы с большим количеством графических элементов: он выполняет кэширование, асинхронную подгрузку и освобождение памяти, что обеспечивает плавную прокрутку и мгновенное открытие каталога.

Способ 5. Экспорт в Excel и регламентная фоновая генерация

Если конечной целью является выгрузка каталога во внешний файл (например, формат XLSX для отправки клиентам), формирование непосредственно в сеансе пользователя блокирует его работу. Применим следующие решения:

  1. Фоновое выполнение: Выполняйте генерацию тяжелого отчета в фоновом задании с помощью ДлительныеОперации, выводя пользователю индикатор выполнения процесса.
  2. Регламентное задание: Если прайс-лист с фотографиями требуется ежедневно, настройте расписание регламентного задания на ночное время. Регламентное задание формирует файл, сжимает его и сохраняет в сетевую папку, откуда пользователи или клиенты могут забирать готовый результат без нагрузки на рабочую базу.
← На главную