При доработке печатных форм в конфигурациях 1С (например, 1С:Управление торговлей 11.3) разработчики часто сталкиваются с задачей размещения нескольких документов на одной странице. Для этого в макете снимаются разделители страниц, а для строк задается свойство Вместе со следующим. Однако при таком подходе возникают побочные эффекты: шапка табличной части начинает дублироваться в произвольных местах (посреди таблицы) или полностью пропадает на отдельных страницах.
Разберем подробнее причины такого поведения платформы 1С и проанализируем шаги, необходимые для полного исправления данной неполадки.
Выясним, почему логика типовой печатной формы дает сбой при объединении нескольких документов в один табличный документ:
ПроверитьВывод() и вызова шапки: В модуле менеджера проверка заполнения листа выполняется с помощью метода ПроверитьВывод(). Если отключить горизонтальные разделители страниц, но оставить условие проверки заполнения страницы вместе с повторным вызовом процедуры ВывестиШапку(), табличный документ начнет выводить шапку прямо посередине текущего листа.ТабличныйДокумент внутренние счетчики строк или флаги первого документа продолжают влиять на последующие документы.Рассмотрим порядок правильной настройки макета ПФ_MXL_ЗаказКлиента:
Проанализируем изменения в модуле менеджера обработки печати. Для предотвращения появления повторных шапок внутри сформированной таблицы необходимо отключить или переработать механизм автоматического разрыва страниц.
В типовой функции формирования печатной формы найдем блок проверки вывода. Как правило, он выглядит следующим образом:
МассивПроверкиВывода = Новый Массив;
МассивПроверкиВывода.Добавить(ОбластьСтрока);
Если НЕ ТабличныйДокумент.ПроверитьВывод(МассивПроверкиВывода) Тогда
// Внутри блока происходит вывод разделителя страниц и повторный вывод шапки
ВывестиШапку(ТабличныйДокумент, ОбластьНомераШапки, ОбластьКодовШапки, ОбластьТоварШапки, ОбластьДанныхШапки, ВыводитьКоды);
КонецЕсли;
Если задача состоит в сквозной печати нескольких документов без жестких искусственных переносов, необходимо закомментировать условие с вызовом ПроверитьВывод() и отключить лишний повторный вызов ВывестиШапку():
// Закомментируем повторный вывод шапки и разделителей
// ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
// ВывестиШапку(ТабличныйДокумент, ОбластьНомераШапки, ОбластьКодовШапки, ОбластьТоварШапки, ОбластьДанныхШапки, ВыводитьКоды);
Отключение вызова повторной шапки внутри цикла вывода строк номенклатуры полностью исключит её появление в середине таблицы одного заказа.
Для того чтобы шапка таблицы автоматически дублировалась вверху каждого нового листа при естественном переносе строк на следующий лист (без ручного расчета высоты через ПроверитьВывод()), рекомендуется доверить эту функцию самой платформе 1С.
Посмотрим на пример кода, устанавливающего повтор строк на каждом новом листе:
// Указываем диапазон строк готового результирующего документа, которые должны повторяться
ТабличныйДокумент.ПовторятьПриПечатиСтроки = ТабличныйДокумент.Область("R5:R6");
Важное замечание: Свойство ПовторятьПриПечатиСтроки применяется ко всему объекту ТабличныйДокумент. Если в один документ выводятся разные типы печатных форм или документы с разной структурой, диапазон повторения строк должен задаваться единообразно или обрабатываться через пакетную печать.
Если требуется сохранить стандартную верстку каждого заказа и печатать их комплектом без сбоев в шапках, рассмотрим вариант использования объекта ПакетОтображаемыхДокументов или стандартного механизма БСП. В этом случае для каждого заказа формируется свой отдельный ТабличныйДокумент, после чего они отправляются на печать единым пакетом, не нарушая зафиксированную структуру страниц.