#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьУсловноеОформление();
МножественныйВыбор = Ложь;
ПрочитатьДеревоУзловОбмена();
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ТекПараметры = УстановитьПараметрыФормы();
РазвернутьУзлы(ТекПараметры.Отмеченные);
Элементы.ДеревоУзловОбмена.ТекущаяСтрока = ТекПараметры.ТекущаяСтрока;
КонецПроцедуры
&НаКлиенте
Процедура ПриПовторномОткрытии()
ТекПараметры = УстановитьПараметрыФормы();
РазвернутьУзлы(ТекПараметры.Отмеченные);
Элементы.ДеревоУзловОбмена.ТекущаяСтрока = ТекПараметры.ТекущаяСтрока;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыДеревоУзлов
&НаКлиенте
Процедура ДеревоУзловОбменаВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
ПроизвестиВыборУзлов(Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ДеревоУзловОбменаПометкаПриИзменении(Элемент)
ИзменениеПометки(Элементы.ДеревоУзловОбмена.ТекущаяСтрока);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура ВыбратьУзел(Команда)
ПроизвестиВыборУзлов(МножественныйВыбор);
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьУзел(Команда)
КлючСсылка = Элементы.ДеревоУзловОбмена.ТекущиеДанные.Ссылка;
Если КлючСсылка <> Неопределено Тогда
ОткрытьФорму(ПолучитьИмяФормы(КлючСсылка) + "ФормаОбъекта", Новый Структура("Ключ", КлючСсылка));
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаСервере
Процедура УстановитьУсловноеОформление()
УсловноеОформление.Элементы.Очистить();
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ДеревоУзловОбменаКод.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДеревоУзловОбмена.Ссылка");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
КонецПроцедуры
&НаКлиенте
Процедура РазвернутьУзлы(Отмеченные)
Если Отмеченные <> Неопределено Тогда
Для Каждого ТекИд Из Отмеченные Цикл
ТекСтрока = ДеревоУзловОбмена.НайтиПоИдентификатору(ТекИд);
ТекРодитель = ТекСтрока.ПолучитьРодителя();
Если ТекРодитель <> Неопределено Тогда
Элементы.ДеревоУзловОбмена.Развернуть(ТекРодитель.ПолучитьИдентификатор());
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПроизвестиВыборУзлов(ЭтоМножественныйВыбор)
Если ЭтоМножественныйВыбор Тогда
Данные = ВыбранныеУзлы();
Если Данные.Количество() > 0 Тогда
ОповеститьОВыборе(Данные);
КонецЕсли;
Возврат;
КонецЕсли;
Данные = Элементы.ДеревоУзловОбмена.ТекущиеДанные;
Если Данные <> Неопределено И Данные.Ссылка <> Неопределено Тогда
ОповеститьОВыборе(Данные.Ссылка);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ВыбранныеУзлы(НовыеДанные = Неопределено)
Если НовыеДанные <> Неопределено Тогда
Отмеченные = Новый Массив;
ВнутрУстановитьВыбранныеУзлы(ЭтотОбъект(), ДеревоУзловОбмена, НовыеДанные, Отмеченные);
Возврат Отмеченные;
КонецЕсли;
Результат = Новый Массив;
Для Каждого ТекПлан Из ДеревоУзловОбмена.ПолучитьЭлементы() Цикл
Для Каждого ТекСтрока Из ТекПлан.ПолучитьЭлементы() Цикл
Если ТекСтрока.Пометка И ТекСтрока.Ссылка <> Неопределено Тогда
Результат.Добавить(ТекСтрока.Ссылка);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Результат;
КонецФункции
&НаСервере
Процедура ВнутрУстановитьВыбранныеУзлы(ТекущийОбъект, Данные, НовыеДанные, Отмеченные)
Для Каждого ТекСтрока Из Данные.ПолучитьЭлементы() Цикл
Если НовыеДанные.Найти(ТекСтрока.Ссылка) <> Неопределено Тогда
ТекСтрока.Пометка = Истина;
ТекущийОбъект.ПроставитьПометкиВверх(ТекСтрока);
Отмеченные.Добавить(ТекСтрока.ПолучитьИдентификатор());
КонецЕсли;
ВнутрУстановитьВыбранныеУзлы(ТекущийОбъект, ТекСтрока, НовыеДанные, Отмеченные);
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ЭтотОбъект(ТекущийОбъект = Неопределено)
Если ТекущийОбъект = Неопределено Тогда
Возврат РеквизитФормыВЗначение("Объект");
КонецЕсли;
ЗначениеВРеквизитФормы(ТекущийОбъект, "Объект");
Возврат Неопределено;
КонецФункции
&НаСервере
Функция ПолучитьИмяФормы(ТекущийОбъект = Неопределено)
Возврат ЭтотОбъект().ПолучитьИмяФормы(ТекущийОбъект);
КонецФункции
&НаСервере
Процедура ПрочитатьДеревоУзловОбмена()
Дерево = ЭтотОбъект().СформироватьДеревоУзлов();
ЗначениеВРеквизитФормы(Дерево, "ДеревоУзловОбмена");
КонецПроцедуры
&НаСервере
Процедура ИзменениеПометки(СтрокаДанных)
ЭлементДанных = ДеревоУзловОбмена.НайтиПоИдентификатору(СтрокаДанных);
ЭтотОбъект().ИзменениеПометки(ЭлементДанных);
КонецПроцедуры
&НаСервере
Функция УстановитьПараметрыФормы()
Результат = Новый Структура("ТекущаяСтрока, Отмеченные");
Элементы.ДеревоУзловОбменаПометка.Видимость = Параметры.МножественныйВыбор;
Если Параметры.МножественныйВыбор <> МножественныйВыбор Тогда
ТекущийОбъект = ЭтотОбъект();
Для Каждого ТекСтрока Из ДеревоУзловОбмена.ПолучитьЭлементы() Цикл
ТекСтрока.Пометка = Ложь;
ТекущийОбъект.ПроставитьПометкиВниз(ТекСтрока);
КонецЦикла;
КонецЕсли;
МножественныйВыбор = Параметры.МножественныйВыбор;
Если МножественныйВыбор И ТипЗнч(Параметры.НачальноеЗначениеВыбора) = Тип("Массив") Тогда
Отмеченные = ВыбранныеУзлы(Параметры.НачальноеЗначениеВыбора);
Результат.Отмеченные = Отмеченные;
Если Отмеченные.Количество() > 0 Тогда
Результат.ТекущаяСтрока = Отмеченные[0];
КонецЕсли;
ИначеЕсли Параметры.НачальноеЗначениеВыбора <> Неопределено Тогда
Результат.ТекущаяСтрока = ИдентификаторСтрокиПоУзлу(ДеревоУзловОбмена, Параметры.НачальноеЗначениеВыбора);
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервере
Функция ИдентификаторСтрокиПоУзлу(Данные, Ссылка)
Для Каждого ТекСтрока Из Данные.ПолучитьЭлементы() Цикл
Если ТекСтрока.Ссылка = Ссылка Тогда
Возврат ТекСтрока.ПолучитьИдентификатор();
КонецЕсли;
Результат = ИдентификаторСтрокиПоУзлу(ТекСтрока, Ссылка);
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
#КонецОбласти