Взаимодействия / Форма списка / Модуль формы

файл
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаКлиенте
Перем КонтекстВыбора;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	УстановитьУсловноеОформление();
	
	Если Параметры.РежимВыбора Тогда
		РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
		Элементы.Список.РежимВыбора = Истина;
	КонецЕсли;
	
	ИнформационнаяБазаФайловая          = ОбщегоНазначения.ИнформационнаяБазаФайловая();
	ИндексПолнотекстовогоПоискаАктуален = ПолнотекстовыйПоискСервер.ИндексПоискаАктуален();
	РазделениеВключено                  = ОбщегоНазначения.РазделениеВключено();
	
	ГиперссылкаЦвет = ЦветаСтиля.ГиперссылкаЦвет;
	
	Взаимодействия.ИнициализироватьФормуСпискаВзаимодействий(ЭтотОбъект, Параметры);
	ОпределитьДоступностьПолнотекстовыйПоиск();
	ПравоПометкиУдаленияПапок = ПравоДоступа("Изменение", Метаданные.Справочники.ПапкиЭлектронныхПисем);
	
	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Закладки, "Владелец", 
		Пользователи.ТекущийПользователь(),,, Истина);
	
	ДополнитьМенюПанелиНавигации();
	Взаимодействия.ЗаполнитьПодменюСтатус(Элементы.СписокСтатус, ЭтотОбъект);
	Взаимодействия.ЗаполнитьПодменюПоТипуВзаимодействия(Элементы.СписокТипВзаимодействия, ЭтотОбъект);
	
	Для Каждого ТипПредмета Из Метаданные.РегистрыСведений.ПредметыПапкиВзаимодействий.Ресурсы.Предмет.Тип.Типы() Цикл
		Если ТолькоПочта 
			И (ТипПредмета = Тип("ДокументСсылка.Встреча") ИЛИ ТипПредмета = Тип("ДокументСсылка.ТелефонныйЗвонок") 
			ИЛИ ТипПредмета = Тип("ДокументСсылка.ЗапланированноеВзаимодействие") ИЛИ ТипПредмета = Тип("ДокументСсылка.СообщениеSMS")) Тогда
			Продолжить;
		КонецЕсли;
		СписокВыбораТипаПредмета.Добавить(Метаданные.НайтиПоТипу(ТипПредмета).ПолноеИмя(), Строка(ТипПредмета));
	КонецЦикла;
	
	ТипВзаимодействия = ?(ТолькоПочта, "ВсеПисьма","Все");
	Статус = "Все";
	
	ИмяТекущейПанелиНавигации = Параметры.ИмяТекущейПанелиНавигации;
	Если ЗначениеЗаполнено(Параметры.ТекущаяСтрока) Тогда
		ПодготовитьНастройкиФормыКВыводуТекущейСсылки(Параметры.ТекущаяСтрока);
	КонецЕсли;
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	ПараметрыРазмещения = ПодключаемыеКоманды.ПараметрыРазмещения();
	ПараметрыРазмещения.Вставить("КоманднаяПанель", Элементы.ГруппаПанельНавигацииСписок.ПодчиненныеЭлементы.КоманднаяПанельВариантаНавигации);
	ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект, ПараметрыРазмещения);
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
	Взаимодействия.ЗаполнитьСписокДоступныхДляСозданияДокументов(ДокументыДоступныеДляСоздания);
	ЗапрещеноОтображениеНебезопасногоСодержимогоВПисьмах = Взаимодействия.ЗапрещеноОтображениеНебезопасногоСодержимогоВПисьмах();
	
	ПроверитьСостояниеОтправкиПисемНаСервере();
	СФормироватьДекорациюТолькоЗначимыеПредметы();
	СФормироватьДекорациюТолькоЗначимыеКонтакты();
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	
	Если ЗавершениеРаботы Тогда
		Возврат;
	КонецЕсли;
	
	Если РазделениеВключено 
		И Не ОтправкаПолучениеПисемВыполняется Тогда
		ОтправитьПолучитьПочтуПользователяКлиент();
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПередЗагрузкойДанныхИзНастроекНаСервере(Настройки)
	Если Не ПустаяСтрока(Параметры.ИмяТекущейПанелиНавигации) Тогда
		Настройки.Удалить("ИмяТекущейПанелиНавигации");
	КонецЕсли;
КонецПроцедуры

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

	Ответственный = Настройки.Получить("Ответственный");
	Если Ответственный <> Неопределено Тогда
		ПриИзмененииОтветственногоСервер(Ложь);
		Настройки.Удалить("Ответственный");
	КонецЕсли;
	
	Взаимодействия.ПриЗагрузкеТипаВзаимодействийИзНастроек(ЭтотОбъект, Настройки);
	
	ПриИзмененииТипаСервер(Ложь);
	ОбновитьПанельНавигацииНаСервере();
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ВРег(ИмяСобытия) = ВРег("Запись_ЗакладкиВзаимодействий") Тогда
		Если Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаЗакладки Тогда
			Элементы.Закладки.Обновить();
			ОбработатьАктивизациюСтрокиПанелиНавигации();
		КонецЕсли;
	ИначеЕсли ВРег(ИмяСобытия) = ВРег("Запись_ПапкиЭлектронныхПисем") 
		Или ВРег(ИмяСобытия) = ВРег("ПримененыПравилаОбработкиПисем")
		Или ВРег(ИмяСобытия) = ВРег("ВыполненаОтправкаПолучениеПисем") Тогда
		
		Если Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаПапки Тогда
			ОбновитьПанельНавигации();
			ВосстановитьРаскрытыеУзлыДерева();
		КонецЕсли;
		
		Если ВРег(ИмяСобытия) = ВРег("ВыполненаОтправкаПолучениеПисем") Тогда

			Если РазделениеВключено Тогда
				ПодключитьОбработчикОжидания("ПроверитьНеобходимостьОтправкиПолученияПочты", 150, Истина);
			КонецЕсли;
		
		КонецЕсли;
		
	ИначеЕсли ВРег(ИмяСобытия) = ВРег("ИзменениеПредметаВзаимодействий") Тогда
		Если Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаПредмет Тогда
			ОбновитьПанельНавигации();
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры 

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

&НаСервере
Процедура УстановитьНачальныеЗначенияПриОткрытии()
	
	Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаПредмет;
	Статус = "Все";
	ТипВзаимодействия = "Все";
	ПриИзмененииСтатусаСервер(Ложь);
	ПриИзмененииТипаСервер(Ложь);
	ОбновитьПанельНавигацииНаСервере();

КонецПроцедуры

&НаКлиенте
Процедура ОбработкаПерехода(ОбъектПерехода, СтандартнаяОбработка)
	Если Не ЗначениеЗаполнено(ОбъектПерехода) Или ОбъектПерехода = Элементы.Список.ТекущаяСтрока Тогда
		Возврат;
	КонецЕсли;
	
	ОбработкаПереходаНаСервере(ОбъектПерехода);
	ВосстановитьРаскрытыеУзлыДерева();
КонецПроцедуры

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

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

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

&НаКлиенте
Процедура ОтветственныйПриИзменении(Элемент)
	
	ПриИзмененииОтветственногоСервер(Истина);
	ВосстановитьРаскрытыеУзлыДерева();
	
КонецПроцедуры

&НаКлиенте
Процедура ТипВзаимодействияПриИзменении(Элемент)
	
	ПриИзмененииТипаСервер();
	ВосстановитьРаскрытыеУзлыДерева();
	
КонецПроцедуры

&НаКлиенте
Процедура СписокПриИзменении(Элемент)
	
	ОбновитьПанельНавигации();
	ВосстановитьРаскрытыеУзлыДерева();
	
КонецПроцедуры

&НаКлиенте
Процедура ПерсональныеНастройки(Команда)
	
	ОткрытьФорму("ЖурналДокументов.Взаимодействия.Форма.НастройкиРаботыСПочтой", , ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
	
	Если Элементы.Список.ТекущиеДанные = Неопределено И ОтображатьОбластьЧтения Тогда
		Если Элементы.СтраницыПредпросмотр.ТекущаяСтраница <> Элементы.СтраницаПредпросмотрОбычныйТекст Тогда
			Элементы.СтраницыПредпросмотр.ТекущаяСтраница = Элементы.СтраницаПредпросмотрОбычныйТекст;
		КонецЕсли;
		
		ОчиститьПредпросмотр();
		
	Иначе
		
		Если ВыборКорректен(Элемент.Имя,Истина) 
			И ВзаимодействиеДляКоторогоСформированПредпросмотр <> Элементы.Список.ТекущиеДанные.Ссылка Тогда
			
			Если Элементы.Список.ВыделенныеСтроки.Количество() = 1 Тогда
				
				ПодключитьОбработчикОжидания("ОбработатьАктивизациюСтрокиСписка",0.1,Истина);
				
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьПредпросмотр()

	Предпросмотр = "";
	ПредпросмотрHTML = "<HTML><BODY></BODY></HTML>";
	ВзаимодействиеДляКоторогоСформированПредпросмотр = Неопределено;

КонецПроцедуры

&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	Если Элементы.Список.РежимВыбора Тогда
		СтандартнаяОбработка = Ложь;
		ОповеститьОВыборе(ВыбраннаяСтрока);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПапкиВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
#Если НЕ МобильныйКлиент Тогда
		СтандартнаяОбработка = Ложь;
		ТекущиеДанные = Элемент.ТекущиеДанные;
		ПоказатьЗначение(, ТекущиеДанные.Значение);
#КонецЕсли
	
КонецПроцедуры

&НаКлиенте
Процедура КонтактыПанелиНавигацииВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
#Если НЕ МобильныйКлиент Тогда
		СтандартнаяОбработка = Ложь;
		ТекущиеДанные = Элемент.ТекущиеДанные;
		Если Не ТипЗнч(ТекущиеДанные.Контакт) = Тип("СправочникСсылка.СтроковыеКонтактыВзаимодействий") Тогда
			ПоказатьЗначение( ,ТекущиеДанные.Контакт);
		КонецЕсли;
#КонецЕсли
	
КонецПроцедуры

&НаКлиенте
Процедура ПредметыПанельНавигацииВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
#Если НЕ МобильныйКлиент Тогда
		ТекущиеДанные = Элемент.ТекущиеДанные;
		Если ТекущиеДанные <> Неопределено Тогда
			СтандартнаяОбработка = Ложь;
			ПоказатьЗначение( ,ТекущиеДанные.Предмет);
		КонецЕсли;
#КонецЕсли
	
КонецПроцедуры

&НаКлиенте
Процедура ПредметыПанельНавигацииПередУдалением(Элемент, Отказ)
	
	Отказ = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ПредметыПанельНавигацииПередНачаломИзменения(Элемент, Отказ)
	
	Отказ = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура КонтактыПередНачаломИзменения(Элемент, Отказ)
	
	Отказ = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура КонтактыПередУдалением(Элемент, Отказ)
	
	Отказ = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ПапкиПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
	
	Отказ = Истина;
	
	ТекущиеДанные = Элементы.Папки.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ТекущиеДанные.ЕстьПравоНаИзменение = 0 Тогда
		ВызватьИсключение(НСтр("ru = 'Недостаточно прав для создания папки.'"), КатегорияОшибки.НарушениеПравДоступа);
	КонецЕсли;
		
	СтруктураПараметры = Новый Структура;
	СтруктураПараметры.Вставить("Владелец", ТекущиеДанные.УчетнаяЗапись);
	Если ТипЗнч(ТекущиеДанные.Значение) = Тип("СправочникСсылка.ПапкиЭлектронныхПисем") Тогда
		СтруктураПараметры.Вставить("Родитель", ТекущиеДанные.Значение);
	КонецЕсли;
	
	ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", СтруктураПараметры);
	ОткрытьФорму("Справочник.ПапкиЭлектронныхПисем.ФормаОбъекта", ПараметрыФормы, ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ПапкиПередУдалением(Элемент, Отказ)
	
	Отказ = Истина;
	
	ТекущиеДанные = Элементы.Папки.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ТипЗнч(ТекущиеДанные.Значение) = Тип("СправочникСсылка.УчетныеЗаписиЭлектроннойПочты")
		ИЛИ ТекущиеДанные.ЕстьПравоНаИзменение = 0 ИЛИ ТекущиеДанные.ПредопределеннаяПапка Тогда
		Возврат;
	КонецЕсли;
	
	ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Удалить папку ""%1"" и переместить все ее содержимое в папку ""Удаленные""?'"),
			Строка(ТекущиеДанные.Значение));
	
	ДополнительныеПараметры = Новый Структура("ТекущиеДанные", ТекущиеДанные);
	ОбработчикОповещенияОЗакрытии = Новый ОписаниеОповещения("ВопросОУдаленииПапкиПослеЗавершения", ЭтотОбъект, ДополнительныеПараметры);
	ПоказатьВопрос(ОбработчикОповещенияОЗакрытии, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
	
КонецПроцедуры

&НаСервере
Функция УдалитьПапкуСервер(Знач Папка)
	
	ОписаниеОшибки = "";
	Взаимодействия.ВыполнитьУдалениеПапкиЭлектронныхПисем(Папка, ОписаниеОшибки);
	Если ПустаяСтрока(ОписаниеОшибки) Тогда
		ОбновитьПанельНавигации();
	КонецЕсли;
	
	Возврат ОписаниеОшибки;
	
КонецФункции

&НаКлиенте
Процедура СтатусПриИзменении(Элемент)
	
	ПриИзмененииСтатусаСервер(Истина);
	ВосстановитьРаскрытыеУзлыДерева();
	
КонецПроцедуры

&НаКлиенте
Процедура ТипВзаимодействияСтатусОчистка(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура СтрокаПоискаПриИзменении(Элемент)
	
	ОписанияНайденоПолнотекстовымПоиском.Очистить();
	
	Если СтрокаПоиска <> "" Тогда
		
		ПроверитьИндексПолнотекстовогоПоиска(); 
		
	Иначе 
		
		РасширенныйПоиск = Ложь;
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
			Список, 
			"Поиск",
			Неопределено,
			ВидСравненияКомпоновкиДанных.Равно,,Ложь);
			
		Элементы.ОписаниеНайденоПолнотекстовымПоиском.Видимость = РасширенныйПоиск;
		Элементы.ПредупреждениеОНеактуальностиИндекса.Видимость = Ложь;
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СтрокаПоискаАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ДанныеВыбора = Новый СписокЗначений;
	
	КоличествоНайденных = 0;
	Для каждого ЭлементСписка Из Элементы.СтрокаПоиска.СписокВыбора Цикл
		Если ЛЕВ(ВРег(ЭлементСписка.Значение), СтрДлина(СокрЛП(Текст))) = ВРег(СокрЛП(Текст)) Тогда
			ДанныеВыбора.Добавить(ЭлементСписка.Значение);
			КоличествоНайденных = КоличествоНайденных + 1;
			Если КоличествоНайденных > 7 Тогда
				Прервать;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры 

&НаКлиенте
Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
	
	ВзаимодействияКлиент.СписокПередНачаломДобавления(Элемент, Отказ, Копирование, ТолькоПочта, ДокументыДоступныеДляСоздания);
	
КонецПроцедуры

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

&НаКлиенте
Процедура УзелДереваПанелиНавигацииПередРазворачиванием(Элемент, Строка, Отказ)
	
	ИмяДерева = Элемент.Имя;
	
	Если Элемент.ТекущаяСтрока <> Неопределено Тогда
		ДанныеСтроки = Элементы[ИмяДерева].ДанныеСтроки(Строка);
		Если ДанныеСтроки <> Неопределено Тогда
			СохранитьСостояниеУзлаВНастройках(ИмяДерева, ДанныеСтроки.Значение, Истина);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПредпросмотрHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
	
	ВзаимодействияКлиент.ПолеHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ПредупреждениеОНеотправленныхПисьмахНадписьОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)

	ВзаимодействияКлиент.ОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ДекорацияТолькоЗначимыеПредметыОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Если НавигационнаяСсылкаФорматированнойСтроки = "ИзменитьТолькоЗначимыеПредметы" Тогда
		
		ТолькоЗначимыеПредметы = Не ТолькоЗначимыеПредметы;
		ЗаполнитьПанельПредметов();
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ДекорацияТолькоЗначимыеКонтактыОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Если НавигационнаяСсылкаФорматированнойСтроки = "ИзменитьТолькоЗначимыеКонтакты" Тогда
		
		ТолькоЗначимыеКонтакты = Не ТолькоЗначимыеКонтакты;
		ЗаполнитьПанельКонтактов();
		
	КонецЕсли;
	
КонецПроцедуры


#Область ОбработкаПеретаскивания

&НаКлиенте
Процедура ПредметыПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	
	Если (Строка = Неопределено) ИЛИ (ПараметрыПеретаскивания.Значение = Неопределено) Тогда
		Возврат;
	КонецЕсли;
	
	СтандартнаяОбработка = Ложь;
	
	Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив") Тогда
		
		Для каждого ЭлементМассива Из ПараметрыПеретаскивания.Значение Цикл
			Если ВзаимодействияКлиентСервер.ЯвляетсяВзаимодействием(ЭлементМассива) Тогда
				Возврат;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;

КонецПроцедуры

&НаКлиенте
Процедура ПредметыПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	
	СтандартнаяОбработка = Ложь;
	
	Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив") Тогда
		
		ВзаимодействияВызовСервера.УстановитьПредметДляМассиваВзаимодействий(ПараметрыПеретаскивания.Значение,
			Строка, Истина);
			
	КонецЕсли;
	
	ОбновитьПанельНавигации();
	
КонецПроцедуры

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

&НаКлиенте
Процедура ПапкиПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	
	СтандартнаяОбработка = Ложь;
	
	СтрокаНазначение = Папки.НайтиПоИдентификатору(Строка);
	
	Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив") Тогда
		ВыполнитьПереносВПапкуМассиваПисем(ПараметрыПеретаскивания.Значение, СтрокаНазначение.Значение);
	ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Число") Тогда
		ДанныеСтрокиПеретаскивания = Папки.НайтиПоИдентификатору(ПараметрыПеретаскивания.Значение);
		Если НЕ ДанныеСтрокиПеретаскивания.ПолучитьРодителя() = СтрокаНазначение Тогда
			УстановитьРодителяУПапки(ДанныеСтрокиПеретаскивания.Значение,
			                        ?(ТипЗнч(СтрокаНазначение.Значение) = Тип("СправочникСсылка.УчетныеЗаписиЭлектроннойПочты"),
			                        ПредопределенноеЗначение("Справочник.ПапкиЭлектронныхПисем.ПустаяСсылка"),
			                        СтрокаНазначение.Значение));
		КонецЕсли;
			
	КонецЕсли;
	
	ОбновитьПанельНавигации(СтрокаНазначение.Значение);
	ВосстановитьРаскрытыеУзлыДерева();
	
КонецПроцедуры

&НаКлиенте
Процедура ПапкиНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение)
	
	Если ПараметрыПеретаскивания.Значение = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ДанныеСтроки = Папки.НайтиПоИдентификатору(ПараметрыПеретаскивания.Значение);
	Если ТипЗнч(ДанныеСтроки.Значение) = Тип("СправочникСсылка.УчетныеЗаписиЭлектроннойПочты") 
		ИЛИ ДанныеСтроки.ПредопределеннаяПапка ИЛИ ДанныеСтроки.ЕстьПравоНаИзменение = 0 Тогда
		Выполнение = Ложь;
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура СписокПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

