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