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

04.12.19

Разработка - Универсальные функции

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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


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

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

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

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

	КонецЕсли;

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


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


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

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


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


 

Вступайте в нашу телеграмм-группу Инфостарт

Дерево значений функции процедуры

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    3931    Abysswalker    9    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    7393    DeerCven    15    

61

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    51805    dimanich70    84    

173

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7595    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    65832    atdonya    31    

70

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9475    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. json 3417 05.12.19 07:54 Сейчас в теме
// Функция возвращает дерево значений
//
Функция Получить_ДеревоЗначений()


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


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

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

Раз уж пишешь комментарий, так разъяснил бы в нем почему они ненужные, и так ведь понятно что раз их удаляешь, то они тебе не нужны
3. Mellow 59 05.12.19 11:04 Сейчас в теме
(1) Согласен, что может быть не все коментарии информативные, но я разве статью об правильном написании комментариев писал
5. davdykin 25 13.12.19 17:14 Сейчас в теме
(1)Вы совершенно правильно указали на бесполезность комментариев в данном случаи, но упустили то, что имена функциям даны таким образом, что без комментариев понятно, какое действие они выполняют.
2. VmvLer 05.12.19 10:20 Сейчас в теме
приятный код, вспомнил школу когда читал камменты по слогам.
KoC_one; AnSk; +2 1 Ответить
4. пользователь 08.12.19 19:35
6. popenko 22.05.20 22:39 Сейчас в теме
Извините, за вопрос не в тему - а что это за обработка с какой кофигурации? скрин которой в начале статьи.
7. Mellow 59 23.05.20 12:25 Сейчас в теме
(6)Сводный отчет для руководителей подразделений организации, разрабативался для украинской утп 1.2
Для отправки сообщения требуется регистрация/авторизация