Печатные формы документов (например, УПД, УКД или ТОРГ-12), импортированные из внешних источников или правовых баз, часто создаются на основе сетки из десятков или сотен сверхузких микро-колонок. При одиночной печати задержка может быть незаметна, однако при пакетном выводе большого количества документов платформа 1С начинает существенно «подтормаживать». Разберем причины этой проблемы и проанализируем практические способы оптимизации табличных документов MXL.
Выясним, почему макеты с множеством узких колонок нагружают систему при формировании и выводе на печать:
Если перерисовывать печатную форму с нуля слишком долго, можно воспользоваться автоматической обработкой макета. С помощью сторонней библиотеки Йоксель удалим неиспользуемые пустые колонки, сгенерированные при импорте из Excel, с сохранением общей ширины таблицы.
Рассмотрим алгоритм обхода колонок справа налево. В процессе проверки пустые столбцы удаляются методами библиотеки, а их ширина суммируется с шириной соседней левой колонки, чтобы итоговый размер формы по горизонтали не искажался.
Посмотрим на пример реализации данного алгоритма:
Для НомерКолонки = -ТабДок.ШиринаТаблицы() По -2 Цикл // Обходим колонки справа налево, первую не трогаем
ПустаяКолонка = 1;
Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы() Цикл
Область = ТабДок.Область(НомерСтроки, -НомерКолонки, НомерСтроки, -НомерКолонки);
Если ПустоеЗначение(Область.Текст) = 0 Тогда
ПустаяКолонка = 0;
Прервать;
КонецЕсли;
КонецЦикла;
Если ПустаяКолонка = 1 Тогда
УдаляемаяОбласть = ТабДок.Область(, -НомерКолонки, , -НомерКолонки);
ЛеваяОбласть = ТабДок.Область(, -НомерКолонки - 1, , -НомерКолонки - 1);
// Прибавляем ширину удаляемой колонки к левой
ЛеваяОбласть.ШиринаСтолбца(ЛеваяОбласть.ШиринаСтолбца() + УдаляемаяОбласть.ШиринаСтолбца());
// Удаляем пустую колонку
ТабДок.УдалитьКолонки(-НомерКолонки, 1);
КонецЕсли;
КонецЦикла;
Разберем ключевые особенности работы этого кода:
Область.Текст проверяется через функцию ПустоеЗначение(). Если в колонке по всей высоте таблицы нет текста, она признается кандидотом на удаление.ШиринаСтолбца(), после чего вызывается метод ТабДок.УдалитьКолонки().Помимо удаления лишних колонок, при рефакторинге макетов рекомендуется соблюдать следующие правила:
Очистить().