Как исправить выход табличного документа за границы страницы при объединении нескольких печатных форм

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

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

Рассмотрим детально, почему это происходит и как правильно решить данную проблему несколькими способами.

Почему табличный документ «вылезает» за границы?

Проанализируем механику работы объекта ТабличныйДокумент. Когда мы используем метод Вывести(), система пытается вписать новые данные в уже существующую структуру колонок. Если в первом макете (отчете) задано 5 широких колонок, а в присоединяемом макете (счете) — 20 узких, 1С попытается сопоставить их индексы. В результате структура «схлопывается», и содержимое второго документа становится нечитаемым или выходит за границы печати.

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

Способ 1. Использование метода СоздатьФорматСтрок()

Это самый профессиональный и надежный программный метод. Он позволяет каждой секции табличного документа иметь свои собственные настройки ширины колонок, независимые от предыдущих строк. Разберем по шагам, как это реализовать.

При формировании итогового документа, перед тем как вывести новую область (например, счет), нам нужно указать системе, что для этой области требуется новый формат строк. Рассмотрим пример кода:


// Предположим, ТабДокОбщий - это наш результирующий документ
// ТабДокСчет - это сформированный счет из типового механизма

ОбластьДляВставки = ТабДокОбщий.Вывести(ТабДокСчет);
// Устанавливаем новый формат строк для выведенной области
ОбластьДляВставки.СоздатьФорматСтрок();

Использование СоздатьФорматСтрок() гарантирует, что 1С создаст в структуре MXL-файла отдельное описание колонок для этого блока. В результате макет счета сохранит свой вид «как в оригинале», даже если выше него в этом же документе расположен отчет с совершенно другой разметкой.

Способ 2. Синхронизация сетки макетов (Визуальный метод)

Выясним, как решить проблему без сложного кодирования, если вы создаете собственный макет «с нуля». Как показывает практика, часто бывает проще подогнать разметку основного отчета под структуру типового счета.

Проанализируем типовой макет ПФ_MXL_СчетЗаказ в конфигурации «Бухгалтерия предприятия». Он часто содержит множество очень узких служебных колонок (шириной 1 или 2), которые используются как «миллиметровка» для точного позиционирования текста. Если вы возьмете разметку этого макета за основу своего отчета, объединение пройдет бесшовно.

Порядок действий:

  1. Откройте типовой макет счета.
  2. Скопируйте все колонки (выделите заголовки колонок сверху) и вставьте их в свой новый макет.
  3. Располагайте данные своего отчета, объединяя ячейки в соответствии с этой сеткой.

В этом случае при объединении двух документов методом Вывести() индексы колонок совпадут, и масштаб страницы останется корректным.

Способ 3. Программная настройка параметров страницы и автократности

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


// Устанавливаем параметры ПОСЛЕ формирования всего документа
ТабДокОбщий.Автомасштаб = Истина;
ТабДокОбщий.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДокОбщий.ПовторятьПриПечатиСтроки = ТабДокОбщий.Область(1, , 2, ); // Если нужны заголовки

Важно помнить: свойства Автомасштаб и ОриентацияСтраницы применяются ко всему документу целиком. Если вы сначала вывели отчет в ландшафте, а затем приклеили счет в портрете, итоговый документ примет одну общую настройку, что может привести к обрезанию краев одной из частей.

Способ 4. Проверка вывода и разделители страниц

Чтобы счета не «налезали» друг на друга и каждый начинался с новой страницы, необходимо использовать проверку вывода. Проанализируем ситуацию: если мы просто выводим документы один за другим, 1С может попытаться уместить начало счета на остатке страницы предыдущего отчета. Это часто сбивает алгоритм автоматического масштабирования.

Рекомендуется использовать метод ПроверитьВывод() или принудительно вставлять разделитель:


// Перед выводом очередного счета
ТабДокОбщий.ВывестиГоризонтальныйРазделительСтраниц();
ТабДокОбщий.Вывести(ТабДокСчет);

Это гарантирует, что расчет ширины колонок для новой страницы начнется «с чистого листа» в контексте печатного механизма.

Способ 5. Использование инструментов БСП (УправлениеПечатью)

В современных конфигурациях, таких как БП 3.0, для работы с печатными формами лучше использовать функции Библиотеки стандартных подсистем (БСП). Вместо ручного объединения через Вывести(), рассмотрите возможность использования коллекции печатных форм.

Методы модуля УправлениеПечатью (например, ВывестиТабличныеДокументыВЕдиныйТабличныйДокумент) умеют корректно обрабатывать разрывы страниц и сохранять уникальное форматирование каждого вложенного документа, автоматически применяя механизмы создания формата строк, которые мы разобрали выше.

Резюме

Для исправления выхода за границы страницы при объединении табличных документов:

  1. Используйте Область.СоздатьФорматСтрок() для каждой добавляемой части, чтобы изолировать сетку колонок.
  2. Устанавливайте Автомасштаб = Истина только для финального (общего) документа.
  3. Если используется ручное проектирование макетов, старайтесь придерживаться единой структуры колонок, заимствованной из типовых решений.
  4. Всегда проверяйте ОриентациюСтраницы: она должна быть одинаковой для всех объединяемых форм.
← На главную