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

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

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

Способ 1. Использование метода Присоединить()

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

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

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


// Получаем области из макета
ОбластьЗаголовокЛево = Макет.ПолучитьОбласть("Заголовок|ЛеваяЧасть");
ОбластьЗаголовокПраво = Макет.ПолучитьОбласть("Заголовок|ПраваяЧасть");
ОбластьСтрокаЛево = Макет.ПолучитьОбласть("Строка|ЛеваяЧасть");
ОбластьСтрокаПраво = Макет.ПолучитьОбласть("Строка|ПраваяЧасть");

// Выводим шапки таблиц
ТабДок.Вывести(ОбластьЗаголовокЛево);
ТабДок.Присоединить(ОбластьЗаголовокПраво);

// Определяем максимальное количество строк, чтобы цикл прошел по всем данным
МаксКоличество = Макс(Объект.Товары.Количество(), Объект.Услуги.Количество());

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

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

Способ 2. Использование временных табличных документов

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

Давайте разберем этот процесс по шагам:

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

Посмотрим, как это выглядит в программном коде:


// 1. Формируем левую таблицу во временный документ
ВременныйТабДок1 = Новый ТабличныйДокумент;
// ... здесь код заполнения ВременныйТабДок1 через Вывести() ...

// 2. Формируем правую таблицу во второй временный документ
ВременныйТабДок2 = Новый ТабличныйДокумент;
// ... здесь код заполнения ВременныйТабДок2 через Вывести() ...

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

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

Способ 3. Работа с вертикальными секциями в макете

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

Представим, что в макете вы выделили несколько колонок и назвали эту область КолонкаТовары, а другие колонки назвали КолонкаУслуги. Также у вас есть строка с именем СтрокаДанных. Вы можете получить область на их пересечении:

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

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

Типичные ошибки и способы их решения

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

  1. Затирание данных: Если вы сначала вывели всю первую таблицу до конца (например, 50 строк), а потом попытались использовать Присоединить(), вторая таблица «прилепится» к последней 50-й строке первой таблицы. Решение: Используйте либо вывод в одном цикле (способ 1), либо временные документы (способ 2).
  2. Разная высота строк: Если в левой таблице текст в ячейке перенесся на вторую строку, а в правой — нет, визуально таблицы «поедут». Решение: Устанавливайте фиксированную высоту строк или используйте свойство АвтоВысотаСтроки = Ложь.
  3. Проблема с масштабом: Две таблицы рядом часто не помещаются на лист А4. Решение: Обязательно устанавливайте параметры страницы программно.

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


ТабДок.АвтоМасштаб = Истина; // Автоматически вписать в лист
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт; // Горизонтальная ориентация
ТабДок.ПолеСлева = 10; // Уменьшение полей для экономии места

Заключение

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

← На главную