#КонецОбласти

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура Обновить(Команда)
	
	ОбновитьНаСервере();
	ВосстановитьРаскрытыеУзлыДерева();
	
КонецПроцедуры

&НаКлиенте
Процедура ОтправитьПолучитьПочтуВыполнить(Команда)
	
	ОчиститьСообщения();	
	Если Не РазделениеВключено И Не ИнформационнаяБазаФайловая Тогда
		Возврат;
	КонецЕсли;
	
	Если ОтправкаПолучениеПисемВыполняется Тогда
		ТекстСообщения = НСтр("ru = 'В настоящий момент отправка и получение почты уже выполняется.'");
		ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения);
		Возврат;
	КонецЕсли;
	
	Если ДатаПредыдущегоПолученияОтправкиПочты + 15 > ОбщегоНазначенияКлиент.ДатаСеанса() Тогда
		ТекстСообщения = НСтр("ru = 'С момента завершения предыдущей отправки и получения почты прошло менее 15 секунд. Повторите позже.'");
		ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения);
		Возврат;
	КонецЕсли;
	
	Если ДатаПредыдущегоВыполненияКомандыОтправкиПолученияПочты + 15 > ОбщегоНазначенияКлиент.ДатаСеанса() Тогда
		ТекстСообщения = НСтр("ru = 'С момента предыдущего выполнения команды отправки и получения почты прошло менее 15 секунд. Повторите позже.'");
		ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения);
		Возврат;
	КонецЕсли;
	
	ДатаПредыдущегоВыполненияКомандыОтправкиПолученияПочты = ОбщегоНазначенияКлиент.ДатаСеанса();
	
	ОтправитьПолучитьПочтуПользователяКлиент(Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура Ответить(Команда)
	
	Если ВыборКорректен(Элементы.Список.Имя, Истина) Тогда
		ТекущееВзаимодействие = Элементы.Список.ТекущиеДанные.Ссылка;
		Если ТипЗнч(ТекущееВзаимодействие) <> Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее") Тогда
			ПоказатьПредупреждение(, НСтр("ru = 'Команда ""Ответить"" может быть выполнена только для входящего письма.'"));
			Возврат;
		КонецЕсли;
	Иначе
		Возврат;
	КонецЕсли;
	
	Основание = Новый Структура("Основание,Команда",ТекущееВзаимодействие, "Ответить");
	ПараметрыОткрытия = Новый Структура("Основание", Основание);
	ОткрытьФорму("Документ.ЭлектронноеПисьмоИсходящее.ФормаОбъекта", ПараметрыОткрытия);
	
КонецПроцедуры

&НаКлиенте
Процедура ОтветитьВсем(Команда)
	
	Если ВыборКорректен(Элементы.Список.Имя, Истина) Тогда
		ТекущееВзаимодействие = Элементы.Список.ТекущиеДанные.Ссылка;
		Если ТипЗнч(ТекущееВзаимодействие) <> Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее") Тогда
			ПоказатьПредупреждение(, НСтр("ru = 'Команда ""Ответить всем"" может быть выполнена только для входящего письма.'"));
			Возврат;
		КонецЕсли;
	Иначе
		Возврат;
	КонецЕсли;
	
	Основание = Новый Структура("Основание,Команда",ТекущееВзаимодействие, "ОтветитьВсем");
	ПараметрыОткрытия = Новый Структура("Основание", Основание);
	ОткрытьФорму("Документ.ЭлектронноеПисьмоИсходящее.ФормаОбъекта", ПараметрыОткрытия);
	
КонецПроцедуры

&НаКлиенте
Процедура Переслать(Команда)
	
	Если ВыборКорректен(Элементы.Список.Имя, Истина) Тогда
		ТекущееВзаимодействие = Элементы.Список.ТекущиеДанные.Ссылка;
		Если ТипЗнч(ТекущееВзаимодействие) <> Тип("ДокументСсылка.ЭлектронноеПисьмоИсходящее") 
			И ТипЗнч(ТекущееВзаимодействие) <> Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее") Тогда
			ПоказатьПредупреждение(, НСтр("ru = 'Команда ""Переслать"" может быть выполнена только для писем.'"));
			Возврат;
		КонецЕсли;
	Иначе
		Возврат;
	КонецЕсли;
	
	Основание = Новый Структура("Основание,Команда", ТекущееВзаимодействие, "Переслать");
	ПараметрыОткрытия = Новый Структура("Основание", Основание);
	ОткрытьФорму("Документ.ЭлектронноеПисьмоИсходящее.ФормаОбъекта", ПараметрыОткрытия);

КонецПроцедуры

&НаКлиенте
Процедура ПереключитьПанельНавигации(Команда)
	
	ПереключитьПанельНавигацииСервер(Команда.Имя);
	ВосстановитьРаскрытыеУзлыДерева();
	
КонецПроцедуры 

&НаКлиенте
Процедура УстановитьВариантНавигацииПоКонтакту(Команда)
	
	ПереключитьПанельНавигации(Команда);
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьВариантНавигацииПоПредмету(Команда)
	
	ПереключитьПанельНавигации(Команда);
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьВариантНавигацииПоЗакладкам(Команда)
	
	ПереключитьПанельНавигации(Команда);
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьВариантНавигацииПоПапкам(Команда)
	
	ПереключитьПанельНавигации(Команда);
	
КонецПроцедуры

&НаКлиенте
Процедура ОтветственныйВыполнить(Команда)
	
	КонтекстВыбора = "ОтветственныйВыполнить";
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("РежимВыбора",Истина);	
	ОткрытьФорму("Справочник.Пользователи.ФормаСписка", ПараметрыФормы, ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ОтветственныйСписок(Команда)
	
	ИмяТекущегоЭлемента = Элементы.Список.Имя;
	Если СтрНачинаетсяС(ИмяТекущегоЭлемента, "Список") И Не ВыборКорректен(ИмяТекущегоЭлемента) Тогда
		Возврат;
	КонецЕсли;
	
	КонтекстВыбора = "ОтветственныйСписок";
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("РежимВыбора",Истина);	
	ОткрытьФорму("Справочник.Пользователи.ФормаСписка", ПараметрыФормы, ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура РассмотреноВыполнить(Команда)
	
	УстановитьФлагРассмотрено(Неопределено,Истина);
	ВосстановитьРаскрытыеУзлыДерева();

КонецПроцедуры

&НаКлиенте
Процедура УстановитьПризнакРассмотрено(Команда)
	
	РассмотреноВыполнитьСписок(Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ВзаимодействияПоПредмету(Команда)
	
	ИмяТекущегоЭлемента = Элементы.Список.Имя;
	Если Не ВыборКорректен(ИмяТекущегоЭлемента, Истина) Тогда
		Возврат;
	КонецЕсли;
	
	Предмет = Элементы[ИмяТекущегоЭлемента].ТекущиеДанные.Предмет;
	
	СтруктураОтбора = Новый Структура;
	СтруктураОтбора.Вставить("Предмет", Предмет);
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Отбор", СтруктураОтбора);
	ПараметрыФормы.Вставить("ТипВзаимодействия", "");
	
	Если ВзаимодействияКлиентСервер.ЯвляетсяПредметом(Предмет) Тогда
		ПараметрыФормы.ТипВзаимодействия = "Предмет";
	ИначеЕсли ВзаимодействияКлиентСервер.ЯвляетсяВзаимодействием(Предмет) Тогда
		ПараметрыФормы.ТипВзаимодействия = "Взаимодействие";
	Иначе
		Возврат;
	КонецЕсли;

	ОткрытьФорму("ЖурналДокументов.Взаимодействия.Форма.ФормаСпискаПараметрическая",
		ПараметрыФормы, ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура СнятьПризнакРассмотрено(Команда)
	
	РассмотреноВыполнитьСписок(Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура РассмотреноВыполнитьСписок(ЗначенияПризнака)
	
	ИмяТекущегоЭлемента = Элементы.Список.Имя;
	Если Не ВыборКорректен(ИмяТекущегоЭлемента) Тогда
		Возврат;
	КонецЕсли;
	
	УстановитьФлагРассмотрено(Элементы[ИмяТекущегоЭлемента].ВыделенныеСтроки, ЗначенияПризнака);
	ВосстановитьРаскрытыеУзлыДерева();
	
КонецПроцедуры

&НаКлиенте
Процедура ПредметВыполнить(Команда)
	
	КонтекстВыбора = "ПредметВыполнитьТипПредмета";
	ОткрытьФорму("ЖурналДокументов.Взаимодействия.Форма.ВыборТипаПредмета",,ЭтотОбъект);

КонецПроцедуры

&НаКлиенте
Процедура ПредметСписок(Команда)
	
	ИмяТекущегоЭлемента = Элементы.Список.Имя;
	Если Не ВыборКорректен(ИмяТекущегоЭлемента) Тогда
		Возврат;
	КонецЕсли;
	
	КонтекстВыбора = "ПредметСписокТипПредмета";
	ОткрытьФорму("ЖурналДокументов.Взаимодействия.Форма.ВыборТипаПредмета",,ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьВЗакладки(Команда)
	
	ИмяТекущегоЭлемента = ТекущийЭлемент.Имя;
	Если СтрНачинаетсяС(ИмяТекущегоЭлемента, "Список") И Не ВыборКорректен(ИмяТекущегоЭлемента) Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Не выбран элемент для добавления в закладки.'"));
		Возврат;
	КонецЕсли;
	
	ЭлементДляДобавления = Неопределено;
	Если СтрНачинаетсяС(ИмяТекущегоЭлемента, "Список") Тогда
		ЭлементДляДобавления = Элементы[ИмяТекущегоЭлемента].ВыделенныеСтроки;
	ИначеЕсли ИмяТекущегоЭлемента = "Свойства" Или ИмяТекущегоЭлемента = "Категории" Или ИмяТекущегоЭлемента = "Папки" Тогда
		ТекущиеДанные = Элементы[ИмяТекущегоЭлемента].ТекущиеДанные;
		Если ТекущиеДанные <> Неопределено Тогда
			ЭлементДляДобавления = Новый Структура("Значение", ТекущиеДанные.Значение);
		КонецЕсли;
	ИначеЕсли ИмяТекущегоЭлемента = "ПредметыПанельНавигации" Тогда
		ТекущиеДанные = Элементы.ПредметыПанельНавигации.ТекущиеДанные;
		Если ТекущиеДанные <> Неопределено Тогда
			ЭлементДляДобавления = Новый Структура("Значение", ТекущиеДанные.Предмет);
		КонецЕсли;
	ИначеЕсли ИмяТекущегоЭлемента = "КонтактыПанелиНавигации" Тогда
		ТекущиеДанные = Элементы.КонтактыПанелиНавигации.ТекущиеДанные;
		Если ТекущиеДанные <> Неопределено Тогда
			ЭлементДляДобавления = Новый Структура("Значение", ТекущиеДанные.Контакт);
		КонецЕсли;
	Иначе
		ТекущиеДанные = Элементы[ИмяТекущегоЭлемента].ТекущиеДанные;
		Если ТекущиеДанные <> Неопределено Тогда
			ЭлементДляДобавления = Новый Структура("Значение,ОписаниеТипов", ТекущиеДанные.Значение, ТекущиеДанные.ОписаниеТипов);
		КонецЕсли;
	КонецЕсли;
	
	Если ЭлементДляДобавления = Неопределено Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Не выбран элемент для добавления в закладки.'"));
		Возврат;
	КонецЕсли;
	
	Результат = ДобавитьВЗакладкиСервер(ЭлементДляДобавления, ИмяТекущегоЭлемента);
	Если Не Результат.ЭлементДобавлен Тогда
		ПоказатьПредупреждение(, Результат.ТекстСообщенияОшибка);
		Возврат;
	КонецЕсли;
	ПоказатьОповещениеПользователя(НСтр("ru = 'Добавлены в закладки:'"),
		Результат.НавигационнаяСсылкаЭлемента, Результат.ПредставлениеЭлемента, БиблиотекаКартинок.ДиалогИнформация);
	
КонецПроцедуры

&НаКлиенте
Процедура ОтложитьРассмотрениеВыполнить(Команда)
	
	ИмяТекущегоЭлемента = ТекущийЭлемент.Имя;
	Если СтрНачинаетсяС(ИмяТекущегоЭлемента, "Список") И Не ВыборКорректен(ИмяТекущегоЭлемента) Тогда
		Возврат;
	КонецЕсли;
	
	ДатаОтработки = ОбщегоНазначенияКлиент.ДатаСеанса();
	
	ДополнительныеПараметры = Новый Структура("ИмяТекущегоЭлемента", Неопределено);
	ОбработчикОповещенияОЗакрытии = Новый ОписаниеОповещения("ВыборДатыОтработкиПриЗавершении", ЭтотОбъект, ДополнительныеПараметры);
	ПоказатьВводДаты(ОбработчикОповещенияОЗакрытии, ДатаОтработки, НСтр("ru = 'Отработать после'"), ЧастиДаты.ДатаВремя);
	
КонецПроцедуры

&НаКлиенте
Процедура ОтложитьРассмотрениеСписок(Команда)
	
	ИмяТекущегоЭлемента = Элементы.Список.Имя;
	Если Не ВыборКорректен(ИмяТекущегоЭлемента) Тогда
		Возврат;
	КонецЕсли;
	
	ДатаОтработки = ОбщегоНазначенияКлиент.ДатаСеанса();
	
	ДополнительныеПараметры = Новый Структура("ИмяТекущегоЭлемента", ИмяТекущегоЭлемента);
	ОбработчикОповещенияОЗакрытии = Новый ОписаниеОповещения("ВыборДатыОтработкиПриЗавершении", ЭтотОбъект, ДополнительныеПараметры);
	ПоказатьВводДаты(ОбработчикОповещенияОЗакрытии, ДатаОтработки, НСтр("ru = 'Отработать после'"), ЧастиДаты.ДатаВремя);

КонецПроцедуры

&НаКлиенте
Процедура СоздатьВстречу(Команда)
	
	СоздатьНовоеВзаимодействие("Встреча");
	
КонецПроцедуры

&НаКлиенте
Процедура СоздатьЗапланированноеВзаимодействие(Команда)
	
	СоздатьНовоеВзаимодействие("ЗапланированноеВзаимодействие");
	
КонецПроцедуры

&НаКлиенте
Процедура СоздатьТелефонныйЗвонок(Команда)
	
	СоздатьНовоеВзаимодействие("ТелефонныйЗвонок");
	
КонецПроцедуры

&НаКлиенте
Процедура СоздатьЭлектронноеПисьмо(Команда)
	
	ОписаниеОповещения = Новый ОписаниеОповещения("СоздатьЭлектронноеПисьмоПродолжение", ЭтотОбъект, );
	РаботаСПочтовымиСообщениямиКлиент.ПроверитьНаличиеУчетнойЗаписиДляОтправкиПочты(ОписаниеОповещения);
	
КонецПроцедуры

&НаКлиенте
Процедура СоздатьЭлектронноеПисьмоПродолжение(ПроверкаВыполнена, ДополнительныеПараметры) Экспорт
	
	Если ПроверкаВыполнена = Истина Тогда
		СоздатьНовоеВзаимодействие("ЭлектронноеПисьмоИсходящее");
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СоздатьСообщениеSMS(Команда)
	
	СоздатьНовоеВзаимодействие("СообщениеSMS");
	
КонецПроцедуры

&НаКлиенте
Процедура ПрименитьПравилаОбработки(Команда)

	ТекущиеДанные = Элементы.Папки.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ТекущиеДанные.ЕстьПравоНаИзменение = 0 
		ИЛИ ТипЗнч(ТекущиеДанные.Значение) = Тип("СправочникСсылка.УчетныеЗаписиЭлектроннойПочты") Тогда
		Возврат;
	КонецЕсли;
		
	СтруктураПараметры = Новый Структура;
	СтруктураПараметры.Вставить("УчетнаяЗапись", ТекущиеДанные.УчетнаяЗапись);
	СтруктураПараметры.Вставить("ДляПисемВПапке", ТекущиеДанные.Значение);
	
	ОткрытьФорму("Справочник.ПравилаОбработкиЭлектроннойПочты.Форма.ПрименениеПравил", СтруктураПараметры);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ИзменитьЗначениеПанелиНавигации(Команда)
	
	Элемент = ТекущийЭлементСписокПанелиНавигации();
	Если Элемент = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекущиеДанные = Элемент.ТекущиеДанные;
	Если ТекущиеДанные <> Неопределено Тогда
		
		ПоказываемоеЗначение = Неопределено;
		Если ТекущиеДанные.Свойство("Контакт") И ТипЗнч(ТекущиеДанные.Контакт) <> Тип("СправочникСсылка.СтроковыеКонтактыВзаимодействий") Тогда
			ПоказываемоеЗначение = ТекущиеДанные.Контакт;
		ИначеЕсли ТекущиеДанные.Свойство("Предмет") Тогда
			ПоказываемоеЗначение = ТекущиеДанные.Предмет;
		ИначеЕсли ТекущиеДанные.Свойство("Значение") И ТипЗнч(ТекущиеДанные.Значение) <> Тип("Строка") Тогда
			ПоказываемоеЗначение = ТекущиеДанные.Значение;
		КонецЕсли;
		
		Если ПоказываемоеЗначение <> Неопределено Тогда
			ПоказатьЗначение(, ПоказываемоеЗначение);
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ТолькоАктивныеПредметы(Команда)
	
	ПоказыватьВсеАктивныеПредметы = Не ПоказыватьВсеАктивныеПредметы;
	ЗаполнитьПанельПредметов();
	
КонецПроцедуры

&НаКлиенте
Процедура ОтображатьОбластьЧтения(Команда)
	
	ОтображатьОбластьЧтения = Не ОтображатьОбластьЧтения;
	СписокПриАктивизацииСтроки(Элементы.Список);
	УправлениеВидимостьюПриПереключенииПанелиНавигации();
	
КонецПроцедуры

// Изменяет отбор по статусу взаимодействия в списке.
// 
// Параметры:
//  Команда - КомандаФормы - выполняемая команда.
//
&НаКлиенте
Процедура Подключаемый_ИзменитьОтборСтатус(Команда)
	
	ИзменитьОтборСтатусСервер(Команда.Имя);	
	ВосстановитьРаскрытыеУзлыДерева();
	
КонецПроцедуры

// Изменяет отбор по типу взаимодействия в списке.
// 
// Параметры:
//  Команда - КомандаФормы - выполняемая команда.
//
&НаКлиенте
Процедура Подключаемый_ИзменитьОтборТипВзаимодействия(Команда)

	ИзменитьОтборТипВзаимодействияСервер(Команда.Имя);
	ВосстановитьРаскрытыеУзлыДерева();

КонецПроцедуры

&НаКлиенте
Процедура ИзменитьОтображениеПанелиНавигации(Команда)
	
	ПанельНавигацииСкрыта = Не ПанельНавигацииСкрыта;
	УправлениеВидимостьюПриПереключенииПанелиНавигации();
	
КонецПроцедуры

&НаКлиенте
Процедура ПереслатьКакВложение(Команда)
	
	ОчиститьСообщения();
	
	Если НЕ ВыборКорректен("Список", Истина) Тогда
		Возврат;
	КонецЕсли;
	
	ТекущиеДанные = Элементы.Список.ТекущиеДанные;
	
	Если ТекущиеДанные.Тип = Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее")
		Или (ТекущиеДанные.Тип = Тип("ДокументСсылка.ЭлектронноеПисьмоИсходящее")
		    И ТекущиеДанные.СтатусИсходящегоПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Отправлено")) Тогда
		
		Основание = Новый Структура("Основание,Команда",ТекущиеДанные.Ссылка, "ПереслатьКакВложение");
		ПараметрыОткрытия = Новый Структура("Основание", Основание);
		ОткрытьФорму("Документ.ЭлектронноеПисьмоИсходящее.ФормаОбъекта", ПараметрыОткрытия);
	
	Иначе
		
		ТекстСообщения = НСтр("ru = 'Пересылать как вложения можно только отправленные и полученные письма.'");
		ПоказатьПредупреждение(, ТекстСообщения); 
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();
	ПредметыПанельНавигации.УсловноеОформление.Элементы.Очистить();
	КонтактыПанельНавигации.УсловноеОформление.Элементы.Очистить();

	СтандартныеПодсистемыСервер.УстановитьУсловноеОформлениеПоляДата(ЭтотОбъект, "Список.Дата", Элементы.Дата.Имя);
	СтандартныеПодсистемыСервер.УстановитьУсловноеОформлениеПоляДата(ЭтотОбъект, "Список.ПолученоОтправлено", Элементы.ПолученоОтправлено.Имя);

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Свойства.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Свойства.НеРассмотрено");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
	ОтборЭлемента.ПравоеЗначение = 0;

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ИспользоватьПризнакРассмотрено");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;

	Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", Метаданные.ЭлементыСтиля.ОсновнойЭлементСписка.Значение);
	
	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Папки.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Папки.НеРассмотрено");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
	ОтборЭлемента.ПравоеЗначение = 0;

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ИспользоватьПризнакРассмотрено");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;

	Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", Метаданные.ЭлементыСтиля.ОсновнойЭлементСписка.Значение);

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Категории.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Категории.НеРассмотрено");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
	ОтборЭлемента.ПравоеЗначение = 0;

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ИспользоватьПризнакРассмотрено");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;

	Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", Метаданные.ЭлементыСтиля.ОсновнойЭлементСписка.Значение);

	//

	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Список.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.Рассмотрено");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ИспользоватьПризнакРассмотрено");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;

	Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", Метаданные.ЭлементыСтиля.ОсновнойЭлементСписка.Значение);

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СтрокаПоиска.Имя);

	ГруппаОтбора1 = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаОтбора1.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;

	ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СтрокаПоиска");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = "";
	
	ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("РасширенныйПоиск");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветаСтиля.ЦветФонаПоля);
	
#Область РассмотреноКонтакты

	Элемент = КонтактыПанельНавигации.УсловноеОформление.Элементы.Добавить();
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("Контакт");
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("КоличествоНеРассмотрено");

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КоличествоНеРассмотрено");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
	ОтборЭлемента.ПравоеЗначение = 0;

	Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", Метаданные.ЭлементыСтиля.ОсновнойЭлементСписка.Значение);
	
#КонецОбласти

#Область РассмотреноПредметы

	Элемент = ПредметыПанельНавигации.УсловноеОформление.Элементы.Добавить();
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("Предмет");
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("КоличествоНеРассмотрено");

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КоличествоНеРассмотрено");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
	ОтборЭлемента.ПравоеЗначение = 0;

	Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", Метаданные.ЭлементыСтиля.ОсновнойЭлементСписка.Значение);

#КонецОбласти
	
КонецПроцедуры

#Область ОбработкаИзмененияБыстрыхОтборов

&НаСервере
Процедура ИзменитьОтборТипВзаимодействияСервер(Знач ИмяКоманды)

	ТипВзаимодействия = Взаимодействия.ТипВзаимодействияПоИмениКоманды(ИмяКоманды, ТолькоПочта);
	ПриИзмененииТипаСервер();

КонецПроцедуры

&НаСервере
Процедура ПриИзмененииСтатусаСервер(Знач ОбновлятьПанельНавигации)
	
	ДатаДляОтбора = ТекущаяДатаСеанса();
	ВзаимодействияКлиентСервер.БыстрыйОтборСписокПриИзменении(ЭтотОбъект, "Статус", ДатаДляОтбора);
	
	ШаблонЗаголовка = НСтр("ru = 'Статус: %1'");
	НайденныйСтатус = Взаимодействия.СписокСтатусов().НайтиПоЗначению(Статус);
	Если НайденныйСтатус = Неопределено Тогда
		Статус = "Все";
		ПредставлениеСтатуса = НСтр("ru = 'Все'");
	Иначе
		ПредставлениеСтатуса = НайденныйСтатус.Представление;
	КонецЕсли;
	Элементы.СписокСтатус.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗаголовка, ПредставлениеСтатуса);
	Для Каждого ЭлементПодменю Из Элементы.СписокСтатус.ПодчиненныеЭлементы Цикл
		Если ЭлементПодменю.Имя = ("УстановитьОтборСтатус_" + Статус) Тогда
			ЭлементПодменю.Пометка = Истина;
		Иначе
			ЭлементПодменю.Пометка = Ложь;
		КонецЕсли;
	КонецЦикла;
	
	Если ОбновлятьПанельНавигации Тогда
		ОбновитьПанельНавигации();
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ИзменитьОтборСтатусСервер(Знач ИмяКоманды)
	Статус = СтатусПоИмениКоманды(ИмяКоманды);
	ПриИзмененииСтатусаСервер(Истина);
КонецПроцедуры

&НаСервере
Функция СтатусПоИмениКоманды(ИмяКоманды)
	
	НайденнаяПозиция = СтрНайти(ИмяКоманды, "_");
	Если НайденнаяПозиция = 0 Тогда
		Возврат "Все";
	КонецЕсли;
	
	СтрокаСтатус = Прав(ИмяКоманды, СтрДлина(ИмяКоманды) - НайденнаяПозиция);
	Если Взаимодействия.СписокСтатусов().НайтиПоЗначению(СтрокаСтатус) = Неопределено Тогда
		Возврат "Все";
	КонецЕсли;
	
	Возврат СтрокаСтатус;
	
КонецФункции

&НаСервере
Процедура ПриИзмененииОтветственногоСервер(Знач ОбновлятьПанельНавигации)

	ВзаимодействияКлиентСервер.БыстрыйОтборСписокПриИзменении(ЭтотОбъект,"Ответственный");

	Если ОбновлятьПанельНавигации Тогда
		ОбновитьПанельНавигации();
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПриИзмененииТипаСервер(ОбновлятьПанельНавигации = Истина)
	
	Взаимодействия.ОбработатьПодменюОтборПоТипуВзаимодействий(ЭтотОбъект);
	
	ВзаимодействияКлиентСервер.ПриИзмененииОтбораТипВзаимодействий(ЭтотОбъект, ТипВзаимодействия);
	Если ОбновлятьПанельНавигации Тогда
		ОбновитьПанельНавигации();
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработкаАктивизацииСтрокСписковИПанелиНавигации

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

&НаКлиенте
Процедура ОбработатьАктивизациюСтрокиПанелиНавигации();
	
	Если ПанельНавигацииСкрыта Тогда
		Возврат;
	КонецЕсли;
	
	Если Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаКонтакт Тогда
		ТекущиеДанные = Элементы.КонтактыПанелиНавигации.ТекущиеДанные;
		Если ТекущиеДанные <> Неопределено Тогда
			
			Если ТекущиеДанные.Контакт = ТекущееЗначениеПанелиНавигации Тогда
				Возврат;
			Иначе
				ТекущееЗначениеПанелиНавигации = ТекущиеДанные.Контакт; 
			КонецЕсли;
			
			ИзменитьОтборСписок("Контакты",Новый Структура("Значение,ОписаниеТипов",
			                    ТекущиеДанные.Контакт, Неопределено));
			СохранитьТекущееАктивноеЗначениеВНастройках("Контакты",ТекущиеДанные.Контакт);
			
		КонецЕсли;
	ИначеЕсли Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаПредмет Тогда
		
		ТекущиеДанные = Элементы.ПредметыПанельНавигации.ТекущиеДанные;
		Если ТекущиеДанные <> Неопределено Тогда
			
			Если ТекущиеДанные.Предмет = ТекущееЗначениеПанелиНавигации Тогда
				Возврат;
			Иначе 
			
				ОчиститьПредпросмотр();

				ТекущееЗначениеПанелиНавигации = ТекущиеДанные.Предмет;
				
			КонецЕсли;
			
			ИзменитьОтборСписок("Предметы",Новый Структура("Значение,ОписаниеТипов",
			                    ТекущиеДанные.Предмет, Неопределено));
			СохранитьТекущееАктивноеЗначениеВНастройках("Предметы", ТекущиеДанные.Предмет);
			
			ТекущиеДанные = Элементы.ПредметыПанельНавигации.ТекущиеДанные;
			Если ТекущиеДанные = Неопределено
				Или ТекущиеДанные.Предмет <> ТекущееЗначениеПанелиНавигации Тогда
				
				Элементы.ПредметыПанельНавигации.ТекущаяСтрока = ТекущееЗначениеПанелиНавигации;
				
			КонецЕсли;
			
		Иначе
			ИзменитьОтборСписок("Предметы",Новый Структура("Значение,ОписаниеТипов",
			                    Неопределено, Неопределено));
		КонецЕсли;
		
	ИначеЕсли Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаПапки Тогда

		ТекущиеДанные = Элементы.Папки.ТекущиеДанные;
		Если ТекущиеДанные <> Неопределено Тогда
			ИзменитьОтборСписок("Папки",Новый Структура("Значение,УчетнаяЗапись",
			                    ТекущиеДанные.Значение, ТекущиеДанные.УчетнаяЗапись));
			СохранитьТекущееАктивноеЗначениеВНастройках("Папки", ТекущиеДанные.Значение);
		КонецЕсли;
	
	ИначеЕсли Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаЗакладки Тогда
		ТекущиеДанные = Элементы.Закладки.ТекущиеДанные;
		Если ТекущиеДанные <> Неопределено И НЕ ТекущиеДанные.ЭтоГруппа Тогда
			ИзменитьОтборСписок("Закладки",Новый Структура("Значение", ТекущиеДанные.Ссылка));
			СохранитьТекущееАктивноеЗначениеВНастройках("Закладки", ТекущиеДанные.Ссылка);
		Иначе
			СоздатьГруппуОтбораПанелиНавигации();
		КонецЕсли;
	ИначеЕсли Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаСвойства Тогда
		ТекущиеДанные = Элементы.Свойства.ТекущиеДанные;
		
		Если ТекущиеДанные <> Неопределено Тогда
			
			ИзменитьОтборСписок("Свойства", Новый Структура("Значение", ТекущиеДанные.Значение));
			СохранитьТекущееАктивноеЗначениеВНастройках("Свойства", ТекущиеДанные.Значение);
			
		КонецЕсли;
		
	ИначеЕсли Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаКатегории Тогда
		ТекущиеДанные = Элементы.Категории.ТекущиеДанные;
		Если ТекущиеДанные <> Неопределено Тогда
			ИзменитьОтборСписок("Категории",Новый Структура("Значение", ТекущиеДанные.Значение));
			СохранитьТекущееАктивноеЗначениеВНастройках("Категории", ТекущиеДанные.Значение);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СохранитьТекущееАктивноеЗначениеВНастройках(ИмяДерева, Значение)

	Если ИмяДерева = "Свойства" Тогда
		ИмяДерева  = "Свойства_" + Строка(ТекущееСвойствоПанелиНавигации);
	КонецЕсли;
	
	НайденныеСтроки =  НастройкиДеревьевПанелиНавигации.НайтиСтроки(Новый Структура("ИмяДерева",ИмяДерева));
	Если НайденныеСтроки.Количество() = 1 Тогда
		СтрокаДереваНастроек = НайденныеСтроки[0];
	ИначеЕсли НайденныеСтроки.Количество() > 1 Тогда
		СтрокаДереваНастроек = НайденныеСтроки[0];
		Для Инд = 1 По НайденныеСтроки.Количество()-1 Цикл
			НастройкиДеревьевПанелиНавигации.Удалить(НайденныеСтроки[инд]);
		КонецЦикла;
	Иначе
		СтрокаДереваНастроек = НастройкиДеревьевПанелиНавигации.Добавить();
		СтрокаДереваНастроек.ИмяДерева = ИмяДерева;
	КонецЕсли;
	
	СтрокаДереваНастроек.ТекущееЗначение = Значение;

КонецПроцедуры 

&НаСервере
Функция СоздатьГруппуОтбораПанелиНавигации()

	Возврат ОбщегоНазначенияКлиентСервер.СоздатьГруппуЭлементовОтбора(
	                    ВзаимодействияКлиентСервер.ОтборДинамическогоСписка(Список).Элементы,
	                    "ОтборПанелиНавигации",
	                    ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ);

КонецФункции

&НаСервере
Процедура ИзменитьОтборСписок(ИмяТаблицы, ДанныеДляОбработки)
	
	Если ИмяТаблицы = "Предметы" Или ИмяТаблицы = "Контакты" Или ИмяТаблицы = "Закладки" Тогда
		ТекстЗапросаДинамическогоСписка = Взаимодействия.ТекстЗапросаСпискаВзаимодействий(ДанныеДляОбработки.Значение);
	Иначе
		ТекстЗапросаДинамическогоСписка = Взаимодействия.ТекстЗапросаСпискаВзаимодействий();
	КонецЕсли;
	
	СвойстваСписка = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка();
	СвойстваСписка.ТекстЗапроса = ТекстЗапросаДинамическогоСписка;
	ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.Список, СвойстваСписка);
	
	ГруппаОтбора = СоздатьГруппуОтбораПанелиНавигации();
	
	Если ДанныеДляОбработки.Значение = "ВсеЗначения" Тогда // См. ДобавитьСтрокуВсе
		ВзаимодействияКлиентСервер.ОтборДинамическогоСписка(Список).Элементы.Удалить(ГруппаОтбора);
		Возврат;
	КонецЕсли;
	
	ШаблонЗаголовка = "%1 (%2)";
	
	Если ИмяТаблицы = "Предметы" Тогда
		
		ИмяПоля                    = "Предмет";
		ВидСравненияЭлементаОтбора = ВидСравненияКомпоновкиДанных.Равно;
		ПравоеЗначение             = ДанныеДляОбработки.Значение;
		ИмяОтбора = НСтр("ru = 'Предмет'");
		ЗначениеОтбора = ДанныеДляОбработки.Значение;
		
	ИначеЕсли ИмяТаблицы = "Папки" Тогда
		
			ИмяПоля                    = "Тип";
			ВидСравненияЭлементаОтбора = ВидСравненияКомпоновкиДанных.ВСписке;
			СписокТипов = Новый СписокЗначений;
			СписокТипов.Добавить(Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее"));
			СписокТипов.Добавить(Тип("ДокументСсылка.ЭлектронноеПисьмоИсходящее"));
			ПравоеЗначение             = СписокТипов;
			
			ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ГруппаОтбора, ИмяПоля,
			                                                       ВидСравненияЭлементаОтбора, ПравоеЗначение);
			
			ЗначениеОтбора = ДанныеДляОбработки.Значение;
			
			Если ТипЗнч(ДанныеДляОбработки.Значение) = Тип("СправочникСсылка.ПапкиЭлектронныхПисем") Тогда
				
				ИмяПоля                    = "Папка";
				ВидСравненияЭлементаОтбора = ВидСравненияКомпоновкиДанных.Равно;
				ПравоеЗначение             = ДанныеДляОбработки.Значение;
				ИмяОтбора = НСтр("ru = 'Папка'");
				
			Иначе
				
				ИмяПоля                    = "УчетнаяЗапись";
				ВидСравненияЭлементаОтбора = ВидСравненияКомпоновкиДанных.Равно;
				ПравоеЗначение             = ДанныеДляОбработки.Значение;
				ИмяОтбора = НСтр("ru = 'Почта'");
				
			КонецЕсли;
		
	ИначеЕсли ИмяТаблицы = "Контакты" Тогда
		
		ИмяПоля                    = "Контакт";
		ВидСравненияЭлементаОтбора = ВидСравненияКомпоновкиДанных.Равно;
		ПравоеЗначение             = ДанныеДляОбработки.Значение;
		ИмяОтбора = НСтр("ru = 'Контакт'");
		ЗначениеОтбора = ДанныеДляОбработки.Значение;
		
	ИначеЕсли ИмяТаблицы = "Свойства" Тогда
		
		ИмяПоля = "Ссылка.[" + Строка(ТекущееСвойствоПанелиНавигации) + "]";
		ИмяОтбора = Строка(ТекущееСвойствоПанелиНавигации);
		Если ТипЗнч(ДанныеДляОбработки.Значение) = Тип("Строка") 
			И ДанныеДляОбработки.Значение = "НеУказан" Тогда
			
			ВидСравненияЭлементаОтбора = ВидСравненияКомпоновкиДанных.НеЗаполнено;
			ПравоеЗначение             = "";
			ЗначениеОтбора = НСтр("ru = 'Не указан'");
			
		Иначе
			
			ВидСравненияЭлементаОтбора = ВидСравненияКомпоновкиДанных.Равно;
			ПравоеЗначение             = ДанныеДляОбработки.Значение;
			ЗначениеОтбора = ДанныеДляОбработки.Значение;
			
		КонецЕсли;
		
	ИначеЕсли ИмяТаблицы = "Категории" Тогда
		
		ИмяПоля =  "Ссылка.[" + Строка(ДанныеДляОбработки.Значение) + "]";
		ВидСравненияЭлементаОтбора = ВидСравненияКомпоновкиДанных.Равно;
		ПравоеЗначение             = Истина;
		ИмяОтбора      = НСтр("ru = 'Категория'");
		ЗначениеОтбора = Строка(ДанныеДляОбработки.Значение);
		
	ИначеЕсли ИмяТаблицы = "Закладки" Тогда
		
		НастройкаКомпоновки = ДанныеДляОбработки.Значение.КомпоновщикНастроек.Получить();
		Если НастройкаКомпоновки = Неопределено Тогда
			Возврат;
		КонецЕсли;
		СхемаКомпоновки = ЖурналыДокументов.Взаимодействия.ПолучитьМакет("СхемаОтборВзаимодействия");
		АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновки ,УникальныйИдентификатор);
		КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
		КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
		
		КомпоновщикНастроек.ЗагрузитьНастройки(НастройкаКомпоновки);
		КомпоновщикНастроек.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.ПроверятьДоступность);
		
		СкопироватьОтбор(ГруппаОтбора,КомпоновщикНастроек.Настройки.Отбор);
		ЗаголовокПанелиНавигации   = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			ШаблонЗаголовка, НСтр("ru = 'Закладка'"), ДанныеДляОбработки.Значение);
		
		Возврат;
		
	Иначе
		
		ЗаголовокПанелиНавигации = "";
		Возврат;
		
	КонецЕсли;
	
	ЗаголовокПанелиНавигацииПодсказка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗаголовка, 
		ЗначениеОтбора, ИмяОтбора);
	ЗаголовокПанелиНавигации = ЗначениеОтбора;
	Если СтрДлина(ЗаголовокПанелиНавигации) > 30 Тогда
		ЗаголовокПанелиНавигации = Лев(ЗаголовокПанелиНавигации, 27) + "...";
	КонецЕсли;
	ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ГруппаОтбора, ИмяПоля, 
		ВидСравненияЭлементаОтбора, ПравоеЗначение);
	
