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