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