При формировании печатных форм в 1С разработчики часто сталкиваются с ситуацией, когда часть параметров макета остается незаполненной. Если выводить весь макет целиком, на листе остаются пустышки или сдвинутые ячейки, что портит внешний вид документа. Проанализируем основные способы, которые позволяют программно скрыть или удалить незаполненные строки и колонки табличного документа.
Разберем классический подход, когда макет табличного документа изначально делится на логические именованные области. Вместо вывода одного большого блока макета целиком, проверим каждый параметр перед выводом или удалим неиспользуемую область из уже сформированного документа.
Если пустые ячейки выводятся в строке рядом с фиксированными параметрами, необходимо разбить макет на отдельные строки или вертикальные/горизонтальные секции. Когда в документе требуется удалить полностью пустую область, используется метод УдалитьОбласть().
Рассмотрим пример кода с удалением неиспользуемой области по условию:
// Получаем макет и область с параметрами
Макет = ПолучитьМакет("Макет");
ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаПараметров");
Если ЗначениеЗаполнено(СтруктураДанных.Параметр1) Тогда
ОбластьСтрока.Параметры.Параметр1 = СтруктураДанных.Параметр1;
Иначе
// Если параметр пуст, можно удалить конкретную область
Макет.УдалитьОбласть(Макет.Область("Параметр1"), ТипСмещенияТабличногоДокумента.ПоВертикали);
КонецЕсли;
Важный нюанс: при вызове метода УдалитьОбласть() критически важно указывать второй параметр — ТипСмещенияТабличногоДокумента.ПоВертикали. По умолчанию платформа производит удаление без смещения ячеек (БезСмещения), из-за чего строка останется пустой с исходной высотой.
Посмотрим на более гибкий способ, позволяющий избежать удаления областей постфактум. Выясним, как формировать документ динамически, комбинируя методы Вывести() и Присоединить().
Разделим макет на основные обязательные секции (выводимые слева) и дополнительные правые блоки:
Вывести().Присоединить().
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
ОбластьШапкаЛево = Макет.ПолучитьОбласть("Шапка|ОсновнаяЧасть");
ОбластьПараметр = Макет.ПолучитьОбласть("Шапка|ДопКолонка");
// Выводим обязательную часть
ТабДок.Вывести(ОбластьШапкаЛево);
// Присоединяем только заполненные параметры
Для Каждого Стр Из МассивПараметров Цикл
Если ЗначениеЗаполнено(Стр.Значение) Тогда
ОбластьПараметр.Параметры.Заполнение = Стр.Значение;
ТабДок.Присоединить(ОбластьПараметр);
КонецЕсли;
КонецЦикла;
Проанализируем еще одну альтернативу — предварительную подготовку данных в коде до обращения к макету. Вместо того чтобы привязывать каждый параметр к строго определенной строке макета, можно собрать все заполненные значения в массив или таблицу значений.
Шаги реализации подходы:
При таком подходе данные автоматически «подтягиваются» вверх, и пустые пропуски в печатной форме не образуются вовсе.
При использовании метода УдалитьОбласть() и программном сжатии табличного документа следует учитывать следующие моменты:
1. Обратный порядок перебора при постобработке
Если перебирается уже готовый ТабличныйДокумент для удаления пустых строк, цикл необходимо выполнять строго с конца таблицы к началу (от ВысотаТаблицы до 1 с шагом -1). В противном случае удаление строки сдвинет индексы нижележащих ячеек, и идущие подряд пустые строки будут пропущены.
2. Объединенные ячейки и границы
При удалении со смещением в документах со сложной разметкой (объединенные ячейки, рамки) могут искажаться визуальные границы соседних блоков. Чтобы предотвратить сдвиг колонок при сложной верстке, используется метод СоздатьФорматСтрок() для формирования независимого формата колонок в каждой секции.