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

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

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

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

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

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

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

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

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

Посмотрим на практический пример кода, в котором выводятся шапка таблицы, строки с данными и блок итоговых показателей с динамическим составом колонок (например, при наличии опциональной колонки кодов/артикулов):


// 1. Формирование шапки таблицы
ОбластьНомера = Макет.ПолучитьОбласть("ШапкаТаблицы|НомерСтроки");
ОбластьКодов  = Макет.ПолучитьОбласть("ШапкаТаблицы|КолонкаКодов");
ОбластьДанных = Макет.ПолучитьОбласть("ШапкаТаблицы|Данные");
ОбластьСуммы  = Макет.ПолучитьОбласть("ШапкаТаблицы|Сумма");

// Выводим первую колонку новой строки
ТабДокумент.Вывести(ОбластьНомера);

// Присоединяем опциональную колонку по условию
Если ВыводитьКоды Тогда
    ОбластьКодов.Параметры.ИмяКолонкиКодов = "Код";
    ТабДокумент.Присоединить(ОбластьКодов);
КонецЕсли;

// Присоединяем остальные колонки шапки
ТабДокумент.Присоединить(ОбластьДанных);
ТабДокумент.Присоединить(ОбластьСуммы);

// 2. Вывод строк с данными
ОбластьНомераСтроки = Макет.ПолучитьОбласть("Строка|НомерСтроки");
ОбластьКодовСтроки  = Макет.ПолучитьОбласть("Строка|КолонкаКодов");
ОбластьДанныхСтроки = Макет.ПолучитьОбласть("Строка|Данные");
ОбластьСуммыСтроки  = Макет.ПолучитьОбласть("Строка|Сумма");

Для Каждого Стр Из ТаблицаДанных Цикл
    ОбластьНомераСтроки.Параметры.НомерСтроки = ТаблицаДанных.Индекс(Стр) + 1;
    ТабДокумент.Вывести(ОбластьНомераСтроки);

    Если ВыводитьКоды Тогда
        ОбластьКодовСтроки.Параметры.Код = Стр.Код;
        ТабДокумент.Присоединить(ОбластьКодовСтроки);
    КонецЕсли;

    ОбластьДанныхСтроки.Параметры.Заполнить(Стр);
    ТабДокумент.Присоединить(ОбластьДанныхСтроки);

    ОбластьСуммыСтроки.Параметры.Заполнить(Стр);
    ТабДокумент.Присоединить(ОбластьСуммыСтроки);
КонецЦикла;

// 3. Вывод строки подвала (Итого к оплате)
ОбластьНомераИтог = Макет.ПолучитьОбласть("ИтогоКОплате|НомерСтроки");
ОбластьКодовИтог  = Макет.ПолучитьОбласть("ИтогоКОплате|КолонкаКодов");
ОбластьДанныхИтог = Макет.ПолучитьОбласть("ИтогоКОплате|Данные");
ОбластьСуммыИтог  = Макет.ПолучитьОбласть("ИтогоКОплате|Сумма");

ТабДокумент.Вывести(ОбластьНомераИтог);

Если ВыводитьКоды Тогда
    ТабДокумент.Присоединить(ОбластьКодовИтог);
КонецЕсли;

ТабДокумент.Присоединить(ОбластьДанныхИтог);
ОбластьСуммыИтог.Параметры.ИтогоКОплате = ИтоговаяСумма;
ТабДокумент.Присоединить(ОбластьСуммыИтог);

Способы оформления заголовков и объединенных ячеек

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

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

Важные особенности и ограничения платформы

При работе с вертикальными областями следует учитывать важные моменты:

Порядок присоединения колонок: последовательность вызовов Присоединить() строго определяет порядок колонок слева направо в готовом документе. Нарушение порядка приведет к смещению данных.

Автовысота при программном объединении: стандартный механизм автоматического расчета высоты строки в табличном документе 1С может некорректно вычислять высоту для строк, содержащих программно объединенные ячейки. В таких ситуациях может потребоваться явная установка свойства ВысотаСтроки.

← На главную