Как разместить несколько областей макета на одном листе: печать в формате 2х2

Программист 1С v8.3 (Обычные формы)
← На главную

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

Разбираем проблему: почему данные выводятся в одну колонку?

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

Для того чтобы «прилепить» область справа от уже выведенной, в 1С предусмотрен метод Присоединить(). Однако его использование требует понимания структуры макета и правильной программной логики.

Шаг 1. Подготовка макета и работа с областями

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

Одним из самых эффективных способов является использование именованных областей, построенных на пересечении строк и колонок. Рассмотрим, как правильно получить такую область в коде:


// Вместо обычного получения всей строки
// Область = Макет.ПолучитьОбласть("Заголовок");

// Используем пересечение именованной строки и именованной колонки
Область = Макет.ПолучитьОбласть("СтрокаДанных|КолонкаДанных");

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

Шаг 2. Реализация алгоритма вывода «Шахматка»

Вместо перечисления всех возможных порядковых номеров (как это часто делают новички через длинные условия Если Счетчик = 1 Или Счетчик = 3...), мы применим универсальную математическую логику с использованием оператора остатка от деления %. Это позволит нашему коду работать для любого количества записей.

Проанализируем алгоритм вывода для сетки 2х2:

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

Посмотрим на пример реализации такого цикла:


ТабДок = Новый ТабличныйДокумент;
Счетчик = 1;

Для Каждого ТекДанные Из МассивИнфоФайлов Цикл
    
    // Получаем область из макета
    Область = Макет.ПолучитьОбласть("Карточка|ОсновнаяКолонка");
    Область.Параметры.Текст = ТекДанные;
    
    // Логика определения позиции: нечетные - слева, четные - справа
    Если (Счетчик % 2) <> 0 Тогда
        // Это 1-й или 3-й элемент на текущем виртуальном "листе"
        ТабДок.Вывести(Область);
    Иначе
        // Это 2-й или 4-й элемент - присоединяем справа
        ТабДок.Присоединить(Область);
        
        // Каждые 4 элемента вставляем разделитель страниц (если нужно)
        Если (Счетчик % 4) = 0 Тогда
            ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
        КонецЕсли;
    КонецЕсли;
    
    Счетчик = Счетчик + 1;
    
КонецЦикла;

Шаг 3. Тонкая настройка размеров и масштабирования

Чтобы макет 2х2 гарантированно помещался на один лист А4 без лишних отступов, необходимо выполнить несколько важных настроек самого ТабличногоДокумента и параметров страницы:

Использование вспомогательного табличного документа

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


ВспТабДок = Новый ТабличныйДокумент;
ВспТабДок.Вывести(Область); // Помещаем заполненную область во временный буфер

// Теперь присоединяем весь временный документ к основному
ТабДок.Присоединить(ВспТабДок);

Этот способ помогает избежать «разрушения» структуры ячеек при сложных манипуляциях с макетом.

Основные ошибки при разметке

Проанализируем типичные ошибки, которые могут помешать правильному выводу:

  1. Отсутствие именованных колонок: Если в макете не заданы области колонок, 1С может не понять, какую именно часть строки нужно «отрезать» для присоединения. Всегда используйте формат "Строка|Колонка".
  2. Лишние пустые ячейки: Если в макете справа от вашей области есть пустые неиспользуемые ячейки, они также могут попасть в область вывода и «толкнуть» соседний блок за пределы видимости.
  3. Динамическая высота: Если для ячеек установлено свойство АвтоВысота, и текста в левой колонке окажется больше, чем в правой, верхние границы присоединенных областей могут визуально не совпасть. Рекомендуется использовать фиксированную высоту строк для карточек.

Таким образом, комбинируя правильную адресацию областей через |, математический расчет позиции элемента в цикле и метод Присоединить(), можно реализовать печать любой сложности — от простых ценников до сложных этикеток в формате «шахматки».

← На главную