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

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Печатные формы документов (например, УПД, УКД или ТОРГ-12), импортированные из внешних источников или правовых баз, часто создаются на основе сетки из десятков или сотен сверхузких микро-колонок. При одиночной печати задержка может быть незаметна, однако при пакетном выводе большого количества документов платформа 1С начинает существенно «подтормаживать». Разберем причины этой проблемы и проанализируем практические способы оптимизации табличных документов MXL.

Причины замедления печати таблиц с мелкой сеткой

Выясним, почему макеты с множеством узких колонок нагружают систему при формировании и выводе на печать:

  1. Нагрузка на графическую подсистему (GDI): При выводе формы с сотнями мелких ячеек количество графических элементов и внутренних границ возрастает в геометрической прогрессии. Платформа пересчитывает геометрию каждой отдельной ячейки, что вызывает задержки при отрисовке.
  2. Сложность расчёта объединённых областей: Частые объединения ячеек требуют от движка регулярного пересчёта пересечений колонок и строк при вызове секций.
  3. Авторасчёт высоты строк: Если в макете со сложной структурой объединений включено свойство «Автовысота строки», платформа тратит время на динамический расчёт переноса текста внутри сложной составной ячейки.
  4. Однопоточная обработка и расход памяти: В платформе 1С 7.7 формирование табличного документа выполняется в один поток. Накопление сложной графики при формировании единого пакета из сотен страниц может приводить к исчерпанию адресного пространства процесса.

Программное удаление пустых колонок с помощью Йоксель

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

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

Посмотрим на пример реализации данного алгоритма:


Для НомерКолонки = -ТабДок.ШиринаТаблицы() По -2 Цикл // Обходим колонки справа налево, первую не трогаем
    ПустаяКолонка = 1;
    Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы() Цикл
        Область = ТабДок.Область(НомерСтроки, -НомерКолонки, НомерСтроки, -НомерКолонки);
        Если ПустоеЗначение(Область.Текст) = 0 Тогда
            ПустаяКолонка = 0;
            Прервать;
        КонецЕсли;
    КонецЦикла;

    Если ПустаяКолонка = 1 Тогда
        УдаляемаяОбласть = ТабДок.Область(, -НомерКолонки, , -НомерКолонки);
        ЛеваяОбласть     = ТабДок.Область(, -НомерКолонки - 1, , -НомерКолонки - 1);
        
        // Прибавляем ширину удаляемой колонки к левой
        ЛеваяОбласть.ШиринаСтолбца(ЛеваяОбласть.ШиринаСтолбца() + УдаляемаяОбласть.ШиринаСтолбца());
        
        // Удаляем пустую колонку
        ТабДок.УдалитьКолонки(-НомерКолонки, 1);
    КонецЕсли;
КонецЦикла;

Разберем ключевые особенности работы этого кода:

  1. Обход осуществляется в обратном порядке (используются отрицательные индексы), чтобы при удалении колонки не сбивалась нумерация оставшихся столбцов.
  2. Метод Область.Текст проверяется через функцию ПустоеЗначение(). Если в колонке по всей высоте таблицы нет текста, она признается кандидотом на удаление.
  3. Ширина левой соседней колонки увеличивается с помощью метода ШиринаСтолбца(), после чего вызывается метод ТабДок.УдалитьКолонки().

Рекомендации по оптимизации печатных форм

Помимо удаления лишних колонок, при рефакторинге макетов рекомендуется соблюдать следующие правила:

  1. Фиксированная высота строк: Отключите автовысоту для секций, где размер текста заранее известен. Это исключит лишние математические операции при формировании строк.
  2. Использование выравнивания по выделенным столбцам: Для заголовочных надписей вместо объединения ячеек используйте горизонтальное свойство выравнивания «По выделенным столбцам». Визуально результат идентичен, но структура таблицы остается проще.
  3. Порционная пакетная печать: При необходимости напечатать большой объем документов не формируйте один гигантский табличный документ. Выводите документы небольшими партиями (например, по 20–50 штук), отправляйте на принтер и очищайте результирующий объект методом Очистить().
  4. Проектирование на стандартной сетке: По возможности перерисуйте макет вручную с базовым шагом. Для стандартных документов (ТОРГ-12, УПД) обычно достаточно 15–25 колонок строго заданной ширины вместо 100+ микро-колонок.
← На главную