Формирование объемных отчетов, содержащих десятки и сотни тысяч строк, является одной из самых частых задач, вызывающих проблемы с производительностью системы. Когда отчет «висит» часами или завершается ошибкой нехватки памяти (Out of Memory), это прямое свидетельство того, что архитектура формирования данных требует пересмотра. Давайте разберем, как проанализировать и оптимизировать этот процесс.
Прежде чем переписывать код, необходимо понять, где именно «узкое горло». Для этого используйте встроенные инструменты платформы:
ТабличныйДокумент на стороне клиента.Если отчет содержит более 100 000 строк, вывод его в ТабличныйДокумент через Показать() является архитектурно неверным подходом. Рассмотрим более эффективные методы:
РегистрыСведений или РегистрыНакопления с помощью регламентных заданий. При открытии отчета система будет просто считывать готовые данные, что сокращает время формирования с часов до секунд.ТабличныйДокумент.Записать() в формате SpreadsheetDocumentFileType.XLSX сразу на сервере. Это исключает нагрузку на клиентское приложение и передачу данных через канал связи.При работе с большими выборками важно избегать ошибок, которые кратно увеличивают время работы кода:
Избегайте получения данных через точку в цикле. Это самая распространенная ошибка. Конструкция вида Выборка.Ссылка.Реквизит выполняет отдельный запрос к базе данных для каждой строки. Вместо этого включайте все необходимые поля в основной запрос.
Оптимизируйте работу с памятью. Вместо заполнения ячеек ТабличногоДокумента в цикле, используйте ТаблицуЗначений. Обработка данных в памяти происходит значительно быстрее, чем отрисовка ячеек в объект ТабличныйДокумент.
Пример оптимизированного получения данных:
// ВМЕСТО:
// Для каждого Стр из Выборка Цикл
// Область.Параметры.Контрагент = Стр.Ссылка.Контрагент; // Плохо! Запрос в цикле
// КонецЦикла;
// ИСПОЛЬЗУЙТЕ:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Данные.Контрагент КАК Контрагент,
| Данные.Сумма КАК Сумма
|ИЗ
| РегистрНакопления.Продажи КАК Данные";
Результат = Запрос.Выполнить().Выбрать();
Чтобы избежать ошибки нехватки памяти, проанализируйте следующие параметры системы:
Подводя итог: в 90% случаев проблема «долгой печати» решается не ускорением кода, а отказом от вывода 100-тысячных таблиц на экран. Перенесите расчеты в регламентные задания и предоставьте пользователю инструменты для интерактивного анализа агрегированных данных, а не статичные «портянки».