Как ускорить заполнение печатной формы в 1С при большом количестве строк?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разберем ситуацию, когда при формировании печатной формы с количеством позиций номенклатуры более 3000–4000 система начинает работать критически медленно. В таких случаях цикл обхода данных и вывода областей макета становится «узким местом». Проанализируем, как оптимизировать этот процесс и сделать работу системы более эффективной.

Оптимизация получения областей макета

Первым делом рассмотрим структуру вашего цикла. Часто начинающие разработчики получают область макета непосредственно внутри цикла обхода выборки. Это приводит к тому, что платформа вынуждена выполнять операцию поиска и парсинга структуры макета тысячи раз.

Рассмотрим, как изменить этот подход. Вынесем получение областей за пределы цикла, чтобы подготовить их один раз перед началом заполнения:


// Получаем области до начала цикла
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьПодвал = Макет.ПолучитьОбласть("ПодвалСтраницы");

Пока ВыборкаСтрок.Следующий() Цикл
    // Заполняем параметры уже готовой области
    ОбластьСтрока.Параметры.Заполнить(ВыборкаСтрок);
    ТабДокумент.Вывести(ОбластьСтрока);
КонецЦикла;

Работа со ссылочными данными и представлениями

Еще одна распространенная причина «тормозов» при выводе данных — это передача ссылок на объекты СправочникСсылка или ДокументСсылка непосредственно в параметры макета. Когда вы выводите ссылку, платформа в фоновом режиме обращается к базе данных, чтобы получить строковое представление объекта (например, наименование номенклатуры). Если строк тысячи, вы получаете тысячи микро-запросов к СУБД.

Решение простое: необходимо получать представления на этапе формирования запроса. Используйте ключевое слово ПРЕДСТАВЛЕНИЕ в тексте запроса, чтобы в ВыборкаСтрок сразу попадала готовая строка:


ВЫБРАТЬ
    Товары.Номенклатура КАК Номенклатура,
    ПРЕДСТАВЛЕНИЕ(Товары.Номенклатура) КАК НоменклатураПредставление
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК Товары

Теперь в макет передавайте именно поле НоменклатураПредставление. Это исключит лишние обращения к серверу при каждой итерации.

Анализ производительности запроса

Если после оптимизации цикла печатная форма все равно формируется долго, стоит проверить сам источник данных. Возможно, проблема кроется в тяжелом запросе. Воспользуйтесь инструментом Замер производительности в конфигураторе. Если львиная доля времени приходится не на цикл, а на этап Результат = Запрос.Выполнить(), значит, нужно оптимизировать сам запрос:

  1. Проверьте использование индексов для полей, участвующих в условиях ГДЕ.
  2. Если используете временные таблицы, убедитесь, что они правильно проиндексированы.
  3. Рассмотрите возможность использования ИТОГИ ПО вместо ручного подсчета сумм в цикле.

Минимизация серверных вызовов в цикле

Проанализируем вызовы функций внутри цикла. Если внутри цикла происходит обращение к серверному модулю (например, ФормированиеПечатныхФормСервер.СформироватьСуммуПрописью()), каждый такой вызов требует времени на передачу контекста и выполнение кода. По возможности выносите подобные вычисления в основной запрос или предварительно рассчитайте необходимые значения в таблицу значений перед выводом.

Дополнительные рекомендации по ускорению

Чтобы окончательно исключить проблемы с выводом, обратите внимание на следующие нюансы:

Применяя эти шаги комплексно, вы значительно сократите время формирования больших печатных форм и сделаете работу с системой более комфортной.

← На главную