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