При разработке интерфейсов на управляемых формах 1С программисты часто сталкиваются с ограничением стандартного элемента Таблица (связанного с ДеревоЗначений): в нем отсутствует штатная возможность объединения ячеек по вертикали (аналог HTML-свойства rowspan). Рассмотрим ситуацию, когда в дереве значений для нескольких дочерних строк необходимо вывести один общий комментарий или общую аналитику, визуально объединив их в одну область.
Проанализируем доступные методы решения этой задачи — от простых визуальных хитростей до полной замены элемента управления.
Это самый надежный способ, если требуется «честное» объединение ячеек любой сложности. Мы можем разместить на управляемой форме поле вида Поле табличного документа и программно выводить в него данные из нашего ДеревоЗначений.
Разберем по шагам, как это реализовать:
ТабличныйДокумент и вынесем его на форму.Область.Объединить() для ячеек, которые должны стать общими для нескольких строк.Посмотрим на пример кода, который формирует такой вывод:
&НаСервере
Процедура ЗаполнитьТабличныйДокументНаФорме()
ТабДок = ЭтаФорма.РеквизитТабличныйДокумент;
ТабДок.Очистить();
// Получаем данные дерева
ДеревоОбъект = РеквизитФормыВЗначение("ДеревоДанных");
НомерСтроки = 1;
Для Каждого СтрокаУровня1 Из ДеревоОбъект.Строки Цикл
НачалоОбъединения = НомерСтроки;
Для Каждого СтрокаУровня2 Из СтрокаУровня1.Строки Цикл
ТабДок.Область(НомерСтроки, 1).Текст = СтрокаУровня2.Наименование;
ТабДок.Область(НомерСтроки, 2).Текст = СтрокаУровня2.Значение;
// Колонка 3 будет объединяться
ТабДок.Область(НомерСтроки, 3).Текст = СтрокаУровня1.ОбщийКомментарий;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
// Объединяем ячейки в колонке комментария для всех строк текущей ветки
КонецОбъединения = НомерСтроки - 1;
Если КонецОбъединения > НачалоОбъединения Тогда
ОбластьОбъединения = ТабДок.Область(НачалоОбъединения, 3, КонецОбъединения, 3);
ОбластьОбъединения.Объединить();
ОбластьОбъединения.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Преимущества: Полный контроль над оформлением, сеткой, цветами и шрифтами. Можно имитировать раскрывающиеся группировки, используя метод ПоказатьУровеньГруппировокСтрок().
Если нам критично остаться в рамках стандартного элемента Таблица, мы можем использовать механизм группировки колонок. Выясним, как это работает: если сгруппировать две колонки и установить режим отображения В ячейке, данные будут выводиться друг под другом внутри одной физической ячейки строки.
Для имитации «объединения» выполним следующие действия:
Рассмотрим подробнее настройку условного оформления. Чтобы текст «общего комментария» не дублировался в каждой строке, мы можем установить цвет текста равным цвету фона для всех строк, кроме первой в группе. Либо, что более надежно при программном заполнении, просто оставлять ячейку пустой во всех строках, кроме первой, а визуальную целостность поддерживать за счет отсутствия горизонтальных линий в этой колонке.
Проанализируем ситуацию, когда нам нужно, чтобы границы между строками в определенной колонке «исчезли». В управляемом приложении мы не можем точечно управлять границами конкретной ячейки, но мы можем влиять на оформление всей строки целиком.
Выясним причину, по которой это может сработать: если установить для группы строк одинаковый фоновый цвет и убрать текст из повторяющихся ячеек, пользователь будет воспринимать это как единый блок. Для этого в процедуре ПриВыводеДанных (или при программном формировании дерева) нужно реализовать логику:
// Пример логики при формировании дерева
Для Каждого Стр Из ГруппаСтрок Цикл
Если Стр = ПерваяСтрокаГруппы Тогда
Стр.Комментарий = "Общий текст";
Иначе
Стр.Комментарий = ""; // Очищаем, чтобы не дублировать
КонецЕсли;
КонецЦикла;
Чтобы усилить эффект объединения, можно использовать Условное оформление для выделения всей группы строк одним цветом фона, отличным от соседних групп.
Разберем самый гибкий, но и самый трудозатратный метод. Если дерево значений должно выглядеть как сложный отчет с вложенными таблицами и объединенными ячейками, можно сформировать 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 вам придется самостоятельно описывать логику обновления данных при изменении дерева значений, тогда как стандартная таблица формы делает это автоматически.