КонецПроцедуры

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

#КонецОбласти

#Область ПереключениеИЗаполнениеПанелейНавигации

&НаСервере
Процедура ПереключитьПанельНавигацииСервер(ИмяКоманды)
	
	Если ИмяКоманды = "УстановитьВариантНавигацииПоКонтакту" Тогда
		ЗаполнитьПанельКонтактов();
		Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаКонтакт;
	ИначеЕсли ИмяКоманды = "УстановитьВариантНавигацииПоПредмету" Тогда
		ЗаполнитьПанельПредметов();
		Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаПредмет;
	ИначеЕсли ИмяКоманды = "УстановитьВариантНавигацииПоПапкам" Тогда
		ЗаполнитьДеревоПапок();
		Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаПапки;
	ИначеЕсли ИмяКоманды = "УстановитьВариантНавигацииПоЗакладкам" Тогда
		Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаЗакладки;
	ИначеЕсли ИмяКоманды = "УстановитьВариантПоКатегориям" Тогда
		ЗаполнитьТаблицуКатегорий();
		Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаКатегории;
	ИначеЕсли СтрНайти(ИмяКоманды,"УстановитьВариантПоСвойству") > 0 Тогда
		ЗаполнитьДеревоСвойств(ИмяКоманды);
		Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаСвойства;
	КонецЕсли;
	
	ПанельНавигацииСкрыта = Ложь;
	ИмяТекущейПанелиНавигации = Элементы.СтраницыПанелиНавигации.ТекущаяСтраница.Имя;
	УправлениеВидимостьюПриПереключенииПанелиНавигации();
	ПослеЗаполненияПанелиНавигации();

