При разработке печатных форм и отчетов в 1С часто возникает необходимость использовать как горизонтальные области (строки), так и вертикальные секции (колонки). Типичная трудность заключается в том, что при разделении таблицы на вертикальные колонки длинные заголовки или итоговые надписи могут обрезаться, выводиться некорректно либо требовать сложного позиционирования. Разберем по шагам, как устроен механизм пересечения областей в платформе 1С и как правильно формировать результирующий табличный документ.
Проанализируем базовый принцип: в макете табличного документа можно задавать как горизонтальные именованные области (строки), так и вертикальные (колонки). Чтобы получить конкретную ячейку или группу ячеек на пересечении, используется синтаксис с разделителем — вертикальной чертой |:
Область = Макет.ПолучитьОбласть("ИмяСтроки|ИмяКолонки");
При формировании таблицы в цикле или при выводе шапки действуют следующие правила вывода:
ТабДокумент.Вывести(). Этот метод создает новую строку в результирующем документе.ТабДокумент.Присоединить().ТабДокумент.Вывести() для первой колонки следующей горизонтальной секции.Посмотрим на практический пример кода, в котором выводятся шапка таблицы, строки с данными и блок итоговых показателей с динамическим составом колонок (например, при наличии опциональной колонки кодов/артикулов):
// 1. Формирование шапки таблицы
ОбластьНомера = Макет.ПолучитьОбласть("ШапкаТаблицы|НомерСтроки");
ОбластьКодов = Макет.ПолучитьОбласть("ШапкаТаблицы|КолонкаКодов");
ОбластьДанных = Макет.ПолучитьОбласть("ШапкаТаблицы|Данные");
ОбластьСуммы = Макет.ПолучитьОбласть("ШапкаТаблицы|Сумма");
// Выводим первую колонку новой строки
ТабДокумент.Вывести(ОбластьНомера);
// Присоединяем опциональную колонку по условию
Если ВыводитьКоды Тогда
ОбластьКодов.Параметры.ИмяКолонкиКодов = "Код";
ТабДокумент.Присоединить(ОбластьКодов);
КонецЕсли;
// Присоединяем остальные колонки шапки
ТабДокумент.Присоединить(ОбластьДанных);
ТабДокумент.Присоединить(ОбластьСуммы);
// 2. Вывод строк с данными
ОбластьНомераСтроки = Макет.ПолучитьОбласть("Строка|НомерСтроки");
ОбластьКодовСтроки = Макет.ПолучитьОбласть("Строка|КолонкаКодов");
ОбластьДанныхСтроки = Макет.ПолучитьОбласть("Строка|Данные");
ОбластьСуммыСтроки = Макет.ПолучитьОбласть("Строка|Сумма");
Для Каждого Стр Из ТаблицаДанных Цикл
ОбластьНомераСтроки.Параметры.НомерСтроки = ТаблицаДанных.Индекс(Стр) + 1;
ТабДокумент.Вывести(ОбластьНомераСтроки);
Если ВыводитьКоды Тогда
ОбластьКодовСтроки.Параметры.Код = Стр.Код;
ТабДокумент.Присоединить(ОбластьКодовСтроки);
КонецЕсли;
ОбластьДанныхСтроки.Параметры.Заполнить(Стр);
ТабДокумент.Присоединить(ОбластьДанныхСтроки);
ОбластьСуммыСтроки.Параметры.Заполнить(Стр);
ТабДокумент.Присоединить(ОбластьСуммыСтроки);
КонецЦикла;
// 3. Вывод строки подвала (Итого к оплате)
ОбластьНомераИтог = Макет.ПолучитьОбласть("ИтогоКОплате|НомерСтроки");
ОбластьКодовИтог = Макет.ПолучитьОбласть("ИтогоКОплате|КолонкаКодов");
ОбластьДанныхИтог = Макет.ПолучитьОбласть("ИтогоКОплате|Данные");
ОбластьСуммыИтог = Макет.ПолучитьОбласть("ИтогоКОплате|Сумма");
ТабДокумент.Вывести(ОбластьНомераИтог);
Если ВыводитьКоды Тогда
ТабДокумент.Присоединить(ОбластьКодовИтог);
КонецЕсли;
ТабДокумент.Присоединить(ОбластьДанныхИтог);
ОбластьСуммыИтог.Параметры.ИтогоКОплате = ИтоговаяСумма;
ТабДокумент.Присоединить(ОбластьСуммыИтог);
Выясним причину, почему заголовок может обрезаться: если длинный текст размещен в ячейках, которые пересекают границы вертикальных секций, платформа 1С при поэтапном выводе методом Присоединить() не может автоматически сохранить объединение ячеек между разными областями. Рассмотрим варианты решения этой проблемы:
ТабДокумент.Вывести(Макет.ПолучитьОбласть("Заголовок")), а вертикальные секции применяйте только для табличной части.
НомерСтроки = ТабДокумент.ВысотаТаблицы;
ОбластьШапки = ТабДокумент.Область(НомерСтроки, 2, НомерСтроки, ТабДокумент.ШиринаТаблицы);
ОбластьШапки.Объединить();
При работе с вертикальными областями следует учитывать важные моменты:
Порядок присоединения колонок: последовательность вызовов Присоединить() строго определяет порядок колонок слева направо в готовом документе. Нарушение порядка приведет к смещению данных.
Автовысота при программном объединении: стандартный механизм автоматического расчета высоты строки в табличном документе 1С может некорректно вычислять высоту для строк, содержащих программно объединенные ячейки. В таких ситуациях может потребоваться явная установка свойства ВысотаСтроки.