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