Как в печатной форме 1С скрыть или удалить ячейку, если в ней нет данных?

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

При разработке печатных форм часто возникает ситуация, когда в макете есть статичный текст (например, слово «Номер:» или «ИНН:»), а рядом с ним находится параметр. Если параметр не заполнен, в готовой печатной форме остается «висящий» заголовок без значения, что выглядит непрофессионально. Рассмотрим подробнее, как программно скрыть такие ячейки или целые области, чтобы форма выглядела корректно.

Способ 1. Использование нескольких областей в макете (самый надежный)

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

Разберем по шагам:

  1. В макете (MXL) создадим две области, например, ШапкаСНомером и ШапкаБезНомера.
  2. В коде формирования печатной формы добавим условие для проверки заполнения данных.
  3. В зависимости от результата выведем нужную область в итоговый табличный документ.

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


Если ЗначениеЗаполнено(СсылкаНаОбъект.Контрагент.НалоговыйНомер) Тогда
    ОбластьШапка = Макет.ПолучитьОбласть("ШапкаСНомером");
    ОбластьШапка.Параметры.НалоговыйНомер = СсылкаНаОбъект.Контрагент.НалоговыйНомер;
Иначе
    ОбластьШапка = Макет.ПолучитьОбласть("ШапкаБезНомера");
КонецЕсли;

// Заполняем остальные общие параметры
ОбластьШапка.Параметры.Дата = Формат(СсылкаНаОбъект.Дата, "ДФ=dd.MM.yyyy");
ТабДокумент.Вывести(ОбластьШапка);

Этот метод исключает ошибки позиционирования и гарантирует, что верстка «не поедет».

Способ 2. Объединение текста и параметра в одну ячейку

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

Рассмотрим, как это реализовать:

  1. В макете в ячейке устанавливаем тип Параметр и называем его, например, ПредставлениеНомера.
  2. В коде формируем строку с условием:

Если ЗначениеЗаполнено(СсылкаНаОбъект.Контрагент.НалоговыйНомер) Тогда
    ОбластьШапка.Параметры.ПредставлениеНомера = "Налоговый номер: " + СсылкаНаОбъект.Контрагент.НалоговыйНомер;
Иначе
    ОбластьШапка.Параметры.ПредставлениеНомера = "";
КонецЕсли;

В этом случае, если номера нет, ячейка просто останется пустой, и статичное слово «Налоговый номер:» не появится.

Способ 3. Программное изменение текста в выведенной области

Иногда требуется изменить содержимое конкретной ячейки уже после того, как мы получили область из макета, но до того, как вывели её в финальный документ. Здесь важно понимать разницу между Макет (чертеж) и ТабДокумент (готовый результат).

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


ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
Если Не ЗначениеЗаполнено(СсылкаНаОбъект.Контрагент.НалоговыйНомер) Тогда
    // Обращаемся к конкретной ячейке внутри области по имени или адресу
    ОбластьШапка.Область("R1C1").Текст = ""; 
КонецЕсли;
ТабДокумент.Вывести(ОбластьШапка);

Важный момент: если вы используете тип ячейки Шаблон, то 1С ожидает заполнения параметров. Если вы принудительно очищаете Текст ячейки, шаблон перестает работать для этой конкретной итерации вывода.

Способ 4. Использование метода Присоединить()

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

Разберем алгоритм:

  1. Разделим строку в макете на несколько горизонтальных секций (например, ЛеваяЧасть, Номер, ПраваяЧасть).
  2. Выводим левую часть методом Вывести().
  3. Если данные для номера есть, используем метод Присоединить().

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

Если ЗначениеЗаполнено(НалоговыйНомер) Тогда
    ОбластьНомер = Макет.ПолучитьОбласть("Шапка|Номер");
    ОбластьНомер.Параметры.Номер = НалоговыйНомер;
    ТабДокумент.Присоединить(ОбластьНомер);
КонецЕсли;

Это позволяет динамически «схлопывать» колонки, если данных в них нет.

Способ 5. Скрытие через высоту строк и видимость

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

Более надежный способ программно «схлопнуть» выведенную строку — установить её высоту в 0:


// Допустим, мы знаем, что вывели строку, которая оказалась пустой
НомерСтроки = ТабДокумент.ВысотаТаблицы;
ТабДокумент.Область("R" + НомерСтроки).ВысотаСтроки = 0;

Рекомендации по выбору метода

Подведем итоги нашего анализа:

Помните, что манипуляции с ТабДокумент.Область("R1C1:R1C2") требуют точного понимания координат. В динамических печатных формах, где количество строк заранее неизвестно, лучше оперировать именованными областями макета, а не жесткими адресами ячеек.

← На главную