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

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

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

Разберем причины такого поведения платформы 1С:Предприятие и рассмотрим пошаговый алгоритм правильного вывода колонок с использованием пересечений областей макета.

Почему данные выводятся в один столбец или «лесенкой»

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

  1. Использование чисто горизонтальных областей: если область в макете задана только номерами строк (например, строка целиком от первой до последней колонки таблицы), она занимает всю ширину листа. При попытке присоединить такую область методом ТабДок.Присоединить() платформа не может сместить ее вправо, так как строка уже ограничена шириной страницы. Для горизонтального добавления колонок область обязательно должна иметь вертикальные границы или являться пересечением строк и колонок.
  2. Ошибочный вызов метода Вывести() внутри цикла: метод ТабДок.Вывести() сдвигает позицию текущего вывода вниз на новую строку. Если вызывать его внутри цикла по подчиненным записям, каждая новая запись начнет выводиться снизу, а не справа.
  3. Перезапись параметров без вывода: если разработчик заполняет параметры области в цикле, но метод вывода/присоединения вызывает только после окончания цикла, на печать попадет только самое последнее значение.

Правильная настройка макета через пересечение областей

Для корректного вывода горизонтальных колонок в 1С используется механизм именования пересечений областей через символ вертикальной черты |. Разберем по шагам, как подготовить макет:

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

В результате на пересечении образуются две управляемые области:

  1. Тело|Основа — фиксированная левая часть строки;
  2. Тело|добНоменклатура — динамически присоединяемая колонка справа.

Программный вывод колонок методом ТабДок.Присоединить

Рассмотрим пример кода на встроенном языке 1С, который правильно обходит выборку и формирует горизонтальные колонки:


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

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

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

КонецЦикла;

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

Проблема синхронизации колонок и построение матрицы

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

Чтобы построить строгую матрицу (кросс-таблицу), необходимо придерживаться следующего алгоритма:

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

Альтернатива: использование СКД для кросс-таблиц

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

  1. В схеме компоновки данных в структуре отчета создается элемент Таблица.
  2. В группировку Строки добавляется поле Ссылка.
  3. В группировку Колонки добавляется поле Номенклатура.
  4. В поле Ресурсы настраивается агрегатная функция (например, сумма количества).

СКД автоматически сформирует матрицу правильной формы, выровняет все ячейки по колонкам и заполнит пустые позиции без написания программного кода вывода.

Настройка параметров печати для широких таблиц

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


ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДок.Автомасштаб        = Истина;

Важно: помните, что при включенном свойстве Автомасштаб = Истина и очень большом количестве колонок платформа уменьшит масштаб всей страницы так, чтобы она уместилась в лист по ширине, из-за чего текст может стать слишком мелким для чтения. Если колонок заведомо больше 15–20, предпочтительнее проектировать вывод данных стандартным вертикальным списком с группировками.

← На главную