КонецПроцедуры

&НаСервере
Процедура УправлениеВидимостьюПриПереключенииПанелиНавигации()
	
	ТекущаяСтраницаПанелиНавигации = Элементы.СтраницыПанелиНавигации.ТекущаяСтраница;
	ЭтоПапки    = (ТекущаяСтраницаПанелиНавигации = Элементы.СтраницаПапки);
	
	Элементы.СписокКонтекстноеМенюПеренестиВПапку.Видимость          = ЭтоПапки;
	Элементы.ПолученоОтправлено.Видимость                            = ЭтоПапки;
	Элементы.Размер.Видимость                                        = ЭтоПапки;
	Элементы.СписокСоздатьЭлектронноеПисьмоОтдельнаяКнопка.Видимость = ЭтоПапки Или ТолькоПочта;
	Элементы.СписокОтветить.Видимость                                = ЭтоПапки Или ТолькоПочта;
	Элементы.СписокОтветитьВсем.Видимость                            = ЭтоПапки Или ТолькоПочта;
	Элементы.СписокПереслать.Видимость                               = ЭтоПапки Или ТолькоПочта;
	Элементы.СписокОтправитьПолучитьПочту.Видимость                  = (ЭтоПапки Или ТолькоПочта)
	                                                                   И (ИнформационнаяБазаФайловая Или РазделениеВключено);
	
	Элементы.Дата.Видимость                              = НЕ ЭтоПапки;
	Элементы.ГруппаСоздать.Видимость                     = НЕ ЭтоПапки И НЕ ТолькоПочта;
	Элементы.СписокКонтекстноеМенюСкопировать.Видимость  = Не ЭтоПапки И Не ТолькоПочта;
	Элементы.Скопировать.Видимость                       = Не ЭтоПапки И Не ТолькоПочта;
	
	Элементы.СтраницыПредпросмотр.Видимость              = ОтображатьОбластьЧтения;
	Элементы.СписокОтображатьОбластьЧтения.Пометка       = ОтображатьОбластьЧтения;
	
	Элементы.СписокТипВзаимодействия.Видимость =         Не ЭтоПапки;
	Если ЭтоПапки Тогда
		ТипВзаимодействия = "Все";
		ПриИзмененииТипаСервер(Ложь);		
	КонецЕсли;	
	
	Элементы.ГруппаПанельНавигации.Видимость             = НЕ ПанельНавигацииСкрыта;
	
	КомандаИзменитьОтображениеПанелиНавигации = Команды.Найти("ИзменитьОтображениеПанелиНавигации");
	Если ПанельНавигацииСкрыта Тогда
		Элементы.ИзменитьОтображениеПанелиНавигации.Картинка = БиблиотекаКартинок.СтрелкаВправо;
		КомандаИзменитьОтображениеПанелиНавигации.Подсказка = НСтр("ru = 'Показать панель навигации'");
		КомандаИзменитьОтображениеПанелиНавигации.Заголовок = НСтр("ru = 'Показать панель навигации'");
	Иначе
		Элементы.ИзменитьОтображениеПанелиНавигации.Картинка = БиблиотекаКартинок.СтрелкаВлево;
		КомандаИзменитьОтображениеПанелиНавигации.Подсказка = НСтр("ru = 'Скрыть панель навигации'");
		КомандаИзменитьОтображениеПанелиНавигации.Заголовок = НСтр("ru = 'Скрыть панель навигации'");
	КонецЕсли;
	
	УстановитьЗаголовокВидаПанелиНавигации();
	СФормироватьДекорациюТолькоЗначимыеПредметы();
	СФормироватьДекорациюТолькоЗначимыеКонтакты();
	
КонецПроцедуры

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

		ИначеЕсли Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаЗакладки Тогда
			
			Элементы.ВыборВариантаНавигации.Заголовок = НСтр("ru = 'По закладкам'");
			Элементы.УстановитьВариантНавигацииПоЗакладкам.Пометка = Истина;
			
		ИначеЕсли Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаПредмет Тогда
			
			Элементы.ВыборВариантаНавигации.Заголовок = НСтр("ru = 'По предметам'");
			Элементы.УстановитьВариантНавигацииПоПредмету.Пометка = Истина;
			
		ИначеЕсли Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаКонтакт Тогда
			
			Элементы.ВыборВариантаНавигации.Заголовок = НСтр("ru = 'По контактам'");
			Элементы.УстановитьВариантНавигацииПоКонтакту.Пометка = Истина;
			
		ИначеЕсли Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаПапки Тогда
			
			Элементы.ВыборВариантаНавигации.Заголовок = НСтр("ru = 'По папкам'");
			Элементы.УстановитьВариантНавигацииПоПапкам.Пометка = Истина;
			
		ИначеЕсли Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаКатегории Тогда
			
			Элементы.ВыборВариантаНавигации.Заголовок = НСтр("ru = 'По категориям'");
			Элементы["ДопКнопкаВыбораВариантаНавигацииКатегории"].Пометка = Истина;
			
		КонецЕсли;
		
		Элементы.ВыборВариантаНавигации.Подсказка = НСтр("ru = 'Выберите вариант навигации'");
		
	КонецЕсли;
	
	Элементы.ГруппаПанельНавигации.Заголовок = ?(ПустаяСтрока(ЗаголовокПанелиНавигации), 
	                                           НСтр("ru = 'Отбор не установлен'"),
	                                           НСтр("ru = 'Установлен отбор'"));
	
КонецПроцедуры

&НаСервере
Процедура ДобавитьСтрокуВсе(ДанныеФормыКоллекция, НомерКартинки = 0)
	
	Если ТипЗнч(ДанныеФормыКоллекция) = Тип("ДанныеФормыДерево") Тогда
		НоваяСтрока = ДанныеФормыКоллекция.ПолучитьЭлементы().Добавить();
	Иначе
		НоваяСтрока = ДанныеФормыКоллекция.Добавить();
	КонецЕсли;
	
	НоваяСтрока.Значение = "ВсеЗначения";
	НоваяСтрока.Представление = НСтр("ru = 'Все'");
	НоваяСтрока.НомерКартинки = НомерКартинки;
	
КонецПроцедуры

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

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

&НаСервере
Процедура ЗаполнитьТаблицуКатегорий()
	
	Категории.Очистить();

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

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

&НаСервере
Процедура ЗаполнитьДеревоПапок()
	
	Папки.ПолучитьЭлементы().Очистить();
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	УчетныеЗаписиЭлектроннойПочты.Ссылка КАК УчетнаяЗапись,
	|	ПапкиЭлектронныхПисем.Ссылка КАК Значение,
	|	ЕСТЬNULL(НеРассмотреноПапки.КоличествоНеРассмотрено, 0) КАК НеРассмотрено,
	|	ПапкиЭлектронныхПисем.ПредопределеннаяПапка КАК ПредопределеннаяПапка,
	|	ВЫБОР
	|		КОГДА ВЫБОР
	|					КОГДА УчетныеЗаписиЭлектроннойПочты.ВладелецУчетнойЗаписи = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)
	|						ТОГДА НастройкиУчетныхЗаписейЭлектроннойПочты.ОтветственныйЗаВедениеПапок = &ТекущийПользователь
	|					ИНАЧЕ УчетныеЗаписиЭлектроннойПочты.ВладелецУчетнойЗаписи = &ТекущийПользователь
	|				КОНЕЦ
	|				ИЛИ &РольПолныеПравДоступна
	|			ТОГДА 1
	|		ИНАЧЕ 0
	|	КОНЕЦ КАК ЕстьПравоНаИзменение,
	|	ВЫБОР 
	|		КОГДА УчетныеЗаписиЭлектроннойПочты.ВладелецУчетнойЗаписи = &ТекущийПользователь ТОГДА 1
	|		КОГДА УчетныеЗаписиЭлектроннойПочты.ВладелецУчетнойЗаписи = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) ТОГДА 2
	|		ИНАЧЕ 3
	|	КОНЕЦ КАК ЗначениеУпорядочивания,
	|	ВЫБОР
	|		КОГДА НЕ ПапкиЭлектронныхПисем.ПредопределеннаяПапка
	|			ТОГДА 7
	|		ИНАЧЕ ВЫБОР
	|				КОГДА ПапкиЭлектронныхПисем.ТипПредопределеннойПапки = ЗНАЧЕНИЕ(Перечисление.ТипыПредопределенныхПапокПисем.Входящие)
	|					ТОГДА 1
	|				КОГДА ПапкиЭлектронныхПисем.ТипПредопределеннойПапки = ЗНАЧЕНИЕ(Перечисление.ТипыПредопределенныхПапокПисем.Отправленные)
	|					ТОГДА 2
	|				КОГДА ПапкиЭлектронныхПисем.ТипПредопределеннойПапки = ЗНАЧЕНИЕ(Перечисление.ТипыПредопределенныхПапокПисем.Черновики)
	|					ТОГДА 3
	|				КОГДА ПапкиЭлектронныхПисем.ТипПредопределеннойПапки = ЗНАЧЕНИЕ(Перечисление.ТипыПредопределенныхПапокПисем.Исходящие)
	|					ТОГДА 4
	|				КОГДА ПапкиЭлектронныхПисем.ТипПредопределеннойПапки = ЗНАЧЕНИЕ(Перечисление.ТипыПредопределенныхПапокПисем.НежелательнаяПочта)
	|					ТОГДА 5
	|				КОГДА ПапкиЭлектронныхПисем.ТипПредопределеннойПапки = ЗНАЧЕНИЕ(Перечисление.ТипыПредопределенныхПапокПисем.Удаленные)
	|					ТОГДА 6
	|			КОНЕЦ
	|	КОНЕЦ КАК НомерКартинки
	|ИЗ
	|	Справочник.УчетныеЗаписиЭлектроннойПочты КАК УчетныеЗаписиЭлектроннойПочты
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПапкиЭлектронныхПисем КАК ПапкиЭлектронныхПисем
	|		ПО (ПапкиЭлектронныхПисем.Владелец = УчетныеЗаписиЭлектроннойПочты.Ссылка)
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияПапокПисем КАК НеРассмотреноПапки
	|		ПО (НеРассмотреноПапки.Папка = ПапкиЭлектронныхПисем.Ссылка)
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиУчетныхЗаписейЭлектроннойПочты КАК НастройкиУчетныхЗаписейЭлектроннойПочты
	|		ПО (ПапкиЭлектронныхПисем.Владелец = НастройкиУчетныхЗаписейЭлектроннойПочты.УчетнаяЗаписьЭлектроннойПочты)
	|ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи
	|	ПО УчетныеЗаписиЭлектроннойПочты.ВладелецУчетнойЗаписи = Пользователи.Ссылка
	|		И (ПапкиЭлектронныхПисем.Владелец = УчетныеЗаписиЭлектроннойПочты.Ссылка)
	|ГДЕ
	|	НЕ ЕСТЬNULL(НастройкиУчетныхЗаписейЭлектроннойПочты.НеИспользоватьВоВстроенномПочтовомКлиенте, ЛОЖЬ)
	|	И НЕ ПапкиЭлектронныхПисем.ПометкаУдаления
	|	И НЕ УчетныеЗаписиЭлектроннойПочты.ПометкаУдаления
	|	И ВЫБОР 
	|		КОГДА &РольПолныеПравДоступна 
	|		ТОГДА ИСТИНА 
	|		ИНАЧЕ (НЕ ЕСТЬNULL(Пользователи.Недействителен, ЛОЖЬ)) ИЛИ УчетныеЗаписиЭлектроннойПочты.ИспользоватьДляОтправки ИЛИ УчетныеЗаписиЭлектроннойПочты.ИспользоватьДляПолучения
	|	КОНЕЦ 
	|
	|УПОРЯДОЧИТЬ ПО
	|	ЗначениеУпорядочивания,
	|	ПапкиЭлектронныхПисем.Код
	|ИТОГИ
	|	СУММА(НеРассмотрено),
	|	СУММА(ЕстьПравоНаИзменение)
	|ПО
	|	УчетнаяЗапись,
	|	Значение ИЕРАРХИЯ";
	
	Запрос.УстановитьПараметр("ТекущийПользователь", Пользователи.АвторизованныйПользователь());
	Запрос.УстановитьПараметр("РольПолныеПравДоступна", Пользователи.ЭтоПолноправныйПользователь());

	Результат = Запрос.Выполнить();
	Дерево = Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
	СтрокиПервыйУровень = Папки.ПолучитьЭлементы();
	
	Для Каждого Строка Из Дерево.Строки Цикл
		
		СтрокаУчЗаписи = СтрокиПервыйУровень.Добавить();
		СтрокаУчЗаписи.УчетнаяЗапись        = Строка.УчетнаяЗапись;
		СтрокаУчЗаписи.Значение             = Строка.УчетнаяЗапись;
		СтрокаУчЗаписи.НомерКартинки        = 0;
		СтрокаУчЗаписи.НеРассмотрено        = Строка.НеРассмотрено;
		СтрокаУчЗаписи.ЕстьПравоНаИзменение = Строка.ЕстьПравоНаИзменение;
		СтрокаУчЗаписи.Представление = Строка(СтрокаУчЗаписи.Значение) 
		                              + ?(Строка.НеРассмотрено = 0 Или Не ИспользоватьПризнакРассмотрено,
		                              "", " (" + Строка(Строка.НеРассмотрено) + ")");
		
		ДобавитьСтрокиВДеревоНавигации(Строка, СтрокаУчЗаписи);
		
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Процедура ДобавитьСтрокиВДеревоНавигации(РодительскаяСтрока, СтрокаРодитель, ВыполнятьПроверку = Истина, НомерКартинки = -1)
	
	Для Каждого Строка Из РодительскаяСтрока.Строки Цикл
		
		Если ВыполнятьПроверку И (Строка.Значение = РодительскаяСтрока.Значение Или Строка.Значение = Неопределено) Тогда
			Продолжить;
		КонецЕсли;
		
		НоваяСтрока = СтрокаРодитель.ПолучитьЭлементы().Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока,Строка);
		
		Если Строка.НомерКартинки = Null И НомерКартинки <> -1 Тогда
			НоваяСтрока.НомерКартинки = НомерКартинки;
		КонецЕсли;
	
		Если ВзаимодействияКлиентСервер.ЯвляетсяВзаимодействием(Строка.Значение) Тогда
			СтрокаДетали = Строка.Строки[0];
			НоваяСтрока.Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = '%1 от %2 %3'"),
				?(ПустаяСтрока(СтрокаДетали.Тема),НСтр("ru = 'Тема не указана'"), СтрокаДетали.Тема),
				Формат(СтрокаДетали.Дата, "ДЛФ=DT"),
				?(Строка.НеРассмотрено = 0 Или Не ИспользоватьПризнакРассмотрено, "","(" + Строка(Строка.НеРассмотрено) + ")"));
			НоваяСтрока.НомерКартинки = СтрокаДетали.НомерКартинки;
		Иначе
			НоваяСтрока.Представление = Строка(НоваяСтрока.Значение) 
			         + ?(Строка.НеРассмотрено = 0 Или Не ИспользоватьПризнакРассмотрено, 
			             "", 
			             " (" + Строка(Строка.НеРассмотрено) + ")");
			Если Строка.НомерКартинки = Null И НомерКартинки = -1 И Строка.Строки.Количество() > 0 Тогда
				НоваяСтрока.НомерКартинки = Строка.Строки[0].НомерКартинки;
			КонецЕсли;
		КонецЕсли;
		
		ДобавитьСтрокиВДеревоНавигации(Строка, НоваяСтрока);
		
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Функция ПолучитьТекстЗапросаПоОтборуСписка(Запрос)
	
	Если ВзаимодействияКлиентСервер.ОтборДинамическогоСписка(Список).Элементы.Количество() > 0 Тогда
		
		СхемаОтборВзаимодействия = ЖурналыДокументов.Взаимодействия.ПолучитьМакет("СхемаОтборВзаимодействия");
		
		КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
		КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
		КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаОтборВзаимодействия));
		КомпоновщикНастроек.ЗагрузитьНастройки(СхемаОтборВзаимодействия.НастройкиПоУмолчанию);
		
		СкопироватьОтбор(КомпоновщикНастроек.Настройки.Отбор, ВзаимодействияКлиентСервер.ОтборДинамическогоСписка(Список),,, Истина);
		
		Если ЗначениеЗаполнено(Элементы.Список.Период.ДатаНачала) ИЛИ  ЗначениеЗаполнено(Элементы.Список.Период.ДатаОкончания) Тогда
			КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Интервал", Элементы.Список.Период);
		КонецЕсли;
		
		МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаОтборВзаимодействия, КомпоновщикНастроек.ПолучитьНастройки(),,,
			Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
		
		ЗначенияПараметровМакета = МакетКомпоновкиДанных.ЗначенияПараметров; // ЗначенияПараметровМакетаКомпоновкиДанных
		
		Если ЗначенияПараметровМакета.Количество() = 0 Тогда
			Возврат "";
		ИначеЕсли ЗначенияПараметровМакета.Количество() = 2 
			И (НЕ ЗначениеЗаполнено(ЗначенияПараметровМакета.НачалоПериодаОтбора.Значение)) 
			И (НЕ ЗначениеЗаполнено(ЗначенияПараметровМакета.КонецПериодаОтбора.Значение)) Тогда
			Возврат "";
		КонецЕсли;
		
		ТекстЗапроса = МакетКомпоновкиДанных.НаборыДанных.ОсновнойНаборДанных.Запрос;
		
		Для каждого Параметр Из МакетКомпоновкиДанных.ЗначенияПараметров Цикл
			Запрос.Параметры.Вставить(Параметр.Имя, Параметр.Значение);
		КонецЦикла;
		
		ТекстЗапроса = ТекстЗапроса +"
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|";
		
		НайденнаяПозицияИЗ = СтрНайти(ТекстЗапроса,"ИЗ"); // @query-part
		Если НайденнаяПозицияИЗ <> 0 Тогда
			ТекстЗапроса = Лев(ТекстЗапроса,НайденнаяПозицияИЗ - 1) + "  ПОМЕСТИТЬ ОтборСписка
			|  " + Прав(ТекстЗапроса,СтрДлина(ТекстЗапроса) - НайденнаяПозицияИЗ + 1); // @query-part
		КонецЕсли;
		
	Иначе
		
		Возврат "";
		
	КонецЕсли;
	
	Возврат ТекстЗапроса;
	
КонецФункции

&НаСервере
Процедура ОбновитьПанельНавигации(ЗначениеТекущейСтроки = Неопределено, УстанавливатьПризнакНеОтрабатыватьАктивизациюПанелиНавигации = Истина)
	
	ТекущаяСтраницаПанелиНавигации = Элементы.СтраницыПанелиНавигации.ТекущаяСтраница;
	
	Если ТекущаяСтраницаПанелиНавигации = Элементы.СтраницаКонтакт Тогда
		ЗаполнитьПанельКонтактов();
	ИначеЕсли ТекущаяСтраницаПанелиНавигации = Элементы.СтраницаПредмет Тогда
		ЗаполнитьПанельПредметов();
	ИначеЕсли ТекущаяСтраницаПанелиНавигации = Элементы.СтраницаПапки Тогда
		ЗаполнитьДеревоПапок();
	ИначеЕсли ТекущаяСтраницаПанелиНавигации = Элементы.СтраницаСвойства Тогда
		ЗаполнитьДеревоСвойств();
	ИначеЕсли ТекущаяСтраницаПанелиНавигации = Элементы.СтраницаКатегории Тогда
		ЗаполнитьТаблицуКатегорий();
	КонецЕсли;
	
	ПослеЗаполненияПанелиНавигации(УстанавливатьПризнакНеОтрабатыватьАктивизациюПанелиНавигации);
	
КонецПроцедуры

&НаСервере
Процедура ПослеЗаполненияПанелиНавигации(УстанавливатьПризнакНеОтрабатыватьАктивизациюПанелиНавигации = Истина)
	
	Если НЕ УстанавливатьПризнакНеОтрабатыватьАктивизациюПанелиНавигации Тогда
		Возврат;
	КонецЕсли;
	
	ТекущееЗначениеПанелиНавигации = Неопределено;
	
	Настройки = ПолучитьСохраненныеНастройкиДереваПанелиНавигации(Элементы.СтраницыПанелиНавигации.ТекущаяСтраница.Имя,
		ТекущееСвойствоПанелиНавигации,НастройкиДеревьевПанелиНавигации);
	
	Если Настройки = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ЗначениеНастроек = Настройки.ЗначениеНастроек;
	
	Если НЕ (Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаПредмет 
		ИЛИ Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаКонтакт
		ИЛИ Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаЗакладки) Тогда
		СпозиционироватьсяНаСтрокеСогласноСохраненномуЗначению(ЗначениеНастроек.ТекущееЗначение, Настройки.ИмяДерева);
	КонецЕсли;
	
	
	Если Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаКонтакт Тогда
		
		Элементы.КонтактыПанелиНавигации.ТекущаяСтрока = РегистрыСведений.СостоянияКонтактовВзаимодействий.СоздатьКлючЗаписи(Новый Структура("Контакт", ЗначениеНастроек.ТекущееЗначение));

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

	ИначеЕсли Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаСвойства Тогда
		
		ТекущиеДанные = Свойства.НайтиПоИдентификатору(Элементы.Свойства.ТекущаяСтрока);
		
		Если ТекущиеДанные = Неопределено Тогда
			Элементы.Свойства.ТекущаяСтрока = НайтиСтрокуВДанныхФормыДерево(Свойства,НСтр("ru = 'Все'"),"Значение",Ложь);
			ТекущиеДанные = Свойства.НайтиПоИдентификатору(Элементы.Свойства.ТекущаяСтрока);
		КонецЕсли;
		
		Если ТекущиеДанные <> Неопределено Тогда
			
			ИзменитьОтборСписок("Свойства", Новый Структура("Значение", ТекущиеДанные.Значение));
			
		КонецЕсли;
		
	ИначеЕсли Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаКатегории Тогда
		
		ТекущиеДанные = Категории.НайтиПоИдентификатору(Элементы.Категории.ТекущаяСтрока);
		
		Если ТекущиеДанные = Неопределено Тогда
			Элементы.Категории.ТекущаяСтрока = НайтиСтрокуВДанныхФормыКоллекция(Категории,НСтр("ru = 'Все'"),"Значение");
			ТекущиеДанные = Категории.НайтиПоИдентификатору(Элементы.Категории.ТекущаяСтрока);
		КонецЕсли;
		
		Если ТекущиеДанные <> Неопределено Тогда
			ИзменитьОтборСписок("Категории",Новый Структура("Значение", ТекущиеДанные.Значение));
		КонецЕсли;
		
	ИначеЕсли Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаЗакладки Тогда
		
		Элементы.Закладки.ТекущаяСтрока = ЗначениеНастроек.ТекущееЗначение;
		ИзменитьОтборСписок("Закладки", Новый Структура("Значение", ЗначениеНастроек.ТекущееЗначение));
		
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ОбновитьНаСервере()

	ОбновитьПанельНавигации( ,Ложь);

КонецПроцедуры

&НаСервере
Процедура ДополнитьМенюПанелиНавигации()
	
	Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		Возврат;
	КонецЕсли;
	МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
	
	Наборы = Новый Массив;
	Наборы.Добавить(МодульУправлениеСвойствами.НаборСвойствПоИмени("Документ_Встреча"));
	Наборы.Добавить(МодульУправлениеСвойствами.НаборСвойствПоИмени("Документ_ЗапланированноеВзаимодействие"));
	Наборы.Добавить(МодульУправлениеСвойствами.НаборСвойствПоИмени("Документ_ТелефонныйЗвонок"));
	Наборы.Добавить(МодульУправлениеСвойствами.НаборСвойствПоИмени("Документ_ЭлектронноеПисьмоВходящее"));
	Наборы.Добавить(МодульУправлениеСвойствами.НаборСвойствПоИмени("Документ_ЭлектронноеПисьмоИсходящее"));
	Наборы.Добавить(МодульУправлениеСвойствами.НаборСвойствПоИмени("Документ_СообщениеSMS"));
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Наборы", Наборы);
	Запрос.Текст = "
	|ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ
	|	НаборыДополнительныхРеквизитовИСведенийДополнительныеРеквизиты.Свойство,
	|	ПРЕДСТАВЛЕНИЕ(НаборыДополнительныхРеквизитовИСведенийДополнительныеРеквизиты.Свойство) КАК Представление,
	|	ИСТИНА КАК ЭтоДопРеквизит
	|ПОМЕСТИТЬ ДопРеквизитыИСведения
	|ИЗ
	|	Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК НаборыДополнительныхРеквизитовИСведенийДополнительныеРеквизиты
	|ГДЕ
	|	НаборыДополнительныхРеквизитовИСведенийДополнительныеРеквизиты.Ссылка В (&Наборы)
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	НаборыДополнительныхРеквизитовИСведенийДополнительныеСведения.Свойство,
	|	ПРЕДСТАВЛЕНИЕ(НаборыДополнительныхРеквизитовИСведенийДополнительныеСведения.Свойство),
	|	ЛОЖЬ
	|ИЗ
	|	Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеСведения КАК НаборыДополнительныхРеквизитовИСведенийДополнительныеСведения
	|ГДЕ
	|	НаборыДополнительныхРеквизитовИСведенийДополнительныеСведения.Ссылка В (&Наборы)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ДопРеквизитыИСведения.Свойство,
	|	ДопРеквизитыИСведения.Представление,
	|	ДопРеквизитыИСведения.ЭтоДопРеквизит,
	|	ДополнительныеРеквизитыИСведения.ТипЗначения
	|ИЗ
	|	ДопРеквизитыИСведения КАК ДопРеквизитыИСведения
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
	|		ПО ДопРеквизитыИСведения.Свойство = ДополнительныеРеквизитыИСведения.Ссылка";
	
	Инд = 0;
	ОписаниеТиповБулево = Новый ОписаниеТипов("Булево");
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		
		Если Выборка.ТипЗначения = ОписаниеТиповБулево Тогда
			НоваяСтрока = ТаблицаДопРеквизитовСвойствТипаБулево.Добавить();
		Иначе
			
		НоваяКоманда = Команды.Добавить("УстановитьВариантПоСвойству_" + XMLСтрока(Инд));
		НоваяКоманда.Действие = "ПереключитьПанельНавигации";
		
		ЭлементКнопкаПодменю = Элементы.Добавить("ДопКнопкаВыбораВариантаНавигацииСвойства_" + XMLСтрока(Инд), 
			Тип("КнопкаФормы"), Элементы.ВыборВариантаНавигации);
		ЭлементКнопкаПодменю.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;
		ЭлементКнопкаПодменю.ИмяКоманды = НоваяКоманда.Имя;
		ЭлементКнопкаПодменю.Заголовок = НСтр("ru = 'По'") + " " + Выборка.Представление;
			
			НоваяСтрока = ТаблицаДопРеквизитовСвойств.Добавить();
			НоваяСтрока.ПорядковыйНомер = Инд;
			Инд = Инд + 1;
			
		КонецЕсли;
		
		НоваяСтрока.ДопРеквизитСведение = Выборка.Свойство;
		НоваяСтрока.ЭтоРеквизит = Выборка.ЭтоДопРеквизит;
		НоваяСтрока.Представление = Выборка.Представление;
		
	КонецЦикла;
	
	Если ТаблицаДопРеквизитовСвойствТипаБулево.Количество() > 0 Тогда
	
		НоваяКоманда = Команды.Добавить("УстановитьВариантПоКатегориям");
		НоваяКоманда.Действие = "ПереключитьПанельНавигации";
		
		ЭлементКнопкаПодменю = Элементы.Добавить("ДопКнопкаВыбораВариантаНавигацииКатегории", 
			Тип("КнопкаФормы"), Элементы.ВыборВариантаНавигации);
		ЭлементКнопкаПодменю.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;
		ЭлементКнопкаПодменю.ИмяКоманды = НоваяКоманда.Имя;
		ЭлементКнопкаПодменю.Заголовок = НСтр("ru = 'По категориям'");
	
	КонецЕсли;
	
КонецПроцедуры

///////////////////////////////////////////////////////////////////////////////
//    Сохранение состояния узлов и значений деревьев панели навигации.

&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьСохраненныеНастройкиДереваПанелиНавигации(
	ИмяТекущейСтраницыПанелиНавигации,
	ТекущееСвойствоПанелиНавигации,
	НастройкиДеревьевПанелиНавигации)

	Если ИмяТекущейСтраницыПанелиНавигации = "СтраницаПредмет" Тогда
		ИмяДерева = "Предметы";
		ИмяНастройки = "Предметы";
	ИначеЕсли ИмяТекущейСтраницыПанелиНавигации = "СтраницаКонтакт" Тогда
		ИмяДерева = "Контакты";
		ИмяНастройки = "Контакты";
	ИначеЕсли ИмяТекущейСтраницыПанелиНавигации = "СтраницаКатегории" Тогда
		ИмяДерева = "Категории";
		ИмяНастройки = "Категории";
	ИначеЕсли ИмяТекущейСтраницыПанелиНавигации = "СтраницаПапки" Тогда
		ИмяДерева = "Папки";
		ИмяНастройки = "Папки";
	ИначеЕсли ИмяТекущейСтраницыПанелиНавигации = "СтраницаСвойства" Тогда
		ИмяДерева = "Свойства";
		ИмяНастройки = "Свойства_" + Строка(ТекущееСвойствоПанелиНавигации);
	ИначеЕсли ИмяТекущейСтраницыПанелиНавигации = "СтраницаЗакладки" Тогда
		ИмяДерева = "Закладки";
		ИмяНастройки = "Закладки";
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	
	НайденныеСтроки =  НастройкиДеревьевПанелиНавигации.НайтиСтроки(Новый Структура("ИмяДерева", ИмяНастройки));
	Если НайденныеСтроки.Количество() = 1 Тогда
		СтрокаДереваНастроек = НайденныеСтроки[0];
	ИначеЕсли НайденныеСтроки.Количество() > 1 Тогда
		СтрокаДереваНастроек = НайденныеСтроки[0];
		Для Инд = 1 По НайденныеСтроки.Количество()-1 Цикл
			НастройкиДеревьевПанелиНавигации.Удалить(НайденныеСтроки[инд]);
		КонецЦикла;
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	
	Возврат Новый Структура("ИмяДерева,ЗначениеНастроек",ИмяДерева,СтрокаДереваНастроек);

КонецФункции

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

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

	ИдентификаторыРазвернутыхУзлов = Новый Соответствие;
	ОпределитьИдентификаторыРазвернутыхУзлов(РазвернутыеУзлы, ЭтотОбъект[Настройки.ИмяДерева].ПолучитьЭлементы(),
		ИдентификаторыРазвернутыхУзлов);

	Для каждого ИдентификаторУзла Из ИдентификаторыРазвернутыхУзлов Цикл
		Элементы[Настройки.ИмяДерева].Развернуть(ИдентификаторУзла.Значение);
	КонецЦикла;
	
	УдаляемыеУзлы = Новый Массив;
	Для каждого ЭлементСписка Из РазвернутыеУзлы Цикл
		Если ИдентификаторыРазвернутыхУзлов[ЭлементСписка.Значение] = Неопределено Тогда
			УдаляемыеУзлы.Добавить(ЭлементСписка);
		КонецЕсли;
	КонецЦикла;
	Для каждого ЭлементСписка Из УдаляемыеУзлы Цикл
		РазвернутыеУзлы.Удалить(ЭлементСписка);
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ОпределитьИдентификаторыРазвернутыхУзлов(СписокРазвернутыхУзлов, СтрокиДерева, ИдентификаторыУзлов)

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

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

КонецПроцедуры

///////////////////////////////////////////////////////////////////////////////
// Процедуры и функции обработки команд.

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ЭтоПанельСДинамическимСписком(ИмяТекущейПанелиНавигации)

	Возврат ИмяТекущейПанелиНавигации = "СтраницаПредмет" ИЛИ ИмяТекущейПанелиНавигации = "СтраницаКонтакт";

КонецФункции

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

		ИначеЕсли ИмяЭлементаФормы = "Папки" Тогда
			
			НаименованиеЗакладки       = НСтр("ru = 'В папке'") + " " + Строка(ДанныеДляОбработки.Значение);
			Результат.ПредставлениеЭлемента = ?(ТолькоПочта, НСтр("ru = 'Письма в папке: %1'"), НСтр("ru = 'Взаимодействия в папке: %1'"));
			Результат.ПредставлениеЭлемента = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Результат.ПредставлениеЭлемента, ДанныеДляОбработки.Значение);
			
		КонецЕсли;
		
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	ЗакладкиВзаимодействий.Ссылка,
	|	ЗакладкиВзаимодействий.Наименование,
	|	ЗакладкиВзаимодействий.КомпоновщикНастроек
	|ИЗ
	|	Справочник.ЗакладкиВзаимодействий КАК ЗакладкиВзаимодействий
	|ГДЕ
	|	НЕ ЗакладкиВзаимодействий.ЭтоГруппа
	|	И НЕ ЗакладкиВзаимодействий.ПометкаУдаления";
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Пока Выборка.Следующий() Цикл
		Если ЗначениеВXML(КомпоновщикНастроек.ПолучитьНастройки()) =  ЗначениеВXML(Выборка.КомпоновщикНастроек.Получить()) Тогда
			Результат.ТекстСообщенияОшибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Закладка с такими настройками уже существует : %1'"),
				Выборка.Наименование);
			Возврат Результат;
		КонецЕсли;
	КонецЦикла;
	
	Закладка = Справочники.ЗакладкиВзаимодействий.СоздатьЭлемент();
	Закладка.Владелец = Пользователи.АвторизованныйПользователь();
	Закладка.Наименование = НаименованиеЗакладки;
	Закладка.КомпоновщикНастроек = Новый ХранилищеЗначения(КомпоновщикНастроек.ПолучитьНастройки());
	Закладка.Записать();
	
	Элементы.Закладки.Обновить();
	
	Результат.ЭлементДобавлен = Истина;
	Возврат Результат;
	
КонецФункции

&НаСервереБезКонтекста
Функция ЗначениеВXML(Значение)
	
	Запись = Новый ЗаписьXML();
	Запись.УстановитьСтроку();
	СериализаторXDTO.ЗаписатьXML(Запись, Значение);
	Возврат Запись.Закрыть();
	
КонецФункции

// Установить предмет в выбранных взаимодействиях - серверная часть.
// Параметры:
//  Взаимодействия - список выбранных взаимодействий.
//  Предмет - устанавливаемый предмет взаимодействий.
//
&НаСервере
Процедура УстановитьПредмет(Предмет, Знач ДанныеДляОбработки)
	
	Если ДанныеДляОбработки <> Неопределено Тогда
		
		Запрос = Новый Запрос;
		Запрос.Текст = "ВЫБРАТЬ
		|	Взаимодействия.Ссылка
		|ИЗ
		|	ЖурналДокументов.Взаимодействия КАК Взаимодействия
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий
		|		ПО Взаимодействия.Ссылка = ПредметыПапкиВзаимодействий.Взаимодействие
		|ГДЕ
		|	ПредметыПапкиВзаимодействий.Предмет <> &Предмет
		|	И Взаимодействия.Ссылка В (&МассивВзаимодействий)";
		
		Запрос.УстановитьПараметр("МассивВзаимодействий",ДанныеДляОбработки );
		Запрос.УстановитьПараметр("Предмет", Предмет);
		
		МассивВзаимодействий = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
		
	Иначе
		
		МассивВзаимодействий = ПолучитьВзаимодействияОтборуСписка(Предмет, "Предмет");
		
	КонецЕсли;
	
	Если МассивВзаимодействий.Количество() > 0 Тогда
		ВзаимодействияВызовСервера.УстановитьПредметДляМассиваВзаимодействий(МассивВзаимодействий, Предмет, Истина);
		ОбновитьПанельНавигации();
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура СоздатьНовоеВзаимодействие(ТипОбъекта)
	
	ПараметрыСоздания = Новый Структура;
	
	Если ИмяТекущейПанелиНавигации = "СтраницаКонтакт" Тогда
		ТекущиеДанные = Элементы.КонтактыПанелиНавигации.ТекущиеДанные;
		Если ТекущиеДанные <> Неопределено Тогда
			ПараметрыСоздания.Вставить("ЗначенияЗаполнения", Новый Структура("Контакт", ТекущиеДанные.Контакт));
		КонецЕсли;
	ИначеЕсли ИмяТекущейПанелиНавигации = "СтраницаПредмет" Тогда
		ТекущиеДанные = Элементы.ПредметыПанельНавигации.ТекущиеДанные;
		Если ТекущиеДанные <> Неопределено Тогда
			ПараметрыСоздания.Вставить("ЗначенияЗаполнения", Новый Структура("Предмет", ТекущиеДанные.Предмет));
		КонецЕсли;
	ИначеЕсли ИмяТекущейПанелиНавигации = "СтраницаПапки" Тогда
		ТекущиеДанные = Элементы.Папки.ТекущиеДанные;
		Если ТекущиеДанные <> Неопределено Тогда
			ПараметрыСоздания.Вставить("ЗначенияЗаполнения", Новый Структура("УчетнаяЗапись", ТекущиеДанные.УчетнаяЗапись));
		КонецЕсли;
	КонецЕсли;
	
	ВзаимодействияКлиент.СоздатьНовоеВзаимодействие(ТипОбъекта, ПараметрыСоздания, ЭтотОбъект);
	
КонецПроцедуры

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

&НаСервере
Процедура УстановитьРодителяУПапки(Знач Папка, Знач НовыйРодитель)
	
	Взаимодействия.УстановитьРодителяУПапки(Папка, НовыйРодитель);
	ОбновитьПанельНавигации();
	
КонецПроцедуры

&НаСервере
Процедура ВыполнитьПереносВПапкуМассиваПисем(Знач МассивПисем, Знач Папка)

	Взаимодействия.УстановитьПапкуДляМассиваПисем(МассивПисем, Папка);
	ОбновитьПанельНавигации(Папка);

КонецПроцедуры

#КонецОбласти

#Область ПолнотекстовыйПоиск

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

&НаКлиенте
Процедура ВыполнитьПолнотекстовыйПоиск()
	
	Результат = РезультатПоискаВзаимодействийПолнотекстовымПоиском();
	
	Если Не Результат.ЕстьОшибка  Тогда
		РасширенныйПоиск = Истина;
		ТекстОповещения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			?(ТолькоПочта, НСтр("ru = 'Найдено писем: %1.'"), НСтр("ru = 'Найдено взаимодействий: %1.'")), 
			Строка(Результат.КоличествоЭлементовНайдено));
		ПоказатьОповещениеПользователя(НСтр("ru = 'Результаты поиска'"),, ТекстОповещения);
		ТекущиеДанные = Элементы.Список.ТекущиеДанные;
		Если ТекущиеДанные <> Неопределено Тогда
			ЗаполнитьОписаниеНайденоПолнотекстовымПоиском(Элементы.Список.ТекущиеДанные.Ссылка);
		Иначе
			ОписаниеНайденоПолнотекстовымПоиском = "";
		КонецЕсли;
	Иначе
		Если Результат.ИдентификаторОшибки = "НичегоНеНайдено" Тогда
			РасширенныйПоиск = Ложь;
		Иначе
			ПоказатьОповещениеПользователя(Результат.ТекстОшибки);
		КонецЕсли;
	КонецЕсли;
	
	Элементы.ОписаниеНайденоПолнотекстовымПоиском.Видимость = РасширенныйПоиск;
	
КонецПроцедуры

&НаСервере
Функция РезультатПоискаВзаимодействийПолнотекстовымПоиском()

	Результат = Новый Структура;
	Результат.Вставить("ЕстьОшибка", Ложь);
	Результат.Вставить("ТекстОшибки",                "");
	Результат.Вставить("ИдентификаторОшибки",        "");
	Результат.Вставить("КоличествоЭлементовНайдено", 0);
	
	// настроить параметры поиска
	ОбластьПоиска = Новый Массив;
	РазмерПорции = 200;
	
	СтрокаПолнотекстовогоПоиска = СтрокаПоиска;
	Если СтрНайти(СтрокаПолнотекстовогоПоиска, "*") = 0 Тогда
		СтрокаПолнотекстовогоПоиска = "*" + СтрокаПолнотекстовогоПоиска + "*";
	КонецЕсли;
	
	СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок(СтрокаПолнотекстовогоПоиска, РазмерПорции);
	ОбластьПоиска.Добавить(Метаданные.Документы.ЭлектронноеПисьмоВходящее);
	ОбластьПоиска.Добавить(Метаданные.Документы.ЭлектронноеПисьмоИсходящее);
	ОбластьПоиска.Добавить(Метаданные.Справочники.ЭлектронноеПисьмоВходящееПрисоединенныеФайлы);
	ОбластьПоиска.Добавить(Метаданные.Справочники.ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы);
	ОбластьПоиска.Добавить(Метаданные.РегистрыСведений.ПредметыПапкиВзаимодействий);

	Если Не ТолькоПочта Тогда
		ОбластьПоиска.Добавить(Метаданные.Документы.ТелефонныйЗвонок);
		ОбластьПоиска.Добавить(Метаданные.Документы.Встреча);
		ОбластьПоиска.Добавить(Метаданные.Документы.ЗапланированноеВзаимодействие);
		ОбластьПоиска.Добавить(Метаданные.Справочники.ТелефонныйЗвонокПрисоединенныеФайлы);
		ОбластьПоиска.Добавить(Метаданные.Справочники.ВстречаПрисоединенныеФайлы);
		ОбластьПоиска.Добавить(Метаданные.Справочники.ЗапланированноеВзаимодействиеПрисоединенныеФайлы);
	КонецЕсли;
	СписокПоиска.ОбластьПоиска = ОбластьПоиска;

	СписокПоиска.ПерваяЧасть();

	// Возврат, если поиск слишком результативен.
	Если СписокПоиска.СлишкомМногоРезультатов() Тогда
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
			Список,
			"Поиск",
			Документы.ЭлектронноеПисьмоВходящее.ПустаяСсылка(),
			ВидСравненияКомпоновкиДанных.Равно,, Истина);
		Элементы.СтрокаПоиска.ЦветФона = ЦветаСтиля.ОшибкаПолнотекстовыйПоискФон;
		
		Результат.ЕстьОшибка = Истина;
		Результат.ИдентификаторОшибки = "СлишкомМногоРезультатов";
		Результат.ТекстОшибки = НСтр("ru = 'Слишком много результатов, уточните запрос.'");
		Возврат Результат;
		
	КонецЕсли;

	// Возврат, если поиск не результативен.
	Если СписокПоиска.ПолноеКоличество() = 0 Тогда
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
			Список,
			"Поиск",
			Документы.ЭлектронноеПисьмоВходящее.ПустаяСсылка(),
			ВидСравненияКомпоновкиДанных.Равно,, Истина);
		Элементы.СтрокаПоиска.ЦветФона = ЦветаСтиля.ОшибкаПолнотекстовыйПоискФон;
		
		Результат.ЕстьОшибка          = Истина;
		Результат.ИдентификаторОшибки = "НичегоНеНайдено";
		Результат.ТекстОшибки         = НСтр("ru = 'Ничего не найдено.'");
		Возврат Результат;

	КонецЕсли;
	
	Результат.КоличествоЭлементовНайдено = СписокПоиска.ПолноеКоличество();
	
	НачальнаяПозиция = 0;
	КонечнаяПозиция = ?(Результат.КоличествоЭлементовНайдено > РазмерПорции, РазмерПорции, Результат.КоличествоЭлементовНайдено) - 1;
	ЕстьСледующаяПорция = Истина;

	// Обработать по порциям результаты ППД.
	Пока ЕстьСледующаяПорция Цикл
		Для СчетчикЭлементов = 0 По КонечнаяПозиция Цикл
			
			Элемент = СписокПоиска.Получить(СчетчикЭлементов);
			НоваяСтрока = ОписанияНайденоПолнотекстовымПоиском.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрока,Элемент);
			Если ВзаимодействияКлиентСервер.ЯвляетсяПрисоединеннымФайломВзаимодействий(Элемент.Значение) Тогда
				НоваяСтрока.Взаимодействие = Элемент.Значение.ВладелецФайла;
			ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("РегистрСведенийКлючЗаписи.ПредметыПапкиВзаимодействий") Тогда
				НоваяСтрока.Взаимодействие =  Элемент.Значение.Взаимодействие;
			Иначе
				НоваяСтрока.Взаимодействие = Элемент.Значение;
			КонецЕсли;
			
		КонецЦикла;
		НачальнаяПозиция = НачальнаяПозиция + РазмерПорции;
		ЕстьСледующаяПорция = (НачальнаяПозиция < Результат.КоличествоЭлементовНайдено - 1);
		Если ЕстьСледующаяПорция Тогда
			КонечнаяПозиция = 
			?(Результат.КоличествоЭлементовНайдено > НачальнаяПозиция + РазмерПорции, РазмерПорции,
			Результат.КоличествоЭлементовНайдено - НачальнаяПозиция) - 1;
			СписокПоиска.СледующаяЧасть();
		КонецЕсли;
	КонецЦикла;
	
	Если ОписанияНайденоПолнотекстовымПоиском.Количество() = 0 Тогда
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
			Список,
			"Поиск",
			Документы.ЭлектронноеПисьмоВходящее.ПустаяСсылка(),
			ВидСравненияКомпоновкиДанных.Равно,, Истина);
		Элементы.СтрокаПоиска.ЦветФона = ЦветаСтиля.ОшибкаПолнотекстовыйПоискФон;
		
		Результат.ЕстьОшибка          = Истина;
		Результат.ИдентификаторОшибки = "НичегоНеНайдено";
		Результат.ТекстОшибки         = НСтр("ru = 'Ничего не найдено.'");
		Возврат Результат;
	КонецЕсли;
	
	// Удалим элемент из истории поиска если он там был.
	НомерНайденногоЭлементаСписка = Элементы.СтрокаПоиска.СписокВыбора.НайтиПоЗначению(СтрокаПоиска);
	Пока НомерНайденногоЭлементаСписка <> Неопределено Цикл
		Элементы.СтрокаПоиска.СписокВыбора.Удалить(НомерНайденногоЭлементаСписка);
		НомерНайденногоЭлементаСписка = Элементы.СтрокаПоиска.СписокВыбора.НайтиПоЗначению(СтрокаПоиска);
	КонецЦикла;
	
	// И поставим его на первое место.
	Элементы.СтрокаПоиска.СписокВыбора.Вставить(0, СтрокаПоиска);
	Пока Элементы.СтрокаПоиска.СписокВыбора.Количество() > 100 Цикл
		Элементы.СтрокаПоиска.СписокВыбора.Удалить(Элементы.СтрокаПоиска.СписокВыбора.Количество() - 1);
	КонецЦикла;
	ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(
		"ИсторияПоискаВзаимодействия",
		"",
		Элементы.СтрокаПоиска.СписокВыбора.ВыгрузитьЗначения());
	
	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
			Список,
			"Поиск",
			ОписанияНайденоПолнотекстовымПоиском.Выгрузить(,"Взаимодействие").ВыгрузитьКолонку("Взаимодействие"),
			ВидСравненияКомпоновкиДанных.ВСписке,, Истина);
			
	Элементы.СтрокаПоиска.ЦветФона = ЦветаСтиля.ЦветФонаПоля;
	
	Возврат Результат;
	
КонецФункции

&НаКлиенте
Процедура ЗаполнитьОписаниеНайденоПолнотекстовымПоиском(Взаимодействие)

	СтрокаОписания = ОписанияНайденоПолнотекстовымПоиском.НайтиСтроки(Новый Структура("Взаимодействие", Взаимодействие));
	Если СтрокаОписания.Количество() = 0 Тогда
		ОписаниеНайденоПолнотекстовымПоиском = "";
		Возврат;
	КонецЕсли;

	СтрокаТаблицыСОписанием = СтрокаОписания[0];
	Если ВзаимодействияКлиентСервер.ЯвляетсяПрисоединеннымФайломВзаимодействий(СтрокаТаблицыСОписанием.Значение) Тогда
		ТекстНайдено = НСтр("ru = 'Найдено в присоединенном файле %1.'");
	Иначе
		ТекстНайдено = НСтр("ru = 'Найдено в %1.'");
	КонецЕсли;
	
	ОписаниеНайденоПолнотекстовымПоиском = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстНайдено,
		СтрокаТаблицыСОписанием.Описание);

КонецПроцедуры 

///////////////////////////////////////////////////////////////////////////////
// Прочее

&НаСервере
Функция НайтиСтрокуВДанныхФормыКоллекция(ГдеИскать, Значение, Колонка)

	НайденныеСтроки = ГдеИскать.НайтиСтроки(Новый Структура(Колонка, Значение));
	Если НайденныеСтроки.Количество() > 0 Тогда
		Возврат НайденныеСтроки[0].ПолучитьИдентификатор();
	КонецЕсли;
	
	Возврат -1;
	
КонецФункции

&НаСервере
Функция НайтиСтрокуВДанныхФормыДерево(ГдеИскать, Значение, Колонка, ИскатьВПодчиненных)
	
	ЭлементыДерева = ГдеИскать.ПолучитьЭлементы();
	
	Для каждого ЭлементДерева Из ЭлементыДерева Цикл
		Если ЭлементДерева[Колонка] = Значение Тогда
			Возврат ЭлементДерева.ПолучитьИдентификатор();
		ИначеЕсли  ИскатьВПодчиненных Тогда
			НайденныйИдентификаторСтроки =  НайтиСтрокуВДанныхФормыДерево(ЭлементДерева, Значение,Колонка, ИскатьВПодчиненных);
			Если НайденныйИдентификаторСтроки >=0 Тогда
				Возврат НайденныйИдентификаторСтроки;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Возврат -1;
	
КонецФункции

&НаКлиенте
Функция ТекущийЭлементСписокПанелиНавигации()

	Если Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаКонтакт Тогда
		Возврат Элементы.КонтактыПанелиНавигации;
	ИначеЕсли Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаПредмет Тогда
		Возврат Элементы.ПредметыПанельНавигации;
	ИначеЕсли Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаПапки Тогда
		Возврат Элементы.Папки;
	ИначеЕсли Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаСвойства Тогда
		Возврат Элементы.Свойства;
	ИначеЕсли Элементы.СтраницыПанелиНавигации.ТекущаяСтраница = Элементы.СтраницаКатегории Тогда
		Возврат Элементы.Категории;
	Иначе
		Возврат Неопределено;
	КонецЕсли;

КонецФункции

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

&НаСервере
Процедура СкопироватьОтбор(Приемник, Источник, УдалятьПредставлениеГруппы = Ложь, УдалятьНеиспользуемые = Истина, НеВключатьОтборПанелиНавигации = Ложь)
	
	Для каждого ЭлементОтбораИсточник Из Источник.Элементы Цикл
		
		Если УдалятьНеиспользуемые И (Не ЭлементОтбораИсточник.Использование) Тогда
			Продолжить;
		КонецЕсли;
		
		Если НеВключатьОтборПанелиНавигации И ТипЗнч(ЭлементОтбораИсточник) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") 
			И ЭлементОтбораИсточник.Представление = "ОтборПанелиНавигации" Тогда
			
			Продолжить;
			
		КонецЕсли;
		
		Если ТипЗнч(ЭлементОтбораИсточник) = Тип("ЭлементОтбораКомпоновкиДанных") 
			И ЭлементОтбораИсточник.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Поиск") Тогда
			Продолжить;
		КонецЕсли;
		
		ЭлементОтбора = Приемник.Элементы.Добавить(ТипЗнч(ЭлементОтбораИсточник));
		ЗаполнитьЗначенияСвойств(ЭлементОтбора, ЭлементОтбораИсточник);
		Если ТипЗнч(ЭлементОтбораИсточник) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
			Если УдалятьПредставлениеГруппы Тогда
				ЭлементОтбора.Представление = "";
			КонецЕсли;
			СкопироватьОтбор(ЭлементОтбора, ЭлементОтбораИсточник);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ВопросОУдаленииПапкиПослеЗавершения(РезультатВопроса, ДополнительныеПараметры) Экспорт

	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		
		ОписаниеОшибки =  УдалитьПапкуСервер(ДополнительныеПараметры.ТекущиеДанные.Значение);
		Если НЕ ПустаяСтрока(ОписаниеОшибки) Тогда
			ПоказатьПредупреждение(, ОписаниеОшибки);
		Иначе
			ВосстановитьРаскрытыеУзлыДерева();
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВыборДатыОтработкиПриЗавершении(ВыбраннаяДата, ДополнительныеПараметры) Экспорт
	
	ИмяТекущегоЭлемента = ДополнительныеПараметры.ИмяТекущегоЭлемента;
	
	Если ВыбраннаяДата <> Неопределено Тогда
		ОтложитьРассмотрение(ВыбраннаяДата, ?(ИмяТекущегоЭлемента = Неопределено, Неопределено, Элементы[ИмяТекущегоЭлемента].ВыделенныеСтроки));
		ВосстановитьРаскрытыеУзлыДерева();
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьПанельНавигацииНаСервере()
	
	ОбновитьПанельНавигации();
	УправлениеВидимостьюПриПереключенииПанелиНавигации();
	
КонецПроцедуры

&НаСервере
Процедура ПодготовитьНастройкиФормыКВыводуТекущейСсылки(ТекущаяСсылка)
	ИмяТекущейПанелиНавигации = "СтраницаПредмет";
	Если ВзаимодействияКлиентСервер.ЯвляетсяПредметом(ТекущаяСсылка) Тогда
		Предмет = ТекущаяСсылка;
	ИначеЕсли ВзаимодействияКлиентСервер.ЯвляетсяВзаимодействием(ТекущаяСсылка) Тогда
		Предмет = Взаимодействия.СтруктураРеквизитовВзаимодействия(ТекущаяСсылка).Предмет;
	Иначе
		Предмет = Неопределено;
	КонецЕсли;
	Если ЗначениеЗаполнено(Предмет) Тогда
		Элементы.ПредметыПанельНавигации.ТекущаяСтрока = РегистрыСведений.СостоянияПредметовВзаимодействий.СоздатьКлючЗаписи(Новый Структура("Предмет", Предмет));
		ИзменитьОтборСписок("Предметы", Новый Структура("Значение, ОписаниеТипов", Предмет, Неопределено));
	КонецЕсли;
КонецПроцедуры

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

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Элементы.Список);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
	ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры

&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
	ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Элементы.Список);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Элементы.Список);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

&НаКлиенте
Процедура ПредупреждениеОНебезопасномСодержимомОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	Если НавигационнаяСсылкаФорматированнойСтроки = "ВключитьНебезопасноеСодержимое" Тогда
		СтандартнаяОбработка = Ложь;
		ВключитьНебезопасноеСодержимое = Истина;
		ОтобразитьПредпросмотрВзаимодействия(ВзаимодействиеДляКоторогоСформированПредпросмотр, Элементы.СтраницыПредпросмотр.ТекущаяСтраница.Имя);
	КонецЕсли;
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьВидимостьПредупрежденияБезопасности(Форма)
	Форма.Элементы.ПредупреждениеБезопасности.Видимость = Не Форма.ЗапрещеноОтображениеНебезопасногоСодержимогоВПисьмах
		И Форма.ЕстьНебезопасноеСодержимое И Не Форма.ВключитьНебезопасноеСодержимое;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСостояниеОтправкиПисем()
	
	ПроверитьСостояниеОтправкиПисемНаСервере();
	Интервал = ?(Элементы.ПредупреждениеОНеотправленныхПисьмах.Видимость, 60, 600);
	ПодключитьОбработчикОжидания("ПроверитьСостояниеОтправкиПисем", Интервал, Истина);
	
КонецПроцедуры

&НаСервере
Процедура ПроверитьСостояниеОтправкиПисемНаСервере()
	
	Элементы.ПредупреждениеОНеотправленныхПисьмах.Видимость = Взаимодействия.ОтправкаПисемПриостановлена();
	Элементы.ПредупреждениеОНеотправленныхПисьмахНадпись.Заголовок = Взаимодействия.ТекстПредупрежденияОПриостановкеОтправкиПисем();
	
КонецПроцедуры

&НаСервере
Процедура СФормироватьДекорациюТолькоЗначимыеКонтакты()
	
	Если ТолькоЗначимыеКонтакты Тогда
		ТекстЗаголовка = СтроковыеФункции.ФорматированнаяСтрока(НСтр("ru='Контакты с взаимодействиями по отбору, <a href = ""%1"">изменить</a>'"), 
		                                                        "ИзменитьТолькоЗначимыеКонтакты");
	Иначе
		ТекстЗаголовка = СтроковыеФункции.ФорматированнаяСтрока(НСтр("ru='Отображаются все контакты, <a href = ""%1"">изменить</a>'"),
		                                                        "ИзменитьТолькоЗначимыеКонтакты");
	КонецЕсли;
	
	Элементы.ДекорацияТолькоЗначимыеКонтакты.Заголовок = ТекстЗаголовка;
	
КонецПроцедуры

&НаСервере
Процедура СФормироватьДекорациюТолькоЗначимыеПредметы()
	
	Если ТолькоЗначимыеПредметы Тогда
		ТекстЗаголовка = СтроковыеФункции.ФорматированнаяСтрока(НСтр("ru='Предметы с взаимодействиями по отбору, <a href = ""%1"">изменить</a>'"), 
		                                                        "ИзменитьТолькоЗначимыеПредметы");
	Иначе
		ТекстЗаголовка = СтроковыеФункции.ФорматированнаяСтрока(НСтр("ru='Отображаются все предметы, <a href = ""%1"">изменить</a>'"), 
		                                                        "ИзменитьТолькоЗначимыеПредметы");
	КонецЕсли;
	
	Элементы.ДекорацияТолькоЗначимыеПредметы.Заголовок = ТекстЗаголовка;
	
КонецПроцедуры

&НаКлиенте
Процедура ОтправитьПолучитьПочтуПользователяКлиент(ВыводитьПрогресс = Ложь)
	
	ОчиститьСообщения();
	УправлениеЭлектроннойПочтойКлиент.ОтправитьЗагрузитьПочтуПользователя(УникальныйИдентификатор, ЭтотОбъект, 
		Элементы.Список, ВыводитьПрогресс);
	ПодключитьОбработчикОжидания("ПроверитьНеобходимостьОтправкиПолученияПочты", 30, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьНеобходимостьОтправкиПолученияПочты()

	Если Не РазделениеВключено Тогда
		Возврат;
	КонецЕсли;
	
	Если Не ОтправкаПолучениеПисемВыполняется
		И (ОбщегоНазначенияКлиент.ДатаСеанса() > ДатаПредыдущегоПолученияОтправкиПочты + 300) Тогда
		ОтправитьПолучитьПочтуПользователяКлиент();
	КонецЕсли;
	
	ПодключитьОбработчикОжидания("ПроверитьНеобходимостьОтправкиПолученияПочты", 30, Истина);
	
КонецПроцедуры

#КонецОбласти

#Область ВыполнениеПоиска

&НаКлиенте
Процедура ПроверитьИндексПолнотекстовогоПоиска()
	
	Если Не ИндексПолнотекстовогоПоискаАктуален Тогда 
		
		Если ИнформационнаяБазаФайловая Тогда
		
			ОповещениеПослеОтветаНаВопрос = Новый ОписаниеОповещения("ПроверитьИндексПолнотекстовогоПоискаЗавершение", ЭтотОбъект);
			
			ПоказатьВопрос(ОповещениеПослеОтветаНаВопрос, 
				НСтр("ru = 'Индекс полнотекстового поиска неактуален. Обновить индекс?'"), РежимДиалогаВопрос.ДаНет);
			
		Иначе
			
			Элементы.ПредупреждениеОНеактуальностиИндекса.Видимость = Истина;
			ВыполнитьПолнотекстовыйПоиск();
			
		КонецЕсли;
		
	Иначе
		
		Элементы.ПредупреждениеОНеактуальностиИндекса.Видимость = Ложь;
		ВыполнитьПолнотекстовыйПоиск();
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьИндексПолнотекстовогоПоискаЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
	
	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		
		ПодключитьОбработчикОжидания("ОбновитьИндексПолнотекстовогоПоиска",0.2,Истина);
		
	Иначе
		
		Элементы.ПредупреждениеОНеактуальностиИндекса.Видимость = Истина;
		ВыполнитьПолнотекстовыйПоиск();
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьИндексПолнотекстовогоПоиска()
	
	Состояние(НСтр("ru = 'Идет обновление индекса полнотекстового поиска...'"));
	ОбновитьИндексПолнотекстовогоПоискаСервер();
	ИндексПолнотекстовогоПоискаАктуален = Истина;
	Элементы.ПредупреждениеОНеактуальностиИндекса.Видимость = Ложь;
	Состояние(НСтр("ru = 'Обновление индекса полнотекстового поиска завершено...'"));
	ВыполнитьПолнотекстовыйПоиск();
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьИндексПолнотекстовогоПоискаСервер()
	
	УстановитьПривилегированныйРежим(Истина);
	ПолнотекстовыйПоиск.ОбновитьИндекс();
	
КонецПроцедуры

#КонецОбласти

#КонецОбласти

Связанные материалы