При формировании печатных форм и отчетов (в частности, на базе «Универсального отчета») часто возникает задача выводить заголовок таблицы на каждой странице. Для этого в платформе 1С предусмотрено специальное свойство табличного документа — ПовторятьПриПечатиСтроки. Однако нередко разработчики сталкиваются с ситуацией, когда при попытке присвоить этому свойству область ячеек значение не устанавливается, оставаясь равным Ложь или вызывая ошибку.
Разберем причины такого поведения платформы и пошагово выясним, как правильно передавать область строк для корректной печати.
Проанализируем типичный пример ошибочного кода, с которого начинается большинство подобных проблем:
ШапкаДляПовтора = ТабличныйДокумент.Область("R7C2:R7C5");
ТабличныйДокумент.ПовторятьПриПечатиСтроки = ШапкаДляПовтора;
В этом примере разработчик пытается выделить конкретный диапазон ячеек, соответствующий видимым колонкам шапки документа (со 2-й по 5-ю колонку 7-й строки). Однако свойство ПовторятьПриПечатиСтроки объекта ТабличныйДокумент предъявляет строгое требование к типу передаваемой области.
Свойство принимает объект типа ОбластьЯчеекТабличногоДокумента, но его свойство ТипОбласти обязательно должно иметь значение ТипОбластиЯчеекТабличногоДокумента.Строки. Когда в адресе указываются и строки, и колонки (например, "R7C2:R7C5"), создается область типа Прямоугольник. Платформа 1С не может применить прямоугольный блок ячеек в качестве сквозных строк листа, поэтому присвоение игнорируется, а свойство сохраняет исходное состояние.
Для того чтобы свойство приняло область, необходимо передать строку или диапазон строк целиком, без явного ограничения по колонкам. Рассмотрим основные способы реализации этого механизма в коде.
Использование строковой нотации строк:
Если номер строки с шапкой известен заранее, достаточно указать только индекс строки с буквой R (Row):
ШапкаДляПовтора = ЭлементыФормы.ПолеТабличногоДокументаРезультат.Область("R7");
ЭлементыФормы.ПолеТабличногоДокументаРезультат.ПовторятьПриПечатиСтроки = ШапкаДляПовтора;
Если шапка многострочная (например, занимает строки с 7-й по 9-ю включительно), диапазон указывается через двоеточие:
ТабличныйДокумент.ПовторятьПриПечатиСтроки = ТабличныйДокумент.Область("R7:R9");
Числовой вызов метода Область():
Посмотрим на числовой вариант вызова метода Область(). Чтобы получить область строк целиком, параметры номеров колонок просто опускаются:
// Для одной строки:
ТабличныйДокумент.ПовторятьПриПечатиСтроки = ТабличныйДокумент.Область(7, , 7, );
// Для диапазона строк:
ТабличныйДокумент.ПовторятьПриПечатиСтроки = ТабличныйДокумент.Область(НачальнаяСтрока, , КонечнаяСтрока, );
Использование именованных областей макета:
Если отчет формируется классическим выводом секций макета, в результирующем документе сохраняются имена выведенных областей строк. В таком случае можно обратиться к коллекции областей напрямую:
ТабличныйДокумент.ПовторятьПриПечатиСтроки = ТабличныйДокумент.Области.ШапкаТаблицы;
Важно: область должна принадлежать именно результирующему объекту ТабличныйДокумент, а не исходному объекту Макет.
В универсальных отчетах структура шапки динамическая: при изменении состава группировок, включении или отключении фильтров, а также при выводе заголовка отчета номер строки с шапкой сдвигается. Жестко прописанный адрес "R7" в таких условиях может начать указывать на пустую строку или строки параметров.
Разберем, как динамически найти нужную строку шапки перед назначением повтора при печати:
Поиск по тексту заголовка колонки:
Мы можем программно найти ячейку с известным текстом колонки (например, «Номенклатура» или «Количество») и получить номер её строки:
НайденнаяОбласть = ТабличныйДокумент.НайтиТекст("Номенклатура");
Если НайденнаяОбласть <> Неопределено Тогда
ТабличныйДокумент.ПовторятьПриПечатиСтроки = ТабличныйДокумент.Область(НайденнаяОбласть.Верх, , НайденнаяОбласть.Низ, );
КонецЕсли;
Определение по экранной фиксации:
Если в параметрах универсального отчета включена фиксация шапки (ФиксироватьЗаголовок = Истина), платформа при выводе автоматически рассчитывает координату и заполняет свойство ТабличныйДокумент.ФиксацияСверху. Значение этого свойства как раз указывает на нижнюю границу шапки таблицы, что дает возможность определить границы диапазона для печати.
Рассмотрим правила и ограничения, о которых необходимо помнить при настройке печати табличных документов:
Очистить(), который часто вызывается в начале формирования отчета, полностью сбрасывает все параметры печати и сквозных строк. Назначение свойства ПовторятьПриПечатиСтроки необходимо выполнять строго после полного завершения вывода данных в документ.ФиксацияСверху отвечает исключительно за закрепление строк на экране монитора при интерактивной прокрутке, а свойство ПовторятьПриПечатиСтроки — исключительно за постраничный вывод на принтер. Они независимы друг от друга.ИмяПараметровПечати), эта настройка сохранится для пользователя..xls или .xlsx) свойство ПовторятьПриПечатиСтроки автоматически транслируется в стандартные сквозные строки листа Excel.