() upd
Пример использования с заполнением дерева на основе таблицы со связующими идентификаторами
#Область ПрограммныйИнтерфейс
Процедура ЗаполнитьДеревоФормыПоТаблицеЗначений(ПараметрыСоздания) Экспорт
// ТаблицаДанныхДляПланирования = ПолучитьТаблицуЗначений();
ПараметрыСозданияДереваНаФорме = ПараметрыСозданияДереваНаФорме();
ПараметрыСозданияДереваНаФорме.Форма = Форма;
ПараметрыСозданияДереваНаФорме.ИмяРеквизитаДерево = ИмяРеквизитаДерево;
ПараметрыСозданияДереваНаФорме.ИмяЭлементаФормыДерево = ИмяЭлементаФормыДерево;
ПараметрыСозданияДереваНаФорме.ТаблицаДанных = ТаблицаДанныхДляПланирования;
ПараметрыСозданияДереваНаФорме.ИмяКолонкиИдентификатораСтроки = "ИдентификаторТекущейСтроки";
ПараметрыСозданияДереваНаФорме.ИмяКолонкиИдентификатораСтрокиРодителя = "ИдентификаторСтрокиРодителя";
ЗаполнитьВыводимыеВДеревоКолонкиПотребностейКПланированию(ПараметрыСозданияДереваНаФорме.ТаблицаВыводимыхКолонок);
ЗаполнитьДеревоНаФорме(ПараметрыСозданияДереваНаФорме);
// +Условное оформление дерева
ЭлементУсловногоОформления = Форма.УсловноеОформление.Элементы.Добавить();
ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(,,Истина));
Для каждого ПараметрыВыводимойКолонки из ПараметрыСозданияДереваНаФорме.ТаблицаВыводимыхКолонок Цикл
ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяКолонкиДереваНаФорме(ИмяЭлементаФормыДерево, ПараметрыВыводимойКолонки.СлужебноеИмя));
КонецЦикла;
ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяРеквизитаДерево + "." + "ПолужирнаяСтрока");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Истина;
// -Условное оформление дерева
КонецПроцедуры
// Процедура заполняет дерево на форме, создавая ему колонки из таблицы данных
//
// Параметры:
// ПараметрыСоздания - см. "ПараметрыСозданияДереваНаФорме"
//
Процедура ЗаполнитьДеревоНаФорме(ПараметрыСоздания) Экспорт
ЛокальнаяТаблицаДанных = ПараметрыСоздания.ТаблицаДанных;
Форма = ПараметрыСоздания.Форма;
ДеревоФормы = Форма.РеквизитФормыВЗначение(ПараметрыСоздания.ИмяРеквизитаДерево);
Если ДеревоФормы.Колонки.Количество() = 0 Тогда //Или иное условие для создания/добавления колонок
ТаблицаНовыхКолонок = ПустаяТаблицаДляСозданиеКолонокДерева();
Для каждого КолонкаВВыводу из ПараметрыСоздания.ТаблицаВыводимыхКолонок Цикл
СтрокаСНовойКолонкой = ТаблицаНовыхКолонок.Добавить();
СтрокаСНовойКолонкой.ИмяКолонки = ЛокальнаяТаблицаДанных.Колонки[КолонкаВВыводу.СлужебноеИмя].Имя;
СтрокаСНовойКолонкой.ОписаниеТипа = ЛокальнаяТаблицаДанных.Колонки[КолонкаВВыводу.СлужебноеИмя].ТипЗначения;
СтрокаСНовойКолонкой.Заголовок = КолонкаВВыводу.Заголовок;
СтрокаСНовойКолонкой.Видимость = КолонкаВВыводу.Видимость;
СтрокаСНовойКолонкой.ТолькоПросмотр = КолонкаВВыводу.ТолькоПросмотр;
КонецЦикла;
СоздатьКолонкиДляДереваНаФорме(Форма, ПараметрыСоздания.ИмяРеквизитаДерево, ПараметрыСоздания.ИмяЭлементаФормыДерево, ТаблицаНовыхКолонок);
ДеревоФормы = Форма.РеквизитФормыВЗначение(ПараметрыСоздания.ИмяРеквизитаДерево);
КонецЕсли;
ДеревоФормы.Строки.Очистить();
Если ПараметрыСоздания.КартинкаСтрок <> Неопределено
И ЛокальнаяТаблицаДанных.Колонки.Найти(ПараметрыСоздания.ИмяКолонкиИндексаКартинки) <> Неопределено Тогда
Форма.Элементы[ПараметрыСоздания.ИмяЭлементаФормыДерево].ПутьКДаннымКартинкиСтроки = ПараметрыСоздания.ИмяРеквизитаДерево + "." + ПараметрыСоздания.ИмяКолонкиИндексаКартинки;
Форма.Элементы[ПараметрыСоздания.ИмяЭлементаФормыДерево].КартинкаСтрок = ПараметрыСоздания.КартинкаСтрок;
КонецЕсли;
СтрокиВерхнегоУровня = ЛокальнаяТаблицаДанных.НайтиСтроки(Новый Структура(ПараметрыСоздания.ИмяКолонкиИдентификатораСтрокиРодителя, Неопределено));
Для каждого СтрокаВерхнегоУровня из СтрокиВерхнегоУровня Цикл
ВеткаВерхнегоУровня = ДеревоФормы.Строки.Добавить();
ЗаполнитьЗначенияСвойств(ВеткаВерхнегоУровня, СтрокаВерхнегоУровня);
ЗаполнитьВеткуДерева(ВеткаВерхнегоУровня, ЛокальнаяТаблицаДанных, ПараметрыСоздания.ИмяКолонкиИдентификатораСтроки, ПараметрыСоздания.ИмяКолонкиИдентификатораСтрокиРодителя);
КонецЦикла;
Форма.ЗначениеВРеквизитФормы(ДеревоФормы, ПараметрыСоздания.ИмяРеквизитаДерево);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеСозданиеДереваПотребностейКПланированию
// Процедура рекурсивно заполняет ветки дерева от ветки верхнего уровня с пустым родителем (!) удаляя строки таблицы данных для упрощения поиска в рекурсии
Процедура ЗаполнитьВеткуДерева(ВеткаДерева, ТаблицаДанных, ИмяКолонкиИдентификатораСтроки, ИмяКолонкиИдентификатораСтрокиРодителя)
СтрокиТЧДляДерева = ТаблицаДанных.НайтиСтроки(Новый Структура(ИмяКолонкиИдентификатораСтрокиРодителя, ВеткаДерева[ИмяКолонкиИдентификатораСтроки]));
Если СтрокиТЧДляДерева.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ТаблицаСортировки = Новый ТаблицаЗначений;
ТаблицаСортировки.Колонки.Добавить("Значение");
ТаблицаСортировки.Колонки.Добавить("ПорядокСортировки1");
Для каждого СтрокаДанных из СтрокиТЧДляДерева Цикл
СтрокаТаблицыСортировки = ТаблицаСортировки.Добавить();
СтрокаТаблицыСортировки.Значение = СтрокаДанных;
СтрокаТаблицыСортировки.ПорядокСортировки1 = СтрокаДанных.ПорядокСортировки1;
КонецЦикла;
ТаблицаСортировки.Сортировать("ПорядокСортировки1 Возр");
Для каждого СтрокаТаблицыСортировки из ТаблицаСортировки Цикл
СтрокаДерева = ВеткаДерева.Строки.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаДерева, СтрокаТаблицыСортировки.Значение);
ЗаполнитьВеткуДерева(СтрокаДерева, ТаблицаДанных, ИмяКолонкиИдентификатораСтроки, ИмяКолонкиИдентификатораСтрокиРодителя);
ТаблицаДанных.Удалить(СтрокаТаблицыСортировки.Значение);
КонецЦикла;
КонецПроцедуры
// Процедура создает на форме колонки для дерева разузловки
// Таблицу новых колонок необходимо отсортировать в той последовательности, в которой требуется создать колонки
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения на которой требуется создать колонки
// ИмяРеквизитаСДеревом - Имя реквизита дерева на форме
// ИмяЭлементаФормыДерево - Имя элемента дерева на форме
// ТаблицаНовыхКолонок - Таблица значений, см "ПустаяТаблицаДляСозданиеКолонокДерева()"
//
Процедура СоздатьКолонкиДляДереваНаФорме(Форма, ИмяРеквизитаСДеревом, ИмяЭлементаФормыДерево, ТаблицаНовыхКолонок)
МассивДобавляемыхРеквизитовНаФорму = Новый Массив;
Для каждого ДанныеНовойКолонки из ТаблицаНовыхКолонок Цикл
МассивДобавляемыхРеквизитовНаФорму.Добавить(Новый РеквизитФормы(ДанныеНовойКолонки.ИмяКолонки, ДанныеНовойКолонки.ОписаниеТипа, ИмяРеквизитаСДеревом));
КонецЦикла;
Форма.ИзменитьРеквизиты(МассивДобавляемыхРеквизитовНаФорму);
Для каждого ДанныеНовойКолонки из ТаблицаНовыхКолонок Цикл
НоваяКолонкаНаФорме = Форма.Элементы.Добавить(ИмяКолонкиДереваНаФорме(ИмяЭлементаФормыДерево, ДанныеНовойКолонки.ИмяКолонки), Тип("ПолеФормы"), Форма.Элементы[ИмяЭлементаФормыДерево]);
НоваяКолонкаНаФорме.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонкаНаФорме.ПутьКДанным = ИмяРеквизитаСДеревом + "." + ДанныеНовойКолонки.ИмяКолонки;
НоваяКолонкаНаФорме.Заголовок = ДанныеНовойКолонки.Заголовок;
Если ДанныеНовойКолонки.Видимость <> Неопределено Тогда
НоваяКолонкаНаФорме.Видимость = ДанныеНовойКолонки.Видимость;
КонецЕсли;
Если ДанныеНовойКолонки.ТолькоПросмотр <> Неопределено Тогда
НоваяКолонкаНаФорме.ТолькоПросмотр = ДанныеНовойКолонки.ТолькоПросмотр;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Функция формирует наименование элемента формы "Колонка" для дерева
Функция ИмяКолонкиДереваНаФорме(ИмяДерева, ИмяКолонки)
Возврат ИмяДерева + ИмяКолонки;
КонецФункции
// Функция возвращает таблицу для создания колонок дерева
Функция ПустаяТаблицаДляСозданиеКолонокДерева()
Шаблон = Новый ТаблицаЗначений;
Шаблон.Колонки.Добавить("ИмяКолонки");
Шаблон.Колонки.Добавить("ОписаниеТипа");
Шаблон.Колонки.Добавить("Заголовок");
Шаблон.Колонки.Добавить("Видимость");
Шаблон.Колонки.Добавить("ТолькоПросмотр");
Возврат Шаблон;
КонецФункции
// Функция возвращает параметры создания дерева на форме
//
// Возвращаемое значение:
// Структура с элементами:
// * Форма - ФормаКлиентскогоПриложения на которой требуется создать колонки
// * ИмяРеквизитаСДеревом - Имя реквизита дерева на форме
// * ИмяЭлементаФормыДерево - Имя элемента дерева на форме
// * ТаблицаДанных - Таблица значений. Обязательные колонки с произвольным именем, содержащие идентификаторы, связующие строки между собой: "ИдентификаторСтрокиРодителя", "ИдентификаторТекущейСтроки"
// * ИмяКолонкиИдентификатораСтроки - Строка. Имя колонки с произвольным идентификатором строки
// * ИмяКолонкиИдентификатораСтрокиРодителя - Строка. Имя колонки с произвольным идентификатором строки родителя (тут должен быть "ИдентификаторТекущейСтроки", уже существующей в таблице). Если родителя нет, то значение должно быть "Неопределено"
// * КартинкаСтрока - Картинка. Изображение, которое будет выводится в строки. При использовании требуется колонка с хранением индекса картинки в таблицу данных
// * ИмяКолонкиИндексаКартинки - Строка. Имя колонки, в которой хранится индекс картинки
// * ТаблицаВыводимыхКолонок - Таблица значений. Таблица имен колонок, которые требуется вывести в дерево из таблицы данных. Вывод колонок в дерево согласно порядку в таблице
// Колонки:
// ' СлужебноеИмя - Строка. Имя колонки в таблице данных
// ' Заголовок - Строка. Имя колонки на форме
// ' Видимость - Булево. Видимость колонки на форме. Если оставить пустым, то примет стандартное значение для элемента формы
// ' ТолькоПросмотр - Булево. Только просмотр колонки на форме. Если оставить пустым, то примет стандартное значение для элемента формы
Функция ПараметрыСозданияДереваНаФорме()
СтруктураПараметров = Новый Структура();
СтруктураПараметров.Вставить("Форма");
СтруктураПараметров.Вставить("ИмяРеквизитаДерево");
СтруктураПараметров.Вставить("ИмяЭлементаФормыДерево");
СтруктураПараметров.Вставить("ТаблицаДанных");
СтруктураПараметров.Вставить("ИмяКолонкиИдентификатораСтроки");
СтруктураПараметров.Вставить("ИмяКолонкиИдентификатораСтрокиРодителя");
СтруктураПараметров.Вставить("КартинкаСтрок");
СтруктураПараметров.Вставить("ИмяКолонкиИндексаКартинки", "ИндексКартинки");
ТаблицаВыводимыхКолонок = Новый ТаблицаЗначений;
ТаблицаВыводимыхКолонок.Колонки.Добавить("СлужебноеИмя");
ТаблицаВыводимыхКолонок.Колонки.Добавить("Заголовок", Новый ОписаниеТипов("Строка", ,Новый КвалификаторыСтроки(255, ДопустимаяДлина.Переменная)));
ТаблицаВыводимыхКолонок.Колонки.Добавить("Видимость");
ТаблицаВыводимыхКолонок.Колонки.Добавить("ТолькоПросмотр");
СтруктураПараметров.Вставить("ТаблицаВыводимыхКолонок", ТаблицаВыводимыхКолонок);
Возврат СтруктураПараметров;
КонецФункции
// Процедура создает перечень колонок к выводу в дерево
//
// Параметры:
// ТаблицаВыводимыхКолонок - см. "ПараметрыСозданияДереваНаФорме().ТаблицаВыводимыхКолонок"
//
Процедура ЗаполнитьВыводимыеВДеревоКолонкиПотребностейКПланированию(ТаблицаВыводимыхКолонок)
КолонкаДляДерева = ТаблицаВыводимыхКолонок.Добавить();
КолонкаДляДерева.СлужебноеИмя = "ПредставлениеСтроки";
КолонкаДляДерева.Заголовок = "Материал";
КолонкаДляДерева = ТаблицаВыводимыхКолонок.Добавить();
КолонкаДляДерева.СлужебноеИмя = "ОперацияПроизводстваПредставление";
КолонкаДляДерева.Заголовок = "Операция";
КолонкаДляДерева = ТаблицаВыводимыхКолонок.Добавить();
КолонкаДляДерева.СлужебноеИмя = "РабочийЦентрПредставление";
КолонкаДляДерева.Заголовок = "Рабочий центр";
КолонкаДляДерева = ТаблицаВыводимыхКолонок.Добавить();
КолонкаДляДерева.СлужебноеИмя = "Номенклатура";
КолонкаДляДерева.Заголовок = "Номенклатура";
КолонкаДляДерева = ТаблицаВыводимыхКолонок.Добавить();
КолонкаДляДерева.СлужебноеИмя = "Характеристика";
КолонкаДляДерева.Заголовок = "Характеристика";
КолонкаДляДерева = ТаблицаВыводимыхКолонок.Добавить();
КолонкаДляДерева.СлужебноеИмя = "Количество";
КолонкаДляДерева.Заголовок = "Количество";
КолонкаДляДерева = ТаблицаВыводимыхКолонок.Добавить();
КолонкаДляДерева.СлужебноеИмя = "ИдентификаторСтрокиРодителя";
КолонкаДляДерева.Заголовок = "ИдентификаторСтрокиРодителя";
КолонкаДляДерева.Видимость = Ложь;
КолонкаДляДерева = ТаблицаВыводимыхКолонок.Добавить();
КолонкаДляДерева.СлужебноеИмя = "ИдентификаторТекущейСтроки";
КолонкаДляДерева.Заголовок = "ИдентификаторТекущейСтроки";
КолонкаДляДерева.Видимость = Ложь;
КолонкаДляДерева = ТаблицаВыводимыхКолонок.Добавить();
КолонкаДляДерева.СлужебноеИмя = "ПолужирнаяСтрока";
КолонкаДляДерева.Заголовок = "ПолужирнаяСтрока";
КолонкаДляДерева.Видимость = Ложь;
КонецПроцедуры
#КонецОбласти
Показать