Полезности | Дерево значений | Обычные формы |

Полезные функции при работе с деревом значений.

Работая с таким объектом, как дерево значений, нужно было автоматизировать ряд функций и процедур, связанных с настройкой и оформлением дерева значений. Поскольку дерево значений формируется или заполняется программно, заранее неизвестно количество колонок, строк и уровней в дереве значений, потому в свойствах объекта нет возможности настройки формата колонок, настройки расположения колонок, установки определенной ширины колонок, нет возможности выделения числовых отрицательных значений в колонках  и т. д. Также меня очень раздражала ситуация, когда дерево создается программно, все заголовки колонок отображаются слитно в соответствии с их наименованием в коде.  

В данной статье я попробовал собрать наиболее полезны методы «борьбы» с этими казусами.

Примерно использование этих методов в каком нибудь отчете, будет выглядеть так, как показано на скриншоте ниже.

////////////////////////////////////////////////////////////////////////////////
// ПЕРЕМЕННЫЕ МОДУЛЯ

Перем ТекущееДерево;


// Функция возвращает дерево значений
//
Функция Получить_ДеревоЗначений()

Запрос = Новый Запрос;
Запрос.Текст = "";

РезультатЗапроса = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

Возврат РезультатЗапроса;

КонецФункции

// Процедура - выполняет заполнение дерева значений
//
Процедура ЗаполнитьДеревоЗначений()

// Очистить дерево перед заполнением
ДеревоЗначений.Строки.Очистить();

// Выборка данных (запрос)
ДеревоЗначений = Получить_ДеревоЗначений();

// Массив удаляемых колонок из дерева
МассивУдаляемыхКолонок = Новый Массив;
МассивУдаляемыхКолонок.Добавить("Колонка_1");
МассивУдаляемыхКолонок.Добавить("Колонка_2");

ОформитьДеревоЗначений(ДеревоЗначений, "Наименование", МассивУдаляемыхКолонок);

КонецПроцедуры


// Процедура - оформляет колонки дерева
//
Процедура ОформитьДеревоЗначений(Дерево, Наименование, МассивУдаляемыхКолонок = Неопределено)

ТекущееДерево = Дерево;

Если Наименование = "Наименование" Тогда

Дерево.Колонки.Колонка_Имя.Заголовок = "Красивый заголовок с пробелами";
Дерево.Колонки.Колонка_Имя.Ширина    = 15;

// Удаляем ненужные колонки
Если МассивУдаляемыхКолонок <> Неопределено Тогда
Удалить_Колонки_ДеревоЗначений(МассивУдаляемыхКолонок, Дерево);
КонецЕсли

КонецЕсли;

НастройкаФорматаКолонок(Дерево);
НастройкаРасположенияКолонок(ДеревоЗначений, "ДеревоЗначений");

КонецПроцедуры // ()


// Процедура - выполняет настройкку формата колонок в дереве
//
Процедура НастройкаФорматаКолонок(СтрокаДерево)

Дерево  = ТекущееДерево;
Строки  = ТекущееДерево.Строки;
Колонки = ТекущееДерево.Колонки;

Для Каждого стр из Строки Цикл
Для Каждого Колонка из Колонки Цикл
Если ТипЗнч(стр[Колонка.Имя]) = Тип("Число") Тогда
стр[Колонка.Имя] = Формат(стр[Колонка.Имя], "ЧДЦ=2");
КонецЕсли;
КонецЦикла;
НастройкаФорматаКолонок(стр);
КонецЦикла;

КонецПроцедуры


// Процедура - выполняет настройкку расположения колонок в дереве
//
Процедура НастройкаРасположенияКолонок(Дерево, Наименование)

Колонки = ТекущееДерево.Колонки;

Для Каждого Колонка Из Колонки Цикл
Тип_Число = Дерево.Колонки[Колонка.Имя].ТипЗначения.СодержитТип(Тип("Число"));
Тип_Дата  = Дерево.Колонки[Колонка.Имя].ТипЗначения.СодержитТип(Тип("Дата"));
Если Тип_Число Или Тип_Дата Тогда
Колонка.ГоризонтальноеПоложениеВШапке   = ГоризонтальноеПоложение.Центр;
Колонка.ГоризонтальноеПоложениеВКолонке = ГоризонтальноеПоложение.Центр;
Колонка.ГоризонтальноеПоложениеВПодвале = ГоризонтальноеПоложение.Центр;
КонецЕсли;
КонецЦикла;

КонецПроцедуры

// Процедура выполняет удаление ненужных колонок из дерева значений
//
Процедура Удалить_Колонки_ДеревоЗначений(Массив, Дерево)

Для Каждого Имя Из Массив Цикл
Дерево.Колонки.Удалить(Имя);
КонецЦикла;

КонецПроцедуры


Процедура ДеревоЗначенийПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

// Раскраска дерева по уровнях
Если ДанныеСтроки.Уровень() = 0 Тогда
ОформлениеСтроки.ЦветФона = WebЦвета.Циан;
ОформлениеСтроки.Шрифт = Новый Шрифт(,,Истина);
ИначеЕсли  ДанныеСтроки.Уровень() =  1 Тогда
ОформлениеСтроки.ЦветФона = WebЦвета.ЦианСветлый;
//ОформлениеСтроки.Шрифт = Новый Шрифт(,,Истина);
КонецЕсли;

// Виделим отрицательные значения в колонках
Для Каждого Колонка Из Элемент.Колонки Цикл
Если ТипЗнч(ДанныеСтроки[Колонка.Имя]) = Тип("Число") Тогда
Если  ДанныеСтроки[Колонка.Имя] < 0 Тогда
ОформлениеСтроки.Ячейки[Колонка.Имя].ЦветТекста = WebЦвета.Красный;
КонецЕсли;
ДанныеСтроки[Колонка.Имя] = Формат(ДанныеСтроки[Колонка.Имя], "ЧДЦ=2");
КонецЕсли;
КонецЦикла;

КонецПроцедуры


 

5 Comments

  1. json
    // Функция возвращает дерево значений
    //
    Функция Получить_ДеревоЗначений()
            // Удаляем ненужные колонки
    Если МассивУдаляемыхКолонок <> Неопределено Тогда
    Удалить_Колонки_ДеревоЗначений(МассивУдаляемыхКолонок, Дерево);
    КонецЕсли
    

    Комментарии от кэпа.

    Отличный пример как не надо писать комментарии

    // Процедура выполняет удаление ненужных колонок из дерева значений
    

    Раз уж пишешь комментарий, так разъяснил бы в нем почему они ненужные, и так ведь понятно что раз их удаляешь, то они тебе не нужны

    Reply
  2. VmvLer

    приятный код, вспомнил школу когда читал камменты по слогам.

    Reply
  3. Mellow

    (1) Согласен, что может быть не все коментарии информативные, но я разве статью об правильном написании комментариев писал

    Reply
  4. YPermitin

    (0) +

    Полезно.

    Reply
  5. davdykin

    (1)Вы совершенно правильно указали на бесполезность комментариев в данном случаи, но упустили то, что имена функциям даны таким образом, что без комментариев понятно, какое действие они выполняют.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *