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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

// Массив удаляемых колонок из дерева
МассивУдаляемыхКолонок = Новый Массив;
МассивУдаляемыхКолонок.Добавить("Колонка_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 не будет опубликован. Обязательные поля помечены *