&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("АвтоТест") Тогда
Возврат;
КонецЕсли;
СтруктураЗаполняемыхЗначений = Новый Структура("ТаблицаЗаполнения, КолонкаЗаполнения",
Параметры.ТаблицаЗаполнения,
Параметры.КолонкаЗаполнения);
Заголовок = Параметры.ЗаголовокФормыВыбора;
Запрос = Новый Запрос("ВЫБРАТЬ
| ТаблицаВыбранных.ЗначениеЭлемента КАК ЗначениеЭлемента,
| 1 КАК Отметка
|ПОМЕСТИТЬ ВыбранныеЗначения
|ИЗ
| &ТаблицаВыбранных КАК ТаблицаВыбранных
|
|ИНДЕКСИРОВАТЬ ПО
| ЗначениеЭлемента
|;
|
|
|ВЫБРАТЬ
| ВыбираемыйСправочник.Ссылка КАК Представление,
| ЕСТЬNULL(ВыбранныеЗначения.Отметка, 0) КАК Отметка
|ИЗ
| Справочник.%ИмяСправочника% КАК ВыбираемыйСправочник
| ЛЕВОЕ СОЕДИНЕНИЕ ВыбранныеЗначения КАК ВыбранныеЗначения
| ПО ВыбираемыйСправочник.Ссылка = ВыбранныеЗначения.ЗначениеЭлемента
|ГДЕ
| ВыбираемыйСправочник.ПометкаУдаления = ЛОЖЬ
|
|УПОРЯДОЧИТЬ ПО
| ВыбираемыйСправочник.Наименование %РежимУпорядочивания%");
Запрос.Текст = СтрЗаменить(Запрос.Текст, "%ИмяСправочника%", Параметры.ВыбираемыйСправочник);
Запрос.Текст = СтрЗаменить(Запрос.Текст, "%РежимУпорядочивания%", Параметры.РежимУпорядочивания);
ТаблицаВыбранныхЗначений = ПолучитьИзВременногоХранилища(Параметры.ТаблицаВыбранныхЗначений);
ТаблицаВыбранныхЗначений.Колонки[Параметры.КолонкаЗаполнения].Имя = "ЗначениеЭлемента";
Запрос.УстановитьПараметр("ТаблицаВыбранных", ТаблицаВыбранныхЗначений);
РезультатЗапроса = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
КоллекцияЭлементовДерева = СтруктураПредприятия.ПолучитьЭлементы();
КоллекцияЭлементовДерева.Очистить();
ОбщегоНазначения.ЗаполнитьКоллекциюЭлементовДереваДанныхФормы(КоллекцияЭлементовДерева, РезультатЗапроса);
РасчитатьСтатусВсехОтметокДереваЗначений(СтруктураПредприятия);
КонецПроцедуры
&НаКлиенте
Процедура СтруктураПредприятияОтметкаПриИзменении(Элемент)
ИзменитьПометкуВыделеннойСтроки(СтруктураПредприятия, Элемент.Родитель.ТекущаяСтрока, Элемент.Родитель.ТекущиеДанные.Отметка);
КонецПроцедуры
&НаКлиенте
Процедура КомандаВыбрать(Команда)
ПараметрыЗакрытияФормы = Новый Структура();
ПараметрыЗакрытияФормы.Вставить("АдресТаблицыВоВременномХранилище", СформироватьТаблицуВыбранныхЗначений());
ПараметрыЗакрытияФормы.Вставить("ТаблицаЗаполнения", СтруктураЗаполняемыхЗначений.ТаблицаЗаполнения);
ПараметрыЗакрытияФормы.Вставить("КолонкаЗаполнения", СтруктураЗаполняемыхЗначений.КолонкаЗаполнения);
ОповеститьОВыборе(ПараметрыЗакрытияФормы);
КонецПроцедуры
&НаСервере
Функция ВыгрузитьДеревоЗначенийВТаблицуЗначений(ДеревоВыбранныхЗначений, ТаблицаВыбранныхЗначений, ПометкаВладельца = Неопределено) Экспорт
Для Каждого СтрокаДерева Из ДеревоВыбранныхЗначений.ПолучитьЭлементы() Цикл
Если СтрокаДерева.Отметка = 1 Тогда
Если ПометкаВладельца = Неопределено
Или ПометкаВладельца <> 1 Тогда
ЗаполнитьЗначенияСвойств(ТаблицаВыбранныхЗначений.Добавить(), СтрокаДерева);
КонецЕсли;
КонецЕсли;
ВыгрузитьДеревоЗначенийВТаблицуЗначений(СтрокаДерева, ТаблицаВыбранныхЗначений, СтрокаДерева.Отметка);
КонецЦикла;
Возврат ТаблицаВыбранныхЗначений;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура ИзменитьПометкуВыделеннойСтроки(ДеревоВыбранныхЗначений, ВыделеннаяСтрока, Отметка)
ЭлементДерева = ДеревоВыбранныхЗначений.НайтиПоИдентификатору(ВыделеннаяСтрока);
ИзменитьПометкуЭлементаДерева(ЭлементДерева, Отметка%2);
Родитель = ЭлементДерева.ПолучитьРодителя();
Пока Родитель <> Неопределено Цикл
РассчитатьПометкуЭлементаДерева(Родитель);
Родитель = Родитель.ПолучитьРодителя();
КонецЦикла
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура РассчитатьПометкуЭлементаДерева(ЭлементДерева)
Если ЭлементДерева = Неопределено Тогда
Возврат;
КонецЕсли;
Отметка = 0;
Предыдущая = -1;
Для Каждого СтрокаДерева Из ЭлементДерева.ПолучитьЭлементы() Цикл
Отметка = СтрокаДерева.Отметка;
Если Отметка = 2 Или (Отметка + Предыдущая) = 1 Тогда
ЭлементДерева.Отметка = 2;
Возврат;
КонецЕсли;
Предыдущая = Отметка;
КонецЦикла;
ЭлементДерева.Отметка = Отметка;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ИзменитьПометкуЭлементаДерева(ЭлементДерева, Отметка)
ЭлементДерева.Отметка = Отметка;
ЭлементыДерева = ЭлементДерева.ПолучитьЭлементы();
Для Каждого СтрокаДерева Из ЭлементыДерева Цикл
ИзменитьПометкуЭлементаДерева(СтрокаДерева, ?(Отметка > 0, 1, 0));
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура РасчитатьСтатусВсехОтметокДереваЗначений(ДеревоВыбранныхЗначений)
Для Каждого СтрокаДерева Из ДеревоВыбранныхЗначений.ПолучитьЭлементы() Цикл
Если СтрокаДерева.Отметка = 1 Тогда
ИзменитьПометкуВыделеннойСтроки(СтруктураПредприятия, СтрокаДерева.ПолучитьИдентификатор() , 1);
КонецЕсли;
РасчитатьСтатусВсехОтметокДереваЗначений(СтрокаДерева);
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция СформироватьТаблицуВыбранныхЗначений()
ТаблицаВыбранныхЗначений = Новый ТаблицаЗначений;
ТаблицаВыбранныхЗначений.Колонки.Добавить("Представление");
Возврат ПоместитьВоВременноеХранилище(
ВыгрузитьДеревоЗначенийВТаблицуЗначений(СтруктураПредприятия, ТаблицаВыбранныхЗначений),
УникальныйИдентификатор);
КонецФункции