1с статьи | Курс-репетитор программиста 1С
Дерево значений

Создание и обход

ДеревоЗначений = Новый ДеревоЗначений;	

// Полностью скопируем дерево значений
КопияДереваЗначений = ДеревоЗначений.Скопировать();

// РАБОТА С КОЛОНКАМИ ДЕРЕВА
КолонкиДерева = ДеревоЗначений.Колонки; // Доступ к КоллекцииКолонокДереваЗначений 

// Добавим колонку Добавить(<Имя>, <Тип>, <Заголовок>, <Ширина>) 
КолонкаДерева = КолонкиДерева.Добавить("ИмяКолонки1",
Новый ОписаниеТипов("Число"), "ЗаголовокКолонки1");

// После создания колонки невозможно изменить её Тип 
// Но возможно поменять Имя, Заголовок и Ширину
КолонкаДерева.Имя = "Колонка1";
КолонкаДерева.Заголовок = "Колонка1";
КолонкаДерева.Ширина = 20; // Ширина задаётся числом символов 

// Вставим новую колонку на 0 позицию 
// Вставить(<Индекс>, <Имя>, <Тип>, <Заголовок>, <Ширина>)
ВставленнаяКолонка = КолонкиДерева.Вставить(0, "Колонка0",
Новый ОписаниеТипов("Число"), "Колонка0", 20); 

//РАБОТА СО СТРОКАМИ ДЕРЕВА
СтрокиДерева = ДеревоЗначений.Строки;
// Добавим строку	
СтрокаДерева = СтрокиДерева.Добавить(); 
// В свойствах строки есть доступные колонки
СтрокаДерева.Колонка0 = 17; 
СтрокаДерева.Колонка1 = 18;

// Вставим строку на 0 позицию
// Вставить(<Индекс>)
ВставленнаяСтрока = СтрокиДерева.Вставить(0);
ВставленнаяСтрока.Колонка0 = 40; 
ВставленнаяСтрока.Колонка1 = 50;

// Добавим подстроку строки дерева
ПодстрокаДерева = СтрокаДерева.Строки.Добавить();
// Колонки те же
ПодстрокаДерева.Колонка0 = 43;
ПодстрокаДерева.Колонка1 = 89;

// Удалим строку
// Передаем строку дерева
СтрокиДерева.Удалить(СтрокаДерева);
// Передаём индекс строки в дереве
СтрокиДерева.Удалить(0);
// Если у строки имеются подчиненные строки, они также будут удалены

// Удалим все строки текущего уровня
// Если у строк данного уровня были подчиненные строки, то они также будут удалены
// Структура колонок остается неизменной
СтрокиДерева.Очистить();

// Удалим все созданные колонки дерева
// При этом также удаляются все его строки
КолонкиДерева.Очистить();

// Обход строк осуществляется рекурсивно. Знаете как?

Показать решение

Методы колонок дерева значений

ДеревоЗначений = Новый ДеревоЗначений;
КолонкиДерева = ДеревоЗначений.Колонки;

КолонкаДерева0 = КолонкиДерева.Добавить("Колонка0", Новый ОписаниеТипов("Число"), "Колонка0");
КолонкаДерева1 = КолонкиДерева.Добавить("Колонка1", Новый ОписаниеТипов("Число"), "Колонка1");

// Найдем индекс колонки
// Индекс(<Колонка>)	
ИндексКолонки = КолонкиДерева.Индекс(КолонкаДерева1); // Вернёт 1 
// Если не найдено, то возвращается -1.

// Получим колонку по индексу
// Получить(<Индекс>)
КолонкаПоИндексу = КолонкиДерева.Получить(ИндексКолонки); // Вернёт Колонка1

// Колонку можно сдвинуть
// Сдвинуть(<Колонка>, <Смещение>)
// Отрицательное смещение обозначает сдвиг в начало коллекции
КолонкиДерева.Сдвинуть(КолонкаДерева1, -1); // Сдвинет Колонка1 с 1 позиции в 0
// Положительное смещение обозначает сдвиг в конец коллекции
КолонкиДерева.Сдвинуть(КолонкаДерева1, 1); // Сдвинет Колонка1 с 0 позиции в 1
	
// Получить количество колонок
КоличествоКолонок = КолонкиДерева.Количество();// 2

// Поиск колонки
// Найти(<НаименованиеКолонки>)
НайденнаяКолонка = КолонкиДерева.Найти("Колонка0"); // Вернёт Колонку0 с типом КолонкаДереваЗначений
// Если указанная колонка отсутствует, то возвращается значение Неопределено

Методы строк дерева значений

ДеревоЗначений = Новый ДеревоЗначений;

КолонкиДерева = ДеревоЗначений.Колонки;
СтрокиДерева = ДеревоЗначений.Строки; 

