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