Как вывести строки табличной части внутри одной ячейки макета и настроить программное рисование линий

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

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

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

Метод 1: Программное объединение ячеек

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

Рассмотрим алгоритм реализации по шагам:

  1. Создадим в макете область, которая содержит все необходимые поля (Поле1, Поле2, Поле3, Поле4, Поле5, Поле6).
  2. В коде обработки определим начало вывода строк для конкретного объекта. Запомним номер первой строки.
  3. Запустим цикл по строкам табличной части объекта. На каждой итерации будем заполнять параметры и использовать метод Вывести().
  4. После завершения цикла определим номер последней выведенной строки.
  5. Используем метод Область() для выделения вертикального диапазона в нужных колонках и вызовем метод Объединить().

Проанализируем пример кода:


// Определяем начальную строку блока
НомерНачала = ТабДок.ВысотаТаблицы + 1;

Для Каждого СтрокаТЧ Из СсылкаНаОбъект.Товары Цикл
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    ОбластьСтрока.Параметры.Заполнить(СтрокаТЧ);
    // Для первой строки заполняем данные шапки
    Если ТабДок.ВысотаТаблицы + 1 = НомерНачала Тогда
        ОбластьСтрока.Параметры.Поле1 = СсылкаНаОбъект.Наименование;
        ОбластьСтрока.Параметры.Поле6 = СсылкаНаОбъект.Автор;
    КонецЕсли;
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

// Номер последней строки блока
НомерКонца = ТабДок.ВысотаТаблицы;

// Объединяем ячейки в колонках 1 и 6, если строк было больше одной
Если НомерКонца > НомерНачала Тогда
    ТабДок.Область(НомерНачала, 1, НомерКонца, 1).Объединить();
    ТабДок.Область(НомерНачала, 6, НомерКонца, 6).Объединить();
КонецЕсли;

Метод 2: Использование вертикальных секций и метода Присоединить()

Если объединение ячеек кажется слишком сложным, можно использовать механизм секций. Мы разделим макет на три вертикальные части: «Лево» (поля шапки), «Центр» (строки ТЧ) и «Право» (остальные поля шапки).

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

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

Метод 3: Программное рисование линий и границ

Вопрос о том, как «прочертить линию от края до края», часто возникает при динамическом формировании таблиц. В 1С линии управляются через объект Линия и свойства области ГраницаСверху, ГраницаСнизу, ГраницаСлева, ГраницаСправа.

Разберем пример создания сплошной тонкой линии:


// Создаем объект линии
МояЛиния = Новая Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1);

// Выделяем область (например, всю текущую строку)
ТекущаяСтрока = ТабДок.ВысотаТаблицы;
ОбластьЛинии = ТабДок.Область(ТекущаяСтрока, 1, ТекущаяСтрока, ТабДок.ШиринаТаблицы);

// Устанавливаем границу снизу для всей области
ОбластьЛинии.ГраницаСнизу = МояЛиния;

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

ОбластьЯчейки.Обвести(МояЛиния, МояЛиния, МояЛиния, МояЛиния);

Метод 4: Реализация через СКД (Система компоновки данных)

Многие разработчики забывают, что сложные печатные формы гораздо проще строить на базе СКД, даже если это не отчет, а простая печатная форма документа. В СКД задача «одна ячейка шапки на несколько строк ТЧ» решается автоматически через настройки группировок.

Рассмотрим шаги настройки:

  1. Создадим схему компоновки данных, где в наборе данных выберем поля шапки и поля табличной части.
  2. В настройках отчета добавим группировку по Полю1 (шапка).
  3. Внутри этой группировки добавим вложенную группировку по Детальным записям (строки ТЧ).
  4. Перейдем на вкладку «Другие настройки». Найдем параметр «Расположение группировок» и установим значение «Вместе».
  5. Установим параметр «Вертикальное объединение» в значение «Использовать».

В этом случае платформа сама вычислит, сколько строк занимает табличная часть, и визуально объединит ячейку с наименованием объекта, растянув её на всю высоту блока строк. Это избавляет от необходимости писать код на языке 1С и вручную вычислять индексы строк.

Советы по оформлению макета

Чтобы ваша печатная форма выглядела профессионально, обратите внимание на следующие свойства ячеек в макете:

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

← На главную