КолонкаДерева0 = КолонкиДерева.Добавить("Колонка0", Новый ОписаниеТипов("Число"), "Колонка0");
КолонкаДерева1 = КолонкиДерева.Добавить("Колонка1", Новый ОписаниеТипов("Число"), "Колонка1");

СтрокаДерева0 = СтрокиДерева.Добавить(); 
СтрокаДерева0.Колонка0 = 17;
СтрокаДерева0.Колонка1 = 54;

СтрокаДерева1 = СтрокиДерева.Добавить(); 
СтрокаДерева1.Колонка0 = 71;
СтрокаДерева1.Колонка1 = 45;  
	
// Получим индекс строки
ИндексСтроки = СтрокиДерева.Индекс(СтрокаДерева1); // 1
// Если не найдено, то возвращается -1

// Получим строку по индексу
// Получить(<Индекс>)
СтрокаДерева = СтрокиДерева.Получить(ИндексСтроки); // Вернет СтрокуДерева1

// Передвинем строку дерева
// Сдвинуть(<Строка>, <Смещение>)
// Отрицательное смещение обозначает уменьшение текущего индекса (сдвиг к началу коллекции)
СтрокиДерева.Сдвинуть(СтрокаДерева1, -1); // Сдвинет с 1 Позиции на 0
// Положительное смещение обозначает увеличение текущего индекса (сдвиг к концу коллекции)
СтрокиДерева.Сдвинуть(СтрокаДерева1, 1); // Сдвинет с 0 Позиции на 1 

// Получим итоги по колонке 
// Итог(<Колонка>, <ВключатьПодчиненные>)
ИтогПоКолонке1 = СтрокиДерева.Итог(1, Ложь); // Вернет 99
// Колонку можно указать по имени, индексу или передать колонку дерева

// Количество строк
КоличествоСтрок = СтрокиДерева.Количество(); // 2

// Найдём строку дерева по значению
// Найти(<Значение>, <Колонки>, <ВключатьПодчиненные>)
ИскомаяСтрока = СтрокиДерева.Найти(71, "Колонка0, Колонка1", Ложь);
// Вернёт первую строку со значением 71 в одной из переданных колонок
// Если значение не найдено, то возвращается значение Неопределено

// Найдём все строки дерева с нужным значением по колонкам
// НайтиСтроки(<ПараметрыОтбора>, <ВключатьПодчиненные>)
МассивИскомыхСтрок = СтрокиДерева.НайтиСтроки(
	Новый Структура("Колонка0, Колонка1", 17, 54), Ложь);
// Массив хранит ссылки на строки дерева значений, 
// то есть при изменении строки в дереве, значение в массиве тоже будет изменено
	
// Отсортируем строки
// Сортировать(<СтрокаСортировки>, <ВключатьПодчиненные>, <ОбъектСравнения>)
СтрокиДерева.Сортировать("Колонка0 Возр, Колонка1 Убыв", Ложь, Новый СравнениеЗначений);
// Сперва отсортируются строки по Возростанию в колонке0
// Затем отсортируются по убыванию колонки1
// ПРИ ЭТОМ
// Если третим параметром указан объект сравнения то:
// 		Элементы, чьи типы не совпадают, сравниваются по коду типа;
// 		Элементы простых типов сравниваются по значению;
// 		Объекты сравниваются по идентификатору;
 // 		Моменты времени сравниваются по дате и идентификатору объекта;
// 		Элементы остальных типов сравниваются по строковому представлению.
// Если не указывать третий параметр то:
// 		Элементы, чьи типы не совпадают, сравниваются по коду типа;
// 		Элементы простых типов сравниваются по значению;
// 		Элементы остальных типов сравниваются по строковому представлению. 

// Выгрузим колонку 
// В параметрах передадим колонку тип КолонкаДереваЗначений
МассивЗначенийКолонки1 = СтрокиДерева.ВыгрузитьКолонку(КолонкаДерева1);
// В параметрах передадим имя колонки тип Строка
МассивЗначенийКолонки1 = СтрокиДерева.ВыгрузитьКолонку("Колонка1");
// В параметрах передадим Индекс колонки тип Число
МассивЗначенийКолонки1 = СтрокиДерева.ВыгрузитьКолонку(1);
// Возвращается массив значений строк текущего уровня переданной колонки
// В нашем примере: 54 45

// Загрузим значения в колонку0
// В параметрах передадим колонку
СтрокиДерева.ЗагрузитьКолонку(МассивЗначенийКолонки1, КолонкаДерева1); 
// В параметрах передадим имя колонки
СтрокиДерева.ЗагрузитьКолонку(МассивЗначенийКолонки1, "Колонка0");
// В параметрах передадим индекс 
СтрокиДерева.ЗагрузитьКолонку(МассивЗначенийКолонки1, 0);
// Значения из массива скопируются в строки колонки

Сообщить(СтрокаДерева0.Колонка0);
Сообщить(СтрокаДерева1.Колонка0);

// Что будет выведено?

Показать решение

Слишком маленькое разрешение экрана.