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