При формировании объемных отчетов, каталогов продукции и индивидуальных прайс-листов на десятки тысяч строк разработчики часто сталкиваются с существенным падением производительности при выгрузке данных в форматы электронных таблиц. Сохранение файла объемом 20 000–30 000 строк стандартными средствами платформы может занимать от одной до нескольких минут, что блокирует интерфейс пользователя и перегружает серверные процессы. Разберем по шагам, почему происходит замедление и какими методами можно многократно ускорить экспорт табличного документа.
Выясним причину длительного формирования файла на базовом уровне. Устаревший формат XLS (Excel 97–2003) использует бинарную структуру BIFF8, для сериализации которой платформе 1С требуется производить сложные расчеты смещений и индексов. Современный формат XLSX (OpenXML) представляет собой сжатый ZIP-архив с XML-документами, запись которого оптимизирована в платформе на порядки лучше.
Второй критический фактор — контекст выполнения операции. При выполнении сохранения на клиенте весь объем сформированного табличного документа вместе с графическими объектами передается по сети на клиентскую машину, после чего клиентский процесс выполняет запись на локальный диск. Перенос процедуры записи на сторону сервера исключает избыточный сетевой трафик и использует вычислительные мощности серверного оборудования.
Сравним производительность различных вариантов выгрузки документа объемом около 30 000 строк:
Посмотрим на пример правильной организации серверного сохранения файла:
&НаСервере
Процедура СохранитьПрайсЛистВФайлНаСервере(ТабличныйДокумент, ПолноеИмяФайла)
// Используем современный формат XLSX вместо устаревшего XLS
ТабличныйДокумент.Записать(ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
КонецПроцедуры
Проанализируем структуру макета отчета. Одной из частых причин торможения при конвертации в табличные форматы является включенный режим автоматического определения высоты строк и ширины колонок. Платформа вынуждена для каждой ячейки рассчитывать размер содержимого, шрифт и межстрочные интервалы.
Для ускорения построения и выгрузки документа рекомендуется придерживаться следующих правил оформления:
АвтоВысотаСтроки.ТабличныйДокумент.ОтображатьСетку = Ложь и ТабличныйДокумент.ОтображатьЗаголовки = Ложь.Когда прайс-лист содержит тысячи миниатюр номенклатуры, каждый рисунок помещается в коллекцию Рисунки табличного документа. При экспорте в XLSX платформа генерирует для каждого изображения отдельный XML-узел привязки и упаковывает бинарный файл в структуру архива, что резко увеличивает расход оперативной памяти и время работы потока rphost.
Рассмотрим комплекс мер по оптимизации выгрузки документов с графикой:
При одновременной работе десятков пользователей формирование персонализированных прайс-листов в интерактивном режиме блокирует интерфейс менеджера и создает пиковые нагрузки на сервер. Оптимальным архитектурным решением является перевод длительных операций выгрузки в асинхронный режим.
Разберем организацию фонового формирования:
ФоновыеЗадания.Выполнить(), передавая параметры формирования.Посмотрим на пример кода запуска фонового сохранения:
&НаСервере
Функция ЗапуститьФормированиеПрайсаФоном(ПараметрыОтчета)
ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(ПараметрыОтчета);
Задание = ФоновыеЗадания.Выполнить(
"Обработки.ВыгрузкаПрайсЛистов.СформироватьИСохранитьФайл",
ПараметрыЗадания,
,
"Формирование прайс-листа для клиента"
);
Возврат Задание.УникальныйИдентификатор;
КонецФункции
Процесс сохранения файла в формате XLSX активно использует каталог временных файлов сеанса (Temp) для распаковки, сборки XML-дерева и последующей упаковки в ZIP-архив. Если серверное окружение настроено неоптимально, дисковые задержки могут нивелировать оптимизацию кода.
Для устранения узких мест в инфраструктуре выполните следующие настройки:
TEMP и TMP сервера 1С на высокоскоростных NVMe-дисках или настройте RAM-диск в оперативной памяти, если сервер регулярно выполняет массовые выгрузки тяжелых отчетов.