Как вывести две области макета в одну строку в 1С

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

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

Метод 1: Использование пары Вывести и Присоединить

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

Рассмотрим алгоритм реализации такой печати в цикле. Нам нужно определить, когда мы начинаем новую строку, а когда дополняем текущую. Для этого идеально подходит проверка индекса текущей итерации на четность.


// Предположим, у нас есть таблица значений СписокДанных
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
ОбластьСтроки = Макет.ПолучитьОбласть("Строка");

Для Индекс = 0 По СписокДанных.Количество() - 1 Цикл
    ТекущиеДанные = СписокДанных[Индекс];
    
    // Заполняем параметры области
    ОбластьСтроки.Параметры.Заполнить(ТекущиеДанные);
    
    // Если индекс четный (0, 2, 4...), начинаем новую строку
    Если Индекс % 2 = 0 Тогда
        ТабДок.Вывести(ОбластьСтроки);
    Иначе
        // Если индекс нечетный (1, 3, 5...), присоединяем справа
        ТабДок.Присоединить(ОбластьСтроки);
    КонецЕсли;
КонецЦикла;

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

Метод 2: Работа с пересечениями областей (Строка | Колонка)

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

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

Синтаксис получения такой области выглядит следующим образом:

Область = Макет.ПолучитьОбласть("ИмяСтроки|ИмяКолонки");

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


ОбластьЛевая = Макет.ПолучитьОбласть("СтрокаДанных|Колонка1");
ОбластьПравая = Макет.ПолучитьОбласть("СтрокаДанных|Колонка2");

Для каждого СтрокаТЗ из ДанныеДляПечати Цикл
    // Логика определения позиции (лево/право)
    Если НужноВывестиСлева Тогда
        ОбластьЛевая.Параметры.Значение = СтрокаТЗ.Поле1;
        ТабДок.Вывести(ОбластьЛевая);
    Иначе
        ОбластьПравая.Параметры.Значение = СтрокаТЗ.Поле1;
        ТабДок.Присоединить(ОбластьПравая);
    КонецЕсли;
КонецЦикла;

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

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

Рассмотрим шаги этого метода:

  1. Создаем два временных табличных документа (ТабДокЛево и ТабДокПраво).
  2. Заполняем их независимо друг от друга методом Вывести().
  3. В основном цикле обходим строки самого длинного из документов.
  4. Извлекаем область из временного документа и выводим/присоединяем в основной ТабДок.

// Пример переноса данных из временных документов
Для НомерСтроки = 1 По Макс(ТабДокЛево.ВысотаТаблицы, ТабДокПраво.ВысотаТаблицы) Цикл
    // Получаем область одной строки из левой части
    ОбластьЛ = ТабДокЛево.Область(НомерСтроки, 1, НомерСтроки, ТабДокЛево.ШиринаТаблицы);
    ТабДок.Вывести(ОбластьЛ);
    
    // Получаем область одной строки из правой части
    ОбластьП = ТабДокПраво.Область(НомерСтроки, 1, НомерСтроки, ТабДокПраво.ШиринаТаблицы);
    ТабДок.Присоединить(ОбластьП);
КонецЦикла;

Контроль страниц и метод ПроверитьВывод

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

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

Посмотрим на пример правильной проверки:


МассивОбластей = Новый Массив;
МассивОбластей.Добавить(ОбластьЛевая);
МассивОбластей.Добавить(ОбластьПравая);

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

ТабДок.Вывести(ОбластьЛевая);
ТабДок.Присоединить(ОбластьПравая);

Тонкости форматирования в макете

При использовании метода Присоединить() критически важно следить за свойствами ячеек в макете. Выделим основные моменты:

Выясним, какой метод лучше. Если данные выводятся строго по порядку (1-й элемент слева, 2-й справа), используйте Метод 1. Если левая и правая части логически разные — Метод 2. Для сложных случаев с заполнением колонок сверху вниз используйте Метод 3.

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

← На главную