Часто при разработке отчетов на Системе Компоновки Данных (СКД) разработчики сталкиваются с ситуацией, когда с ростом базы данных отчет начинает формироваться критически медленно. При этом замер производительности показывает интересную картину: сам SQL-запрос выполняется очень быстро (например, метод КомпоновщикМакета.Выполнить() отрабатывает за доли секунды), а вот этап генерации и вывода результата (метод ПроцессорКомпоновки.Следующий()) занимает основное время. Рассмотрим подробнее, почему возникает такая проблема и разберем по шагам способы ее решения.
Проанализируем ситуацию и выясним, какие факторы сильнее всего тормозят формирование табличного документа на этапе работы процессора компоновки:
Следующий().ПроцессорКомпоновки.Следующий() требует от платформы больших накладных расходов. Платформа 1С выполняет этот процесс строго в один поток, и распараллелить его невозможно.Давайте посмотрим, как можно переработать отчет, чтобы радикально ускорить его формирование.
1. Перенос логики из вычисляемых полей в SQL-запрос
Это самое эффективное решение. Постарайтесь максимально избавиться от вычисляемых полей СКД, перенеся расчеты на уровень СУБД. Используйте внутри запроса математические операторы, конструкцию ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ и функцию ПРЕДСТАВЛЕНИЕ(). Это позволит получать уже готовые, рассчитанные данные, которые СКД останется только отрисовать.
2. Кэширование функций общих модулей
Если отказаться от вызова функции из общего модуля в вычисляемом поле невозможно (например, там сложная бизнес-логика), перенесите эту функцию в общий модуль с установленным свойством «Повторное использование возвращаемых значений» (на время сеанса или вызова). Таким образом, при многократном расчете одинаковых параметров база данных не будет опрашиваться повторно, а результат будет браться из кэша.
3. Использование стандартного вывода вместо ручного цикла
Если вы использовали ручной обход для какой-то хитрой пост-обработки макета, попробуйте решить задачу стандартными средствами — через пользовательские макеты СКД (макеты группировок, полей, ресурсов). Откажитесь от метода Следующий() в пользу стандартного вывода:
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Этот платформенный метод работает значительно быстрее за счет внутренних оптимизаций ядра, которых нет при ручном переборе.
4. Оптимизация условного оформления
Зайдите в настройки СКД и проверьте условное оформление. Обязательно указывайте конкретные оформляемые поля (колонки). Избегайте ситуации, когда область оформления оставлена пустой, из-за чего платформа вынуждена применять стили к каждой ячейке всей строки.
5. Вывод результата в коллекцию значений
Если визуальная красота (табличный документ) пользователю не важна, и отчет нужен для дальнейшего анализа данных, выводите результат в ТаблицаЗначений или ДеревоЗначений. Процессор вывода в коллекцию работает в разы быстрее, так как не тратит время процессора на создание свойств ячеек, рамок, шрифтов и макетирование.
6. Сворачивание детальных записей
Само по себе формирование сотен тысяч строк в табличном документе всегда будет долгим процессом из-за ограничений однопоточности. Настройте вариант отчета по умолчанию так, чтобы выводились только итоги (верхние уровни группировок), а детальные записи были отключены. Пользователь всегда сможет получить детализацию по конкретной интересующей его цифре, используя стандартный механизм расшифровки ячейки.
Применяя эти методы комплексно, вы сможете значительно снизить нагрузку на систему и обеспечить комфортную скорость работы отчетов даже на базах данных большого объема.