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