Как вывести две табличные части в печатной форме 1С бок о бок

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

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

Разберем основной механизм: Вывести() против Присоединить()

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

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

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

Однако на практике мы часто сталкиваемся с тем, что количество строк в левой и правой таблицах не совпадает. Рассмотрим, как решить эту проблему программно.

Алгоритм вывода таблиц с разным количеством строк

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


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

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

КонецЦикла;

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

Важность настройки высоты строк в макете

Одной из самых распространенных проблем при использовании метода Присоединить() является «эффект гребенки», когда строки левой и правой таблиц имеют разную высоту. Это происходит, если в параметрах ячеек установлено свойство «Высота строки: Авто».

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

Альтернативный метод: Использование единой горизонтальной секции

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

В этом случае код станет гораздо чище:


ОбластьСтрока = Макет.ПолучитьОбласть("ОбщаяСтрока");
МаксСтрок = Макс(ТЗ1.Количество(), ТЗ2.Количество());

Для Индекс = 0 По МаксСтрок - 1 Цикл
    // Заполняем параметры левой части, если они есть
    Если Индекс < ТЗ1.Количество() Тогда
        ОбластьСтрока.Параметры.НоменклатураЛево = ТЗ1[Индекс].Номенклатура;
    Иначе
        ОбластьСтрока.Параметры.НоменклатураЛево = "";
    КонецЕсли;
    
    // Заполняем параметры правой части, если они есть
    Если Индекс < ТЗ2.Количество() Тогда
        ОбластьСтрока.Параметры.НоменклатураПраво = ТЗ2[Индекс].Номенклатура;
    Иначе
        ОбластьСтрока.Параметры.НоменклатураПраво = "";
    КонецЕсли;
    
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

Преимущество этого метода: Идеальное выравнивание строк гарантировано самой структурой макета. Вам не нужно следить за высотой строк и порядком присоединения областей.

Когда стоит использовать метод ВставитьОбласть()?

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

Однако помните, что метод ВставитьОбласть() требует точного расчета координат в формате R1C1:R2C2. Это делает код более сложным для поддержки. В большинстве случаев связки Вывести() и Присоединить() более чем достаточно для решения бизнес-задач.

Заключение

Мы проанализировали основные способы вывода данных в правую часть печатной формы. Подведем итоги:

  1. Для простых случаев используйте единую широкую секцию в макете.
  2. Для динамических таблиц используйте построчный цикл с методами Вывести() для левой колонки и Присоединить() для правой.
  3. Всегда контролируйте высоту строк: фиксированная высота — залог красивой и аккуратной таблицы без «лесенок».
  4. Не забывайте выводить «пустышки» (пустые области), если данные в одной из таблиц закончились раньше.

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

← На главную