Как реализовать автоматическое перетекание данных в две колонки во внешней печатной форме?

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

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

Основные принципы и ограничения

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

Шаг 1: Метод ПроверитьВывод()

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

Рассмотрим структуру проверки на примере:


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

Шаг 2: Алгоритм «Газетной верстки»

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

  1. Создаем основной ТабличныйДокумент.
  2. В цикле обхода данных (например, таблицы значений) выводим строки по одной.
  3. Для каждой строки проверяем с помощью ПроверитьВывод(), помещается ли она в текущую область (левую или правую).
  4. Если место в левой части закончилось — программно переключаем вывод в правую колонку (смещение по горизонтали).
  5. Если место закончилось и в правой части — используем метод ВывестиГоризонтальныйРазделительСтраниц() и сбрасываем счетчик обратно в левую часть.

Шаг 3: Проблема плавающей высоты строк

Одним из самых сложных моментов является разная высота строк (например, из-за длины текста в наименовании товара). Если строки имеют разную высоту, попытка сделать верстку «идеальной» приведет к тому, что строки слева и справа перестанут совпадать по горизонтальным уровням. Важно: если вы получили техническое задание на такую верстку, необходимо предупредить пользователя, что из-за разной высоты записей визуальное выравнивание будет нарушено, что является техническим ограничением табличного документа.

Рекомендации по альтернативным решениям

Иногда программная реализация перетекания может вызвать проблемы с предварительным просмотром или печатью на разных принтерах. В таких случаях мы рекомендуем рассмотреть следующие подходы:

Настройка параметров страницы

Чтобы избежать сползания страниц при просмотре, убедитесь, что вы правильно управляете свойствами ПолеСлева, ПолеСправа, ПолеСверху, ПолеСнизу вашего ТабличногоДокумента. Если задать эти значения в 0, это даст больше пространства для верстки, но важно помнить, что некоторые принтеры имеют физические ограничения на печать «в край». Мы рекомендуем всегда устанавливать минимальные поля, поддерживаемые большинством стандартных принтеров (обычно 5-10 мм).

Таким образом, комбинируя метод ПроверитьВывод() и программное управление позиционированием областей, вы сможете реализовать требуемую логику, однако всегда помните о нестабильности отображения табличных документов на разных устройствах печати.

← На главную