Как объединить ячейки строк дерева значений в одну колонку в 1С?

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

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

Проанализируем доступные методы решения этой задачи — от простых визуальных хитростей до полной замены элемента управления.

Способ 1. Использование Табличного документа на форме

Это самый надежный способ, если требуется «честное» объединение ячеек любой сложности. Мы можем разместить на управляемой форме поле вида Поле табличного документа и программно выводить в него данные из нашего ДеревоЗначений.

Разберем по шагам, как это реализовать:

  1. Создадим на форме реквизит с типом ТабличныйДокумент и вынесем его на форму.
  2. Напишем процедуру обхода дерева значений и заполнения документа.
  3. Будем использовать метод Область.Объединить() для ячеек, которые должны стать общими для нескольких строк.

Посмотрим на пример кода, который формирует такой вывод:


&НаСервере
Процедура ЗаполнитьТабличныйДокументНаФорме()
    ТабДок = ЭтаФорма.РеквизитТабличныйДокумент;
    ТабДок.Очистить();
    
    // Получаем данные дерева
    ДеревоОбъект = РеквизитФормыВЗначение("ДеревоДанных");
    
    НомерСтроки = 1;
    Для Каждого СтрокаУровня1 Из ДеревоОбъект.Строки Цикл
        НачалоОбъединения = НомерСтроки;
        
        Для Каждого СтрокаУровня2 Из СтрокаУровня1.Строки Цикл
            ТабДок.Область(НомерСтроки, 1).Текст = СтрокаУровня2.Наименование;
            ТабДок.Область(НомерСтроки, 2).Текст = СтрокаУровня2.Значение;
            // Колонка 3 будет объединяться
            ТабДок.Область(НомерСтроки, 3).Текст = СтрокаУровня1.ОбщийКомментарий;
            НомерСтроки = НомерСтроки + 1;
        КонецЦикла;
        
        // Объединяем ячейки в колонке комментария для всех строк текущей ветки
        КонецОбъединения = НомерСтроки - 1;
        Если КонецОбъединения > НачалоОбъединения Тогда
            ОбластьОбъединения = ТабДок.Область(НачалоОбъединения, 3, КонецОбъединения, 3);
            ОбластьОбъединения.Объединить();
            ОбластьОбъединения.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Преимущества: Полный контроль над оформлением, сеткой, цветами и шрифтами. Можно имитировать раскрывающиеся группировки, используя метод ПоказатьУровеньГруппировокСтрок().

Способ 2. Группировка «В ячейке» с программной очисткой дублей

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

Для имитации «объединения» выполним следующие действия:

  1. Добавим в дерево колонку для общего значения.
  2. В настройках таблицы формы создадим группу колонок и перетащим туда нужные реквизиты.
  3. Установим свойство группы Группировка в значение В ячейке.
  4. Используем Условное оформление, чтобы скрыть повторяющиеся значения в строках.

Рассмотрим подробнее настройку условного оформления. Чтобы текст «общего комментария» не дублировался в каждой строке, мы можем установить цвет текста равным цвету фона для всех строк, кроме первой в группе. Либо, что более надежно при программном заполнении, просто оставлять ячейку пустой во всех строках, кроме первой, а визуальную целостность поддерживать за счет отсутствия горизонтальных линий в этой колонке.

Способ 3. Визуальная имитация через стили и границы

Проанализируем ситуацию, когда нам нужно, чтобы границы между строками в определенной колонке «исчезли». В управляемом приложении мы не можем точечно управлять границами конкретной ячейки, но мы можем влиять на оформление всей строки целиком.

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


// Пример логики при формировании дерева
Для Каждого Стр Из ГруппаСтрок Цикл
    Если Стр = ПерваяСтрокаГруппы Тогда
        Стр.Комментарий = "Общий текст";
    Иначе
        Стр.Комментарий = ""; // Очищаем, чтобы не дублировать
    КонецЕсли;
КонецЦикла;

Чтобы усилить эффект объединения, можно использовать Условное оформление для выделения всей группы строк одним цветом фона, отличным от соседних групп.

Способ 4. Поле HTML-документа для сложной верстки

Разберем самый гибкий, но и самый трудозатратный метод. Если дерево значений должно выглядеть как сложный отчет с вложенными таблицами и объединенными ячейками, можно сформировать HTML-строку и вывести ее в элемент Поле HTML-документа.

Здесь мы можем полноценно использовать теги <td rowspan="2">. Посмотрим на логику генерации фрагмента кода:


ТекстHTML = "<table border='1' style='border-collapse: collapse;'>";
Для Каждого Корень Из Дерево.Строки Цикл
    КоличествоДочерних = Корень.Строки.Количество();
    Для Инд = 0 По КоличествоДочерних - 1 Цикл
        ТекстHTML = ТекстHTML + "<tr>";
        ТекстHTML = ТекстHTML + "<td>" + Корень.Строки[Инд].Наименование + "</td>";
        
        // Выводим объединенную ячейку только для первой дочерней строки
        Если Инд = 0 Тогда
            ТекстHTML = ТекстHTML + "<td rowspan='" + КоличествоДочерних + "'>" 
                        + Корень.ОбщийКомментарий + "</td>";
        КонецЕсли;
        
        ТекстHTML = ТекстHTML + "</tr>";
    КонецЦикла;
КонецЦикла;
ТекстHTML = ТекстHTML + "</table>";

Важный момент: Для реализации интерактивности (кликов по строкам) придется использовать схему onclick в HTML и перехватывать событие ПриНажатии в 1С через обработку навигационной ссылки.

Резюме

Выбор метода зависит от ваших приоритетов:

Не забывайте, что при использовании ТабличногоДокумента или HTML вам придется самостоятельно описывать логику обновления данных при изменении дерева значений, тогда как стандартная таблица формы делает это автоматически.

← На главную