Работая с таким объектом, как дерево значений, нужно было автоматизировать ряд функций и процедур, связанных с настройкой и оформлением дерева значений. Поскольку дерево значений формируется или заполняется программно, заранее неизвестно количество колонок, строк и уровней в дереве значений, потому в свойствах объекта нет возможности настройки формата колонок, настройки расположения колонок, установки определенной ширины колонок, нет возможности выделения числовых отрицательных значений в колонках и т. д. Также меня очень раздражала ситуация, когда дерево создается программно, все заголовки колонок отображаются слитно в соответствии с их наименованием в коде.
В данной статье я попробовал собрать наиболее полезны методы «борьбы» с этими казусами.
Примерно использование этих методов в каком нибудь отчете, будет выглядеть так, как показано на скриншоте ниже.
////////////////////////////////////////////////////////////////////////////////
// ПЕРЕМЕННЫЕ МОДУЛЯ
Перем ТекущееДерево;
// Функция возвращает дерево значений
//
Функция Получить_ДеревоЗначений()
Запрос = Новый Запрос;
Запрос.Текст = "";
РезультатЗапроса = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
Возврат РезультатЗапроса;
КонецФункции
// Процедура - выполняет заполнение дерева значений
//
Процедура ЗаполнитьДеревоЗначений()
// Очистить дерево перед заполнением
ДеревоЗначений.Строки.Очистить();
// Выборка данных (запрос)
ДеревоЗначений = Получить_ДеревоЗначений();
// Массив удаляемых колонок из дерева
МассивУдаляемыхКолонок = Новый Массив;
МассивУдаляемыхКолонок.Добавить("Колонка_1");
МассивУдаляемыхКолонок.Добавить("Колонка_2");
ОформитьДеревоЗначений(ДеревоЗначений, "Наименование", МассивУдаляемыхКолонок);
КонецПроцедуры
// Процедура - оформляет колонки дерева
//
Процедура ОформитьДеревоЗначений(Дерево, Наименование, МассивУдаляемыхКолонок = Неопределено)
ТекущееДерево = Дерево;
Если Наименование = "Наименование" Тогда
Дерево.Колонки.Колонка_Имя.Заголовок = "Красивый заголовок с пробелами";
Дерево.Колонки.Колонка_Имя.Ширина = 15;
// Удаляем ненужные колонки
Если МассивУдаляемыхКолонок <> Неопределено Тогда
Удалить_Колонки_ДеревоЗначений(МассивУдаляемыхКолонок, Дерево);
КонецЕсли
КонецЕсли;
НастройкаФорматаКолонок(Дерево);
НастройкаРасположенияКолонок(ДеревоЗначений, "ДеревоЗначений");
КонецПроцедуры // ()
// Процедура - выполняет настройкку формата колонок в дереве
//
Процедура НастройкаФорматаКолонок(СтрокаДерево)
Дерево = ТекущееДерево;
Строки = ТекущееДерево.Строки;
Колонки = ТекущееДерево.Колонки;
Для Каждого стр из Строки Цикл
Для Каждого Колонка из Колонки Цикл
Если ТипЗнч(стр[Колонка.Имя]) = Тип("Число") Тогда
стр[Колонка.Имя] = Формат(стр[Колонка.Имя], "ЧДЦ=2");
КонецЕсли;
КонецЦикла;
НастройкаФорматаКолонок(стр);
КонецЦикла;
КонецПроцедуры
// Процедура - выполняет настройкку расположения колонок в дереве
//
Процедура НастройкаРасположенияКолонок(Дерево, Наименование)
Колонки = ТекущееДерево.Колонки;
Для Каждого Колонка Из Колонки Цикл
Тип_Число = Дерево.Колонки[Колонка.Имя].ТипЗначения.СодержитТип(Тип("Число"));
Тип_Дата = Дерево.Колонки[Колонка.Имя].ТипЗначения.СодержитТип(Тип("Дата"));
Если Тип_Число Или Тип_Дата Тогда
Колонка.ГоризонтальноеПоложениеВШапке = ГоризонтальноеПоложение.Центр;
Колонка.ГоризонтальноеПоложениеВКолонке = ГоризонтальноеПоложение.Центр;
Колонка.ГоризонтальноеПоложениеВПодвале = ГоризонтальноеПоложение.Центр;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Процедура выполняет удаление ненужных колонок из дерева значений
//
Процедура Удалить_Колонки_ДеревоЗначений(Массив, Дерево)
Для Каждого Имя Из Массив Цикл
Дерево.Колонки.Удалить(Имя);
КонецЦикла;
КонецПроцедуры
Процедура ДеревоЗначенийПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
// Раскраска дерева по уровнях
Если ДанныеСтроки.Уровень() = 0 Тогда
ОформлениеСтроки.ЦветФона = WebЦвета.Циан;
ОформлениеСтроки.Шрифт = Новый Шрифт(,,Истина);
ИначеЕсли ДанныеСтроки.Уровень() = 1 Тогда
ОформлениеСтроки.ЦветФона = WebЦвета.ЦианСветлый;
//ОформлениеСтроки.Шрифт = Новый Шрифт(,,Истина);
КонецЕсли;
// Виделим отрицательные значения в колонках
Для Каждого Колонка Из Элемент.Колонки Цикл
Если ТипЗнч(ДанныеСтроки[Колонка.Имя]) = Тип("Число") Тогда
Если ДанныеСтроки[Колонка.Имя] < 0 Тогда
ОформлениеСтроки.Ячейки[Колонка.Имя].ЦветТекста = WebЦвета.Красный;
КонецЕсли;
ДанныеСтроки[Колонка.Имя] = Формат(ДанныеСтроки[Колонка.Имя], "ЧДЦ=2");
КонецЕсли;
КонецЦикла;
КонецПроцедуры