Как ускорить формирование отчета в 1С при выводе более 200 000 строк?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

Работа с большими массивами данных в 1С:Предприятие часто сопряжена с падением производительности. Ситуация, когда отчет на базе Системы компоновки данных (СКД) формируется несколько минут при объеме в 200 тысяч строк, является типичной для конфигураций на обычных формах, таких как Бухгалтерия предприятия 2.0. Основная нагрузка в таких случаях часто ложится не на выполнение запроса к базе данных, а на процесс отрисовки и компоновки финального табличного документа. Разберем детально, как можно оптимизировать этот процесс и сократить время ожидания пользователя.

Проблема отрисовки: Оптимизация Табличного документа

Проанализируем работу метода ПроцессорВывода.Вывести(). Когда мы передаем в него результат компоновки, система начинает строить ТабличныйДокумент. Самым ресурсоемким процессом здесь является расчет геометрии ячеек. Рассмотрим основные настройки, которые замедляют вывод:

  1. Автовысота строк. Это главный фактор замедления. Если в настройках оформления или программно для строк установлено свойство АвтовысотаСтроки = Истина, 1С вынуждена просчитывать высоту каждой из 200 000 строк, исходя из объема текста и шрифта. При выводе больших списков необходимо принудительно отключать это свойство.
  2. Сложное условное оформление. Проанализируем настройки СКД: если для каждой строки проверяется множество условий (цвет, шрифт, формат), это кратно увеличивает время формирования. Старайтесь минимизировать количество правил оформления для детальных записей.
  3. Фиксация и объединенные ячейки. Использование объединенных ячеек в тяжелых отчетах крайне нежелательно. Это усложняет расчет структуры таблицы в памяти.

Для программного отключения автовысоты перед выводом используйте следующий подход:


Результат = Новый ТабличныйДокумент;
Результат.АвтоМасштаб = Ложь;
// Отключаем автовысоту для всего документа или конкретных областей
Результат.Область().АвтоВысотаСтроки = Ложь;

Оптимизация запросов и настроек внутри СКД

Выясним причину, почему добавление поля Договор так сильно влияет на скорость (увеличение времени с 30 секунд до 3 минут). Проблема может крыться в неоптимальных соединениях или избыточности данных. Рассмотрим шаги по улучшению запроса:

  1. Индексация полей связи. Проверьте, проиндексировано ли поле ДоговорКонтрагента в тех таблицах, из которых вы выбираете данные. Если используются временные таблицы, обязательно создавайте индексы по полям, участвующим в соединениях.
  2. Роли полей в СКД. Перейдем на вкладку «Наборы данных». Для поля Договор проверьте роли. Если поле является частью иерархии или имеет неправильно настроенного «Родителя», СКД может генерировать избыточные левые соединения с таблицами метаданных для получения представления или дополнительных реквизитов.
  3. Отключение автозаполнения. Флаг Автозаполнение в наборе данных заставляет систему выбирать все доступные поля из таблиц запроса. Разберем правильный подход: отключите автозаполнение и вручную добавьте только те поля, которые действительно нужны пользователю. Это снижает объем данных, передаваемых от SQL-сервера к приложению.

Программное управление процессом вывода

В сообщении упоминается, что «тормозит» именно ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных). Рассмотрим вариант порционного вывода. Вместо вывода всего документа одной командой, мы можем выводить элементы по одному в цикле. Это не всегда ускоряет сам процесс, но позволяет управлять памятью и предоставлять пользователю обратную связь.


ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);

ПроцессорВывода.НачатьВывод();
Пока Истина Цикл
    ЭлементРезультата = ПроцессорКомпоновки.Следующий();
    Если ЭлементРезультата = Неопределено Тогда
        Прервать;
    КонецЕсли;
    
    // Здесь можно реализовать проверку условий или индикацию прогресса
    ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();

Важный момент: если отчет содержит 200 000 строк детальных записей, расчет общих итогов по иерархии (группировкам) может занимать значительное время. Попробуйте отключить итоги для детальных записей в настройках СКД, если они не несут практической ценности для такого объема.

Использование фонового формирования

Для конфигураций, работающих в клиент-серверном режиме, крайне рекомендуется переносить формирование тяжелых отчетов в фоновые задания. Рассмотрим преимущества:

Прямая выгрузка в Excel как альтернатива

Если пользователю необходимо просматривать 200 000 договоров, ТабличныйДокумент становится не самым удобным инструментом. Выясним, как можно ускорить процесс, если итоговая цель — файл Excel. Вывод данных в ТабличныйДокумент с последующим сохранением через Записать() всегда будет медленнее, чем прямая генерация XML-структуры файла (например, в формате XML Spreadsheet 2003).

Однако, как отметил автор темы, важна возможность расшифровки (перехода к объекту в 1С). В этом случае прямая выгрузка в Excel не подойдет, так как связи с объектами базы данных будут потеряны. Если же расшифровка критична, единственным путем остается оптимизация свойств ТабличногоДокумента и структуры запроса.

Настройка СУБД для больших отчетов

Не забудем про уровень базы данных. Проанализируем ситуацию: если статистика по индексам в SQL Server устарела, оптимизатор может выбрать неверный план выполнения запроса. Для отчетов, оперирующих сотнями тысяч записей, это критично.

Рекомендуется выполнить UPDATE STATISTICS для таблиц ДоговорыКонтрагентов и таблиц регистров, из которых черпаются данные. Это гарантирует, что SQL выберет максимально быстрый способ соединения таблиц.

Итоги и рекомендации

Для ускорения отчета на 200 000 строк выполним следующие действия:

  1. Отключим Автовысоту строк в итоговом документе.
  2. Проверим наличие индексов по полям связей (особенно по полю Договор).
  3. Отключим Автозаполнение в СКД и уберем лишние поля из выборки.
  4. Проверим роли полей, чтобы исключить скрытые соединения в запросе.
  5. Если возможно, переведем формирование в фоновый режим.

Эти меры в комплексе позволяют сократить время формирования отчета с нескольких минут до приемлемых 30-40 секунд, даже при сохранении всех детальных записей и возможности расшифровки.

← На главную