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