При разработке отчетов и печатных форм часто возникает ситуация, когда табличный документ уже полностью сформирован, но требуется точечно подкорректировать его внешний вид. Одной из таких задач является изменение высоты конкретной строки, которая находится не в самом конце, а где-то в середине документа. В этой статье мы разберем несколько эффективных способов решения этой задачи, проанализируем нюансы работы с областями и выясним, как избежать типичных ошибок при верстке табличных документов.
Самый простой и очевидный способ изменить высоту строки — обратиться к любой ячейке в этой строке, используя строковый адрес в формате R1C1 (Row-Column). Давайте рассмотрим пример, когда нам нужно установить высоту пятой строки равной 30 пунктам.
Проанализируем следующий код:
// Обращаемся к ячейке на пересечении 5-й строки и 1-й колонки
Ячейка = ТабДок.Область("R5C1");
// Устанавливаем фиксированную высоту
Ячейка.ВысотаСтроки = 30;
Важно понимать, что свойство ВысотаСтроки применяется ко всей строке, в которой находится указанная ячейка. Поэтому не имеет значения, укажете вы R5C1 или R5C10 — результат будет одинаковым для всей пятой строки.
В процессе программной обработки больших документов формирование строковых адресов вида "R" + НомерСтроки + "C1" может быть неудобным и приводить к лишним затратам ресурсов на конкатенацию строк. Рассмотрим более профессиональный метод — использование числовых индексов в методе Область().
Синтаксис метода выглядит так: Область(НомерПервойСтроки, НомерПервойКолонки, НомерПоследнейСтроки, НомерПоследнейКолонки). Если нам нужно изменить высоту только одной строки, мы указываем её номер дважды в качестве границ диапазона:
// Изменяем высоту 5-й строки, используя числовые индексы
НомерНужнойСтроки = 5;
ТабДок.Область(НомерНужнойСтроки, 1, НомерНужнойСтроки, 1).ВысотаСтроки = 30;
Такой подход делает код чище и избавляет от потенциальных ошибок при формировании строковых адресов.
Иногда мы заранее не знаем точный номер строки (например, если документ формируется динамически и количество строк в шапке или табличной части меняется). В этом случае мы можем воспользоваться тем, что метод Вывести() возвращает объект типа ОбластьТабличногоДокумента, соответствующий выведенному фрагменту.
Давайте разберем по шагам, как это реализовать:
Пример реализации:
// В процессе формирования документа
НоваяСтрока = ТабДок.Вывести(Макет.ПолучитьОбласть("СтрокаДанных"));
// Сразу меняем высоту выведенной строки
НоваяСтрока.ВысотаСтроки = 25;
// Или запоминаем область для последующей правки
МассивОбластей.Добавить(НоваяСтрока);
Важный нюанс: если вы выводите одну и ту же область макета многократно в цикле, то переменная будет хранить ссылку только на последнюю выведенную область. Если вам нужно изменить высоту всех строк или какой-то специфической строки, обязательно сохраняйте ссылки в массив или список значений.
При работе с высотой строк в 1С:Предприятие 8 существует критически важный параметр — свойство АвтоВысотаСтроки. Если для ячейки установлено значение Истина, платформа будет пытаться рассчитать высоту самостоятельно, исходя из объема текста и выбранного шрифта. В этом случае ваше программное присвоение значения ВысотаСтроки = 30 может быть проигнорировано или сброшено.
Чтобы гарантированно установить свой размер, проанализируем следующий прием:
Область = ТабДок.Область(10, 1, 10, 1);
// Отключаем автоматический расчет, чтобы принудительно задать размер
Область.АвтоВысотаСтроки = Ложь;
Область.ВысотаСтроки = 40;
Если перед нами стоит задача изменить высоту не одной, а сразу целого диапазона строк (например, с 10-й по 20-ю), не стоит делать это в цикле. Это неэффективно с точки зрения производительности. Платформа 1С позволяет применить свойство сразу ко всей области строк.
Рассмотрим пример:
// Получаем область, охватывающую строки с 10 по 20 по всем колонкам
// Обратите внимание: индексы колонок можно не указывать
ОбластьГруппы = ТабДок.Область(10, , 20, );
ОбластьГруппы.ВысотаСтроки = 15;
Такой метод значительно ускоряет работу кода на больших отчетах, так как система пересчитывает геометрию документа один раз, а не десять.
Иногда разработчики пытаются скрыть строку, устанавливая ВысотаСтроки = 0. Хотя визуально это может выглядеть корректно, правильнее использовать свойство Видимость. Это обеспечивает более предсказуемое поведение при печати и при экспорте документа в форматы Excel или PDF.
// Правильный способ скрыть строку
ТабДок.Область(5, , 5, ).Видимость = Ложь;
Выясним причину возможных задержек при выполнении подобных операций. Каждый раз, когда вы меняете высоту строки в уже сформированном документе (особенно если в нем тысячи строк), платформа инициирует пересчет координат всех последующих элементов. Если вам нужно изменить высоту множества строк, старайтесь делать это либо в процессе вывода (как в Способе 3), либо одним массовым выделением области. Изменение каждой строки в отдельном цикле на документе в 50 000 строк может занять значительное время.
Подводя итог, отметим, что для изменения высоты в уже готовом документе оптимально использовать метод Область() с числовыми координатами и обязательным контролем свойства АвтоВысотаСтроки.