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

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

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

Способ 1. Разбиение макета на именованные области и метод УдалитьОбласть()

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

Если пустые ячейки выводятся в строке рядом с фиксированными параметрами, необходимо разбить макет на отдельные строки или вертикальные/горизонтальные секции. Когда в документе требуется удалить полностью пустую область, используется метод УдалитьОбласть().

Рассмотрим пример кода с удалением неиспользуемой области по условию:


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

Если ЗначениеЗаполнено(СтруктураДанных.Параметр1) Тогда
    ОбластьСтрока.Параметры.Параметр1 = СтруктураДанных.Параметр1;
Иначе
    // Если параметр пуст, можно удалить конкретную область
    Макет.УдалитьОбласть(Макет.Область("Параметр1"), ТипСмещенияТабличногоДокумента.ПоВертикали);
КонецЕсли;

Важный нюанс: при вызове метода УдалитьОбласть() критически важно указывать второй параметр — ТипСмещенияТабличногоДокумента.ПоВертикали. По умолчанию платформа производит удаление без смещения ячеек (БезСмещения), из-за чего строка останется пустой с исходной высотой.

Способ 2. Посекционное формирование с помощью методов Вывести() и Присоединить()

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

Разделим макет на основные обязательные секции (выводимые слева) и дополнительные правые блоки:

  1. Выводим обязательную левую область строки через метод Вывести().
  2. Проверяем заполненность каждого дополнительного параметра в цикле или по условию.
  3. Если параметр заполнен, подстыковываем соответствующую вертикальную область справа с помощью метода Присоединить().

ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");

ОбластьШапкаЛево = Макет.ПолучитьОбласть("Шапка|ОсновнаяЧасть");
ОбластьПараметр = Макет.ПолучитьОбласть("Шапка|ДопКолонка");

// Выводим обязательную часть
ТабДок.Вывести(ОбластьШапкаЛево);

// Присоединяем только заполненные параметры
Для Каждого Стр Из МассивПараметров Цикл
    Если ЗначениеЗаполнено(Стр.Значение) Тогда
        ОбластьПараметр.Параметры.Заполнение = Стр.Значение;
        ТабДок.Присоединить(ОбластьПараметр);
    КонецЕсли;
КонецЦикла;

Способ 3. Предварительная фильтрация данных перед выводом

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

Шаги реализации подходы:

  1. Обходим входящие данные и помещаем только непустые значения в массив.
  2. Запускаем цикл по полученному массиву заполненных значений.
  3. Выводим универсальную область строки макета, заполняя параметры по порядку.

При таком подходе данные автоматически «подтягиваются» вверх, и пустые пропуски в печатной форме не образуются вовсе.

Ограничения и технические особенности работы с областями

При использовании метода УдалитьОбласть() и программном сжатии табличного документа следует учитывать следующие моменты:

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

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

← На главную