Как динамически выводить колонки в табличном документе 1С с помощью метода Присоединить()?

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

При разработке печатных форм и отчетов в 1С часто возникает задача вывести произвольное количество колонок. Например, когда список характеристик, складов, месяцев или типов упаковок заранее неизвестен и определяется только набором данных из документа или запроса.

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

Принцип работы с вертикальными и горизонтальными областями макета

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

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

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

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

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

Пошаговый алгоритм вывода динамических колонок

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

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

Пример программного кода

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


// 1. Инициализация табличного документа и макета
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("ПогрузочныйЛист");

// 2. Вывод фиксированного заголовка таблицы (левая часть)
ОбластьЗаголовокНоменклатура = Макет.ПолучитьОбласть("ЗаголовокТаблицы|Номенклатура");
ТабДок.Вывести(ОбластьЗаголовокНоменклатура);

// 3. Динамический вывод заголовков колонок
ОбластьЗаголовокХарактеристика = Макет.ПолучитьОбласть("ЗаголовокТаблицы|Характеристика");

Для Каждого ТекущаяХарактеристика Из МассивХарактеристик Цикл
    ОбластьЗаголовокХарактеристика.Параметры.НазваниеХарактеристики = ТекущаяХарактеристика;
    ТабДок.Присоединить(ОбластьЗаголовокХарактеристика);
КонецЦикла;

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

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

ТабДок.Показать();

Распространенные ошибки и особенности метода

Разберем частые проблемы, с которыми сталкиваются разработчики при вызове метода Присоединить():

  1. Нарушение геометрии ячеек и границ: Если у выводимых областей различается высота строк или параметры оформления границ, табличный документ может отображаться корректно только частичным смещением. Убедитесь, что исходные ячейки макета по высоте и стилям идентичны.
  2. Смещение данных в строках: Если у определенной позиции номенклатуры заполнены не все характеристики, нельзя просто пропускать вызов метода Присоединить(). Цикл присоединения должен отрабатывать для каждой колонки из шапки. Если значения нет, необходимо присоединять пустую область-заглушку с сохраненным оформлением borders и шрифтов.
  3. Заполнение ширины колонок: Метод Присоединить() берет ширину из присоединяемой вертикальной области макета. Убедитесь, что в макете задана явная ширина для именованной колонки.

Альтернативные способы формирования кросс-таблиц

Помимо ручного вывода через Присоединить(), в платформе 1С существуют другие способы решения задачи:

← На главную