Как выводить заголовок таблицы отчета на каждой странице в 1С при использовании СКД?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет Финансы и профессиональные услуги
← На главную

При работе с типовыми отчетами на платформе 1С:Предприятие 8.3, построенными на системе компоновки данных (СКД), часто возникает необходимость выводить шапку таблицы на каждом печатном листе. Стандартные настройки СКД не всегда позволяют сделать это «галочкой», поэтому разработчикам приходится прибегать к программной доработке формирования табличного документа.

Разберем суть проблемы

В типовых конфигурациях, таких как БГУ 2.0, отчеты формируются динамически. СКД самостоятельно выводит данные, и количество строк в таблице заранее неизвестно. Обычные настройки Табличного документа (через меню «Настройка печати») могут сбрасываться после закрытия отчета, поэтому надежнее всего реализовать эту логику через расширение конфигурации.

Решение через программную настройку области печати

Наиболее эффективным методом является использование события ПослеВыводаРезультата. В этом событии мы получаем готовый объект ТабличныйДокумент и программно указываем ему, какие именно строки должны повторяться при печати.

Рассмотрим пример кода, который можно поместить в расширение конфигурации:


&После("ПослеВыводаРезультата")
Процедура АСП_ОСВ_ПослеВыводаРезультата(Результат)
    // Проверяем наличие области заголовка в табличном документе
    Если Результат.Области.Найти("Заголовок") <> Неопределено Тогда
        // Устанавливаем область строк для повторения на каждой странице
        // В данном случае используем диапазон от 5 строки до конца зафиксированной шапки
        Результат.ПовторятьПриПечатиСтроки = Результат.Область(5,, Результат.ФиксацияСверху);
    Иначе
        // Если область не найдена, используем стандартную высоту шапки
        Результат.ФиксацияСверху = ВысотаШапки;
    КонецЕсли;
КонецПроцедуры

Почему это работает?

  1. Свойство ПовторятьПриПечатиСтроки — это встроенный механизм объекта ТабличныйДокумент. Он принимает область (диапазон строк), которая будет автоматически копироваться при разбиении документа на страницы принтером.
  2. Метод Область(5,, Результат.ФиксацияСверху) позволяет динамически задать диапазон строк. Мы используем Результат.ФиксацияСверху, так как в типовых отчетах именно эта область обычно отвечает за закрепленные строки заголовка.
  3. Использование расширения (директива &После) гарантирует, что наши изменения сработают после того, как СКД полностью сформирует документ, и мы не сломаем логику работы типового отчета.

Альтернативный подход при ручном выводе строк

Если вы разрабатываете отчет самостоятельно и выводите строки в цикле, вы можете использовать метод ПроверитьВывод(). Это позволит «предсказать» конец страницы и принудительно вывести шапку перед началом нового листа.


// Пример логики при ручном выводе строк
ОбластьШапки = Макет.ПолучитьОбласть("Шапка");
Для Каждого СтрокаДанных Из Результат Цикл
    ОбластьСтроки.Параметры.Заполнить(СтрокаДанных);
    
    // Проверяем, помещается ли строка на страницу
    Если НЕ ТабДокумент.ПроверитьВывод(ОбластьСтроки) Тогда
        ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
        ТабДокумент.Вывести(ОбластьШапки);
    КонецЕсли;
    
    ТабДокумент.Вывести(ОбластьСтроки);
КонецЦикла;

Полезные советы и нюансы

При настройке повтора строк обязательно учитывайте следующие моменты:

Применяя данные подходы, вы сможете обеспечить корректный вывод многостраничных отчетов, что значительно упростит чтение документации для пользователей и бухгалтеров.

← На главную