Способы оптимизации формирования отчетов
Процесс получения отчетов с использованием запросов можно условно разделить на две фазы: сначала формируется запрос, затем полученные данные выводятся в Таблицу. В данном разделе речь пойдет о второй фазе получения отчета — выводе данных в Таблицу.
Рассмотрим следующий пример. Допустим, требуется вывести в отчет полный перечень товаров со всеми их реквизитами. Для этого сначала формируется запрос с одной Группировкой — "Товар", затем полученные данные выводятся в Таблицу. Ниже приведены три варианта вывода данных в Таблицу.
Вариант 1
В программном модуле текст вывода данных в Таблицу следующий
Пока Запрос.Группировка("Товар") = 1 Цикл
Таб.ВывестиСекцию("Товар");
КонецЦикла;
Секция "Товар" в Таблице имеет следующий формат:
<Запрос.Товар.Наименование> |
<Запрос.Товар.Артикул> | ||
<Запрос.Товар.Цена> | <Запрос.Товар.Валюта> |
В первом варианте отображаемые реквизиты товара полностью вычисляются в ячейках Таблицы, причем доступ к каждому реквизиту товара происходит по полному пути: Запрос-Товар-Реквизит. Данный вариант вывода данных в Таблицу самый медленный.
Вариант 2
В программном модуле текст вывода данных в Таблицу следующий
Пока Запрос.Группировка("Товар") = 1 Цикл
ПечНаим = Запрос.Товар.Наименование;
ПечАртикул = Запрос.Товар.Артикул;
ПечЦена = Запрос.Товар.Цена;
ПечВалюта = Запрос.Товар.Валюта;
Таб.ВывестиСекцию("Товар1");
КонецЦикла;
Секция "Товар1" в Таблице имеет следующий формат:
<ПечНаим> | <ПечАртикул> | ||
<ПсчЦена> | <ПечВалюта> |
Во втором варианте отображаемые реквизиты товара вычисляются в программном модуле, а в ячейках Таблицы размещены простые выражения — ссылки на идентификаторы программного модуля. Доступ к каждому реквизиту товара происходит по полному пути: Запрос-Товар-Реквизит. В данном варианте фаза вывода данных в Таблицу работает быстрее первого варианта (выигрыш ~20%), т. к. в программном модуле выражения вычисляются существенно быстрее, чем выражения, помещенные в ячейках Таблицы (программный модуль при загрузке компилируется, а выражения в ячейках таблицы интерпретируются каждый раз при выводе секций).
Вариант 3
В программном модуле текст вывода данных в Таблицу следующий
Пока Запрос.Группировка("Товар") = 1 Цикл
Тов = Запрос.Товар;
ПечНаим = Тов.Наименование;
ПечАртикул = Тов.Артикул;
ПечЦена = Тов.Цена;
ПечВалюта = Тов.Валюта;
Таб.ВывестиСекцию("Товар1");
КонецЦикла;
Секция "Товар1" в Таблице имеет следующий формат:
<ПечНаим> |
<ПечАртикул> |
<ПсчЦена> |
<ПечВалюта> |
Кратко суть этого раздела можно выразить так: при реализации больших отчетов, которые рассчитаны на отображение более сотни строк, следует придерживаться следующих правил:
- не размещайте сложных выражений в ячейках Таблицы. Лучше вычислить необходимые значения непосредственно в программном модуле;
- если необходимо получить несколько реквизитов одного объекта, который сам является составной частью другого объекта, то следует воспользоваться промежуточной переменной, в которую сначала можно записать значение всего объекта «целиком», а затем уже от нее получать требуемые данные.