Как проверить вместимость колонок по ширине страницы и перенести вывод на новую строку в 1С

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

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

Принцип формирования строк: различие методов Вывести и Присоединить

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

  1. Метод Вывести — добавляет область строго вниз (начиная новую строку табличного документа).
  2. Метод Присоединить — прикрепляет область справа от ранее выведенной в той же горизонтальной полосе.

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

Пошаговый алгоритм с использованием метода ПроверитьПрисоединение

Разберем по шагам построение алгоритма проверки и вывода областей:

  1. Отключаем свойство авторасчета масштаба: ТабДок.АвтоМасштаб = Ложь. Это обязательное условие, так как при включенном свойстве АвтоМасштаб платформа пытается вместить весь документ на одну страницу, и метод ПроверитьПрисоединение будет постоянно возвращать значение Истина.
  2. Самый первый элемент в печатной форме всегда выводим методом ТабДок.Вывести(), чтобы зафиксировать начало строки.
  3. Для каждого следующего элемента подготавливаем область и помещаем ее в массив (метод проверки принимает в качестве параметра массив областей или табличный документ).
  4. Вызываем проверку ТабДок.ПроверитьПрисоединение(МассивДляПроверки).
  5. Если результат проверки равен Истина, выполняем ТабДок.Присоединить(Область).
  6. Если результат равен Ложь, значит текущая строка заполнена. Вызываем ТабДок.Вывести(Область), что автоматически переносит текущий блок на следующую строку вниз.

Посмотрим на практический пример кода:


// Инициализируем табличный документ и макет
ТабДок = Новый ТабличныйДокумент;
ТабДок.АвтоМасштаб = Ложь;

Макет = ПолучитьМакет("Макет");
ОбластьКолонка = Макет.ПолучитьОбласть("Колонка");

ПервыйЭлемент = Истина;

Для Каждого ДанныеЭлемента Из КоллекцияДанных Цикл

    // Заполняем параметры области
    ОбластьКолонка.Параметры.Заполнить(ДанныеЭлемента);

    Если ПервыйЭлемент Тогда
        ТабДок.Вывести(ОбластьКолонка);
        ПервыйЭлемент = Ложь;
    Иначе
        // Подготавливаем массив для проверки
        МассивПроверки = Новый Массив;
        МассивПроверки.Добавить(ОбластьКолонка);

        // Проверяем, влезет ли область по ширине листа
        Если ТабДок.ПроверитьПрисоединение(МассивПроверки) Тогда
            ТабДок.Присоединить(ОбластьКолонка);
        Иначе
            // Места нет - переносим на новую строку
            ТабДок.Вывести(ОбластьКолонка);
        КонецЕсли;
    КонецЕсли;

КонецЦикла;

Важные технические нюансы и системные ограничения

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

  1. Зависимость от установленного принтера: Метод рассчитывает физическую ширину печатной страницы, опираясь на свойства принтера по умолчанию в операционной системе. Если в системе не установлено ни одного принтера (что нередко случается на серверах под управлением Linux или в изолированных серверных контурах), вызов метода завершится критической ошибкой. В серверном коде рекомендуется оборачивать подобные вызовы в конструкцию Попытка ... Исключение.
  2. Снижение производительности: При каждом вызове метода платформа выполняет комплексный пересчет параметров макета страницы. При печати сотен или тысяч элементов многократный вызов проверки внутри цикла заметно замедляет общую скорость формирования отчета.
  3. Тип передаваемого параметра: Метод ожидает в качестве аргумента массив с областями табличного документа или отдельный ТабличныйДокумент. Передача одиночной области напрямую без упаковки в массив вызовет ошибку времени выполнения.

Альтернативное решение: математический расчет количества колонок

Если печатная форма содержит большое количество блоков одинакового размера, постоянных вызовов проверки страниц можно избежать. Для этого рассчитаем допустимое количество колонок заранее:

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

Такой подход полностью независим от наличия принтера в системе и работает в разы быстрее прямого вызова ПроверитьПрисоединение.

← На главную