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

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

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

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

Выясним причину: почему метод Вывести() не подходит для колонок

Рассмотрим, как работает метод ТабДокумент.Вывести(). Каждым вызовом этого метода платформа 1С смещает условный курсор вывода вниз, создавая новую строку. Если вызывать Вывести() в цикле по колонкам, платформа будет выводить каждую новую область колонок ниже предыдущей.

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

Пошаговое решение: разметка макета и пересечение областей

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

  1. Горизонтальные области (строки): например, Шапка, Строка.
  2. Вертикальные области (колонки): например, ФиксированнаяЧасть, ДинамическаяКолонка.

Чтобы получить конкретный фрагмент таблицы для закладывания параметров и вывода, используют синтаксис получения области через вертикальную черту: Макет.ПолучитьОбласть("ИмяСтроки|ИмяКолонки").

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


// 1. Формирование шапки таблицы

// Выводим фиксированную часть шапки (первая колонка/левый заголовок)
ОбластьШапкаФикс = МакетРаспечатки.ПолучитьОбласть("Шапка|ФиксированнаяЧасть");
ТабДок.Вывести(ОбластьШапкаФикс);

// Присоединяем динамические колонки шапки справа
ОбластьШапкаДинам = МакетРаспечатки.ПолучитьОбласть("Шапка|ДинамическаяКолонка");
Для Каждого СтрИзКолонок Из ДляРаспечаткиКоличествоДог Цикл
    ЗаполнитьЗначенияСвойств(ОбластьШапкаДинам.Параметры, СтрИзКолонок);
    ТабДок.Присоединить(ОбластьШапкаДинам);
КонецЦикла;

// 2. Формирование строк с данными

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

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

Важные нюансы работы с динамическими колонками

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

  1. Заполнение параметров: Метод ЗаполнитьЗначенияСвойств() или Область.Параметры.Заполнить() существенно упрощает код, если имена параметров в макете совпадают с именами колонок источника данных (структуры или строки таблицы значений).
  2. Точка присоединения: Метод Присоединить() добавляет ячейки правее последней выведенной области в текущей строке. Обязательно вызывайте метод Вывести() в начале каждой новой строки данных, чтобы перевести курсор на новую строчку перед присоединением ячеек.
  3. Ширина колонок: Ширина динамических колонок итоговой таблицы задается шириной соответствующих вертикальных секций макета. Настраивать ширину необходимо именно у вертикальной области макета.
  4. Объединение ячеек: Если над динамическими колонками требуется создать общий заголовок (например, объединить несколько договоров под одним месяцем), это рекомендуется делать программно после вывода с помощью обращения к диапазону: ТабДок.Область(НомерСтроки1, НомерКолонки1, НомерСтроки2, НомерКолонки2).Объединить().
← На главную