Как правильно настроить перенос групп строк на новую страницу в макете 1С, чтобы данные не разрывались?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

При формировании печатных форм, таких как упаковочные листы, накладные или спецификации, разработчики часто сталкиваются с проблемой некрасивого разрыва данных. Например, когда заголовок упаковочного листа печатается в конце одной страницы, а список товаров переносится на следующую. В идеале система должна анализировать свободное место и, если блок не помещается целиком, переносить его на новый лист. Рассмотрим, какими инструментами обладает платформа 1С для решения этой задачи, и разберем по шагам наиболее эффективные подходы. Для пользовательской настройки типовых макетов пригодится инструкция по редактированию печатных форм в 1С.

Способ 1. Использование свойства макета «Вместе со следующим»

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

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

Алгоритм настройки в макете:

  1. Откроем макет вашей печатной формы.
  2. Выделим все строки, которые составляют один логический блок (например, от заголовка упаковочного листа до последней строки его подвала).
  3. Перейдем в палитру свойств (Alt+Enter) и найдем раздел Параграф.
  4. Установим галочку Вместе со следующим.
  5. Важный нюанс: Чтобы механизм работал корректно, нам нужно «разорвать» связь между разными упаковочными листами. Для этого выделим самую последнюю строку блока (обычно это подвал или пустая строка-разделитель) и снимем у нее этот флаг.

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

Способ 2. Программный метод ПроверитьВывод()

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

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


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

// Проверяем, поместится ли весь блок на текущую страницу
Если НЕ ТабДокумент.ПроверитьВывод(МассивОбластей) Тогда
    // Если не помещается — вставляем разрыв страницы
    ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;

// Теперь выводим области по отдельности
ТабДокумент.Вывести(ОбластьЗаголовок);
ТабДокумент.Вывести(ОбластьШапкаТаблицы);
// ... и так далее в цикле

Выясним причину, по которой этот метод может работать нестабильно. Метод ПроверитьВывод() очень чувствителен к настройкам принтера по умолчанию. Если в системе не установлен принтер или некорректно заданы поля страницы в параметрах печати табличного документа, метод может возвращать Истина, хотя по факту текст «уедет» на другой лист. Поэтому перед проверкой всегда рекомендуется явно задавать параметры страницы:


ТабДокумент.АвтоМасштаб = Истина;
ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДокумент.ПолеСверху = 10;
ТабДокумент.ПолеСнизу = 10;

Способ 3. Управление разрывами через «Начало страницы»

Если ваша задача требует, чтобы каждый новый упаковочный лист всегда начинался с новой страницы (независимо от того, сколько места осталось на предыдущей), следует использовать свойство Начало страницы.

Посмотрим на настройки: если в свойствах строки макета на той же вкладке Параграф установить флаг Начало страницы, то при выводе этой области 1С всегда будет добавлять разделитель страниц перед ней. Это избавляет от необходимости писать ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц() в коде. Однако, как мы помним из запроса автора, нам нужно «компактное» размещение, поэтому данный метод подходит только для случаев, когда один лист — это строго один документ.

Сравнение и рекомендации

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

  1. Свойство «Вместе со следующим»:
    • Плюсы: Отсутствие лишнего кода, высокая скорость работы (отрисовкой занимается графическое ядро), легкость поддержки.
    • Минусы: Сложнее визуально контролировать в макете, легко ошибиться и оставить лишнюю «галочку», что приведет к неожиданным переносам.
  2. Метод «ПроверитьВывод()»:
    • Плюсы: Полный контроль над процессом из кода, возможность гибко менять состав проверяемых областей.
    • Минусы: Требует написания кода, зависит от настроек принтера, может незначительно замедлять формирование очень больших отчетов (тысячи строк).

Рассмотрим ситуацию с «висячими строками». Это профессиональный термин, означающий ситуацию, когда одна последняя строка таблицы переносится на новую страницу отдельно от подвала или когда заголовок остается один. Чтобы этого избежать, при использовании ПроверитьВывод() всегда добавляйте в массив проверки не только подвал, но и хотя бы одну-две строки данных. Это создаст визуально приятный «якорь» для подвала на новой странице.

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

← На главную