Работа с большими массивами данных в 1С:Предприятие часто сопряжена с падением производительности. Ситуация, когда отчет на базе Системы компоновки данных (СКД) формируется несколько минут при объеме в 200 тысяч строк, является типичной для конфигураций на обычных формах, таких как Бухгалтерия предприятия 2.0. Основная нагрузка в таких случаях часто ложится не на выполнение запроса к базе данных, а на процесс отрисовки и компоновки финального табличного документа. Разберем детально, как можно оптимизировать этот процесс и сократить время ожидания пользователя.
Проанализируем работу метода ПроцессорВывода.Вывести(). Когда мы передаем в него результат компоновки, система начинает строить ТабличныйДокумент. Самым ресурсоемким процессом здесь является расчет геометрии ячеек. Рассмотрим основные настройки, которые замедляют вывод:
АвтовысотаСтроки = Истина, 1С вынуждена просчитывать высоту каждой из 200 000 строк, исходя из объема текста и шрифта. При выводе больших списков необходимо принудительно отключать это свойство.Для программного отключения автовысоты перед выводом используйте следующий подход:
Результат = Новый ТабличныйДокумент;
Результат.АвтоМасштаб = Ложь;
// Отключаем автовысоту для всего документа или конкретных областей
Результат.Область().АвтоВысотаСтроки = Ложь;
Выясним причину, почему добавление поля Договор так сильно влияет на скорость (увеличение времени с 30 секунд до 3 минут). Проблема может крыться в неоптимальных соединениях или избыточности данных. Рассмотрим шаги по улучшению запроса:
ДоговорКонтрагента в тех таблицах, из которых вы выбираете данные. Если используются временные таблицы, обязательно создавайте индексы по полям, участвующим в соединениях.Договор проверьте роли. Если поле является частью иерархии или имеет неправильно настроенного «Родителя», СКД может генерировать избыточные левые соединения с таблицами метаданных для получения представления или дополнительных реквизитов.Автозаполнение в наборе данных заставляет систему выбирать все доступные поля из таблиц запроса. Разберем правильный подход: отключите автозаполнение и вручную добавьте только те поля, которые действительно нужны пользователю. Это снижает объем данных, передаваемых от SQL-сервера к приложению.В сообщении упоминается, что «тормозит» именно ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных). Рассмотрим вариант порционного вывода. Вместо вывода всего документа одной командой, мы можем выводить элементы по одному в цикле. Это не всегда ускоряет сам процесс, но позволяет управлять памятью и предоставлять пользователю обратную связь.
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.НачатьВывод();
Пока Истина Цикл
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Если ЭлементРезультата = Неопределено Тогда
Прервать;
КонецЕсли;
// Здесь можно реализовать проверку условий или индикацию прогресса
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();
Важный момент: если отчет содержит 200 000 строк детальных записей, расчет общих итогов по иерархии (группировкам) может занимать значительное время. Попробуйте отключить итоги для детальных записей в настройках СКД, если они не несут практической ценности для такого объема.
Для конфигураций, работающих в клиент-серверном режиме, крайне рекомендуется переносить формирование тяжелых отчетов в фоновые задания. Рассмотрим преимущества:
ПроцессоромКомпоновки.Если пользователю необходимо просматривать 200 000 договоров, ТабличныйДокумент становится не самым удобным инструментом. Выясним, как можно ускорить процесс, если итоговая цель — файл Excel. Вывод данных в ТабличныйДокумент с последующим сохранением через Записать() всегда будет медленнее, чем прямая генерация XML-структуры файла (например, в формате XML Spreadsheet 2003).
Однако, как отметил автор темы, важна возможность расшифровки (перехода к объекту в 1С). В этом случае прямая выгрузка в Excel не подойдет, так как связи с объектами базы данных будут потеряны. Если же расшифровка критична, единственным путем остается оптимизация свойств ТабличногоДокумента и структуры запроса.
Не забудем про уровень базы данных. Проанализируем ситуацию: если статистика по индексам в SQL Server устарела, оптимизатор может выбрать неверный план выполнения запроса. Для отчетов, оперирующих сотнями тысяч записей, это критично.
Рекомендуется выполнить UPDATE STATISTICS для таблиц ДоговорыКонтрагентов и таблиц регистров, из которых черпаются данные. Это гарантирует, что SQL выберет максимально быстрый способ соединения таблиц.
Для ускорения отчета на 200 000 строк выполним следующие действия:
Эти меры в комплексе позволяют сократить время формирования отчета с нескольких минут до приемлемых 30-40 секунд, даже при сохранении всех детальных записей и возможности расшифровки.