Загрузка данных



Перем ФормаПрогресса;
Перем Элементы;
Перем НеобходимоОткрытиеМастераПервогоЗапуска;
Перем ЕстьОграниченияПоТарифу;
Перем ПредставлениеТиповДокументов, ТипыДокументовДляСопоставления;
Перем КонтекстСеансаКлиентСервер;
Перем ЯщикиНеТребующиеОплаты;
Перем ЭтоПервыйЗапуск;

Перем ЕстьСертификаты; // Булево - Истина, если хотя бы к одному ящику в контексте сеанса привязан сертификат
Перем ЕстьСистемаХранения; // Булево - Истина, если определена система хранения (СХ-1, СХ-1 в расширении или СХ-2)

Перем ЛендингНовыйГод; // Строка, Неопределено - Адрес страницы с новогодним поздравлением или "null"

Перем КлючТекущейСтроки;

// BSLLS:UnusedLocalVariable-off
Перем _МодульПлатформа; // хранит форму Модуль_Платформа
// BSLLS:UnusedLocalVariable-on

// {	СЕРВИСНЫЕ МЕТОДЫ
	
Функция ОсновнаяФорма() Экспорт
	
	Возврат ЭтаФорма;
	
КонецФункции

Функция Модуль_Платформа() Экспорт 
	
	Если _МодульПлатформа = Неопределено Тогда
		_МодульПлатформа = ПолучитьФормуОбработки("Модуль_Платформа", ЭтаФорма);
		ПараметрыФормы = Неопределено;
		_МодульПлатформа.ИнициализироватьФорму(ПараметрыФормы);
	КонецЕсли;

	Возврат _МодульПлатформа;
	
КонецФункции

// Фиксирует Данные типов Структура, Соответствие, Массив с учетом вложенности.
//
// BSLLS:TooManyReturns-off
// BSLLS:CognitiveComplexity-off
// BSLLS:CyclomaticComplexity-off
// BSLLS:IfElseIfEndsWithElse-off
// BSLLS:IfConditionComplexity-off
// BSLLS:DuplicateStringLiteral-off
//
// Параметры:
//  Данные - Структура
//         - Соответствие
//         - Массив - коллекции, значения которых являются примитивными типами,
//           хранилищем значения или не могут быть изменены. Поддерживаются типы значений:
//           Булево, Строка, Число, Дата, Неопределено, УникальныйИдентификатор, Null, Тип,
//           ХранилищеЗначения, ОбщийМодуль, ОбъектМетаданных, ТипЗначенияXDTO, ТипОбъектаXDTO,
//           ЛюбаяСсылка.
//
// Возвращаемое значение:
//  ФиксированнаяСтруктура, ФиксированноеСоответствие, ФиксированныйМассив - фиксированные данные, аналогичные
//    переданным в параметре Данные.
// 
//&НаКлиентеНаСервереБезКонтекста
Функция ФиксированныеДанныеЛок(Данные)
	
	Если ТипЗнч(Данные) = Тип("Массив")
		Или ТипЗнч(Данные) = Тип("ФиксированныйМассив") Тогда
		Массив = Новый Массив;
		
		Для Каждого Значение Из Данные Цикл
			
			Если ТипЗнч(Значение) = Тип("Структура")
				Или ТипЗнч(Значение) = Тип("Соответствие")
				Или ТипЗнч(Значение) = Тип("Массив")
				Или ТипЗнч(Значение) = Тип("ФиксированныйМассив") Тогда
				
				Массив.Добавить(ФиксированныеДанныеЛок(Значение));
				
			Иначе
				Массив.Добавить(Значение);
			КонецЕсли;
		КонецЦикла;
		
		Возврат Новый ФиксированныйМассив(Массив);
		
	ИначеЕсли ТипЗнч(Данные) = Тип("Структура")
		Или ТипЗнч(Данные) = Тип("Соответствие") Тогда
		
		Если ТипЗнч(Данные) = Тип("Структура") Тогда
			Коллекция = Новый Структура;
		Иначе
			Коллекция = Новый Соответствие;
		КонецЕсли;
		
		Для Каждого КлючИЗначение Из Данные Цикл
			Значение = КлючИЗначение.Значение;
			
			Если ТипЗнч(Значение) = Тип("Структура")
			 ИЛИ ТипЗнч(Значение) = Тип("Соответствие")
			 ИЛИ ТипЗнч(Значение) = Тип("Массив") Тогда
				
				Коллекция.Вставить(
					КлючИЗначение.Ключ, ФиксированныеДанныеЛок(Значение));
			Иначе
				Коллекция.Вставить(КлючИЗначение.Ключ, Значение);
			КонецЕсли;
		КонецЦикла;
		
		Если ТипЗнч(Данные) = Тип("Структура") Тогда
			Возврат Новый ФиксированнаяСтруктура(Коллекция);
		Иначе
			Возврат Новый ФиксированноеСоответствие(Коллекция);
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат Данные;
	
	// BSLLS:TooManyReturns-on
	// BSLLS:CognitiveComplexity-on
	// BSLLS:CyclomaticComplexity-on
	// BSLLS:IfElseIfEndsWithElse-on
	// BSLLS:IfConditionComplexity-on
	// BSLLS:DuplicateStringLiteral-on
	
КонецФункции // ФиксированныеДанные

Функция ОбработкаОбъект()

	Возврат ЭтотОбъект;
	
КонецФункции

Функция ИмяТекущейФормы() Экспорт 
	
	Возврат "Форма";
	
КонецФункции

Функция ИдентификаторОсновнойФормы() Экспорт
	
	Возврат ИдентификаторФормы;
	
КонецФункции

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

// }	СЕРВИСНЫЕ МЕТОДЫ


//{		МЕТОДЫ ИНТЕРАКТИВНОЙ РАБОТЫ

Функция смв() Экспорт 
	
	Возврат ЭтаФорма;
	
КонецФункции

Процедура мОткрытьФорму(мИмяФормы, 
						ПараметрыФормы = Неопределено, 
						ОписаниеОповещения = Неопределено, 
						Владелец = Неопределено, 
						КлючФормы = Неопределено) Экспорт
	
	Если ОписаниеОповещения <> Неопределено Тогда
		ОткрытьФормуДиадокМодально(мИмяФормы, ЭтаФорма, ПараметрыФормы, ОписаниеОповещения);
		Возврат;
	КонецЕсли;
	
	// BSLLS:GetFormMethod-off
	Форма = ПолучитьФорму(мИмяФормы, ЭтаФорма, КлючФормы);
	// BSLLS:GetFormMethod-on
	
	Если Форма.Открыта() Тогда
		Форма.Активизировать();
	Иначе
		Если ЗначениеЗаполнено(ПараметрыФормы) Тогда
			Форма.ИнициализироватьФорму(ПараметрыФормы);
		КонецЕсли;
		Форма.Открыть();
	КонецЕсли;
	
КонецПроцедуры

Процедура ОткрытьФормуДиадокМодально(мИмяФормы,
									мВладелецФормы,
									ПараметрыФормы = Неопределено,
									ОписаниеОповещения = Неопределено,
									РежимБлокирования = Неопределено) Экспорт
	
	// BSLLS:GetFormMethod-off
	Форма = ПолучитьФорму(мИмяФормы, мВладелецФормы);
	// BSLLS:GetFormMethod-on
	
	Если ЗначениеЗаполнено(ПараметрыФормы) Тогда
		
		Форма.ИнициализироватьФорму(ПараметрыФормы);
		
	КонецЕсли;
	
	РезультатЗакрытия = Форма.ОткрытьМодально();
	
	Если ОписаниеОповещения <> Неопределено Тогда
		Выполнить("ОписаниеОповещения.Модуль." + ОписаниеОповещения.ИмяПроцедуры + "(РезультатЗакрытия, ОписаниеОповещения.ДополнительныеПараметры)");
	КонецЕсли;
	
КонецПроцедуры

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

Функция ПолучитьФормуОбработки(ИмяФормы, парамВладелецФормы = Неопределено, ПараметрыФормы = Неопределено) Экспорт
	
	Если парамВладелецФормы = Неопределено Тогда
		парамВладелецФормы = ЭтаФорма;
	КонецЕсли;
	
	// BSLLS:GetFormMethod-off
	ПолучаемаяФорма = ПолучитьФорму(ИмяФормы, парамВладелецФормы);
	// BSLLS:GetFormMethod-on
	
	Возврат ПолучаемаяФорма;
	
КонецФункции

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

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

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

Процедура ВыполнитьОбработкуОповещенияПереопределенная(ОписаниеОповещения,
														Результат = Неопределено,
														КоличествоПараметровОбработчика = 2) Экспорт
	
	Если ОписаниеОповещения = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	// Если модальность не запрещена, то в ОписаниеОповещения у нас будет Структура
	Если КоличествоПараметровОбработчика = 2 Тогда
		Выполнить("ОписаниеОповещения.Модуль." + ОписаниеОповещения.ИмяПроцедуры + "(Результат, ОписаниеОповещения.ДополнительныеПараметры)");
	ИначеЕсли КоличествоПараметровОбработчика = 1 Тогда
		Выполнить("ОписаниеОповещения.Модуль." + ОписаниеОповещения.ИмяПроцедуры + "(ОписаниеОповещения.ДополнительныеПараметры)"); 
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

Процедура ВывестиСообщениеПользователю(Текст) Экспорт

	Сообщить(Текст);
	
КонецПроцедуры

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

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

//}		МЕТОДЫ ИНТЕРАКТИВНОЙ РАБОТЫ


//{		ОСНОВНЫЕ СОБЫТИЯ ФОРМЫ

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

Процедура ПриОткрытии()
	
	ВключитьДекорациюДлительнойОперации();
	
	УстановитьЗаголовокФормы();
	
	ЗапуститьЗагрузкуМодуля();
	
КонецПроцедуры

Процедура ЗапуститьЗагрузкуМодуля()
	
	Интервал = 0.1;
	Однократно = Истина;
	
	ПодключитьОбработчикОжидания(
		"ОперацииЗапускаМодуля",
		Интервал,
		Однократно
	);
	
КонецПроцедуры

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

Процедура ИнициализироватьОсновнойМодуль()
	
	Ядро = Модуль_Ядро();
	СохраненнаяВерсияПриЗапуске = Ядро.ЗначениеНастройки_СохраненнаяВерсияМодуля();
	ЕстьСистемаХранения = СистемаХраненияОпределена();
	
КонецПроцедуры

Процедура ВыполнитьОбновлениеМодуля(Отказ)
	
	Ядро = Модуль_Ядро();

	ДвоичныеДанныеКонфигурационногоФайла = ДвоичныеДанныеКонфигурационногоФайла();
	Если ДвоичныеДанныеКонфигурационногоФайла <> Неопределено Тогда
		Ядро.КонфигурационныйФайл_ЗагрузитьПараметры(ДвоичныеДанныеКонфигурационногоФайла);
	КонецЕсли;
	
	ПодготовитьДанныеДляОбновленияМодуля();
	
	ДвоичныеДанные = ДвоичныеДанныеМодуля();
	
	Ядро.ОбновлениеМодуля_ПроверитьУстановитьПризнакМодульДоработан(
		ДвоичныеДанные,
		ДанныеДляОбновленияМодуля.ОписаниеРасположенияМодуля.Местоположение);
		
	ДополнитьДанныеДляОбновленияМодуля();
	ОбновитьМодульАвтоматически(Отказ);
	
КонецПроцедуры

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

//&НаСервере
Функция ПроверитьНаличиеУведомленийНаСервере()
	
	СостояниеУведомленийПользователя = ПолучитьСостояниеУведомлений();
	ВозможныеСостоянияУведомлений = Перечисление_СостоянияУведомленийПользователя();
	
	УстановитьОформлениеКнопкиУведомления(СостояниеУведомленийПользователя);
	
	Результат = СостояниеУведомленийПользователя <> ВозможныеСостоянияУведомлений.НетУведомлений;
	
	Возврат Результат;
	
КонецФункции

//&НаКлиенте
Процедура ПоказатьУведомленияПриЗапуске()
	
	ОписаниеОповещения = НовыйОписаниеОповещения("ПослеЗакрытияФормыУведомленияПользователя", ЭтаФорма);
	
	Платформа = Модуль_Платформа();
	Платформа.Уведомления_ОсновнаяФорма(ЭтаФорма, ОписаниеОповещения);
	
КонецПроцедуры

//&НаКлиенте
Процедура ПоказатьУведомления()
	
	Платформа = Модуль_Платформа();
	Платформа.Уведомления_ОсновнаяФорма(ЭтаФорма);
	
КонецПроцедуры

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

Функция ЦветКнопкиПоУмолчанию()
	
	Результат = Новый Цвет(243, 243, 243);
	Возврат Результат;
	
КонецФункции

//&НаКлиентеНаСервереБезКонтекста
Функция ЦветКнопкиЕстьВажныеНепрочитанные()
	
	Результат = Новый Цвет(237, 125, 125);
	Возврат Результат;
	
КонецФункции

//&НаКлиентеНаСервереБезКонтекста
Функция ЦветКнопкиЕстьНепрочитанные()
	
	Результат = Новый Цвет(250, 227, 143);
	Возврат Результат;
	
КонецФункции

//&НаКлиенте
Процедура ПослеЗакрытияФормыУведомленияПользователя(РезультатЗакрытия, ДополнительныеПараметры) Экспорт
	
	УстановитьОформлениеКнопкиУведомления(РезультатЗакрытия);
	
	ИнтервалОжидания = 0.1;
	ВыполнитьОднократно = Истина;
	
	ПодключитьОбработчикОжидания("ОбработчикПослеОткрытияФормы", ИнтервалОжидания, ВыполнитьОднократно);
	
КонецПроцедуры

// Для ОФ не используется
//
Процедура ОбработчикПослеОткрытияФормы()
	
КонецПроцедуры

//&НаСервере
Функция ПолучитьСостояниеУведомлений()
	
	Модуль_Ядро = Модуль_Ядро();
	Результат = Модуль_Ядро.УведомленияОсновнойФормы_ТекущееСостояние();
	
	Возврат Результат;
	
КонецФункции

//&НаСервере
Функция Перечисление_СостоянияУведомленийПользователя()
	
	Модуль_Ядро = Модуль_Ядро();
	
	Результат = Модуль_Ядро.Перечисление_СостоянияУведомленийПользователя();
	
	Возврат Результат;
	
КонецФункции

Процедура ОткрытьУведомленияНажатие(Элемент)
	
	Метрики_ЗаписатьНажатие_ОткрытьУведомления();
	
	ПоказатьУведомленияПриЗапуске();
	
	Метрики_ЗаписатьСтатистику_ОткрытьУведомления();
	
КонецПроцедуры

//&НаКлиенте
Процедура Метрики_ЗаписатьНажатие_ОткрытьУведомления()
	
	КатегорияМетрики = Метрика_НазваниеКатегории().ЭкстренноеУведомление;
	ДействиеМетрики = Метрика_ДействиеПоказатьУведомления();
	
	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	
КонецПроцедуры

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

//&НаКлиенте
Функция Метрика_ДействиеПоказатьУведомления()
	
	Возврат "ПоказатьУведомленияОсновнойФормы";
	
КонецФункции

Процедура МетрикиКонтур_ЗаписатьМетрику_Запуск()
	
	Если ЭтоПервыйЗапуск Тогда
		
		Ядро = Модуль_Ядро();
		Ядро.МетрикиКонтур_ЗаписатьСобытие_Запуск();
		
	КонецЕсли;
	
КонецПроцедуры

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

Процедура ЗапуститьОбновленнуюВерсиюМодуля()
	
	УстановитьНовуюВерсиюМодуля();
	
	МодульБылОбновлен = ДанныеДляОбновленияМодуля.МодульБылОбновлен;
	
	Если МодульБылОбновлен Тогда
		УведомитьПользователяОбУспешномАвтообновлении();
	КонецЕсли;
	
	Ядро = Модуль_Ядро();
	Ядро.Метрика_ДобавитьСтатистику_СистемнаяИнформация();
	
КонецПроцедуры

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

//&НаСервере
Процедура ИнициализироватьНастройку_НеПоказыватьОнбордингЛентыКонтрагентов()
	
	ОбработкаОбъект = ОбработкаОбъект();
	// BSLLS:UnusedLocalVariable-off
	// BSLLS:Typo-off
	ПоказыватьОнбордингЛентыКонтрагентов =
		НЕ ОбработкаОбъект.НастройкиПользователяПрочитать_НеПоказыватьОнбордингЛентыКонтрагентов();
	// BSLLS:Typo-on
	// BSLLS:UnusedLocalVariable-on
КонецПроцедуры

Процедура ПриЗакрытии()
	
	СохранитьНастройкиФормы();
	
	Модуль_Ядро().Метрика_ДобавитьСтатистику_ИспользованиеПМ();
	
	Модуль_Ядро().Метрика_ДобавитьПоведение_ДействиеСФормой(Метрика_НазваниеФормы(), "Инициализация модуля", Ложь);
	Модуль_Ядро().ЗавершитьРаботуЯдра();
	
	ЗавершитьРаботуМодуля();
	
	// Чтобы обработка не "зависала" в кэше, необходимо почистить ссылки на все формы.
	ФормаПрогресса = Неопределено;
	
КонецПроцедуры

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

//&НаКлиенте
Функция ДвоичныеДанныеКонфигурационногоФайла()
	
	Результат = Неопределено;
	Модуль_Ядро = Модуль_Ядро();
	
	ПутьКФайлу = Модуль_Ядро.КонфигурационныйФайл_Путь(ПараметрЗапуска);
	Если ЗначениеЗаполнено(ПутьКФайлу) Тогда
		
		Результат = Модуль_Ядро.ДвоичныеДанныеФайла(ПутьКФайлу);
		
		Если Результат = Неопределено Тогда
			Ошибка = Модуль_Ядро.Общее_ПодставитьПараметрыВСтроку("Конфигурационный файл не найден (%1)!", ПутьКФайлу);
			_ОбработатьОшибку("ЧтениеКонфигурационногоФайла", Ошибка);
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

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

Функция ДоступнаНастройкаПоказыватьЧерновики()
	
	Возврат Ложь;
	
КонецФункции

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

//&НаКлиентеНаСервереБезКонтекста
Функция СтатусПоддержкиКонфигурации_КонфигурацияПоддерживается()
	
	Возврат "Поддерживается";
	
КонецФункции

//&НаКлиентеНаСервереБезКонтекста
Функция СтатусПоддержкиКонфигурации_КонфигурацияНеПоддерживается()
	
	Возврат "НеПоддерживается";
	
КонецФункции

//&НаКлиентеНаСервереБезКонтекста
Функция СтатусПоддержкиКонфигурации_КонфигурацияУстарела()
	
	Возврат "Устарела";
	
КонецФункции

Процедура ЗаполнитьФормуИзСохраненныхНастроек()
	
	НастройкиГлавнойФормы = СохраненныеНастройкиГлавнойФормы();
	Модуль_Ядро = Модуль_Ядро();
	ИспользоватьВнутреннийДокументооборот = Модуль_Ядро.ЗначениеНастройки_ИспользоватьВнутреннийДокументооборот();
	
	РежимОтображенияПриЗапуске	= СвойствоСтруктуры(НастройкиГлавнойФормы, "РежимОтображенияПриЗапуске");
	НастройкаВыбораПериода		= СвойствоСтруктуры(НастройкиГлавнойФормы, "НастройкаВыбораПериода");
	РазмерСтраницы				= СвойствоСтруктуры(НастройкиГлавнойФормы, "РазмерСтраницы");
	НомерСтраницы				= СвойствоСтруктуры(НастройкиГлавнойФормы, "НомерСтраницы");
	ПоказыватьЗавершенные		= СвойствоСтруктуры(НастройкиГлавнойФормы, "ПоказыватьЗавершенные");
	
	Если НЕ ЗначениеЗаполнено(РежимОтображенияПриЗапуске) Тогда
		РежимОтображенияПриЗапуске = РежимыОтображения().ДляОтправки;
	КонецЕсли;
	
	Если НЕ ИспользоватьВнутреннийДокументооборот 
		И РежимОтображенияПриЗапуске = РежимыОтображения().Внутренние Тогда
		РежимОтображенияПриЗапуске = РежимыОтображения().ДляОтправки;
		РежимОтображенияДокументов = РежимОтображенияПриЗапуске;
	КонецЕсли;
	
	Если НЕ ЗначениеЗаполнено(РазмерСтраницы) Тогда
		РазмерСтраницы = 500;
	КонецЕсли;
	
	Если НЕ ЗначениеЗаполнено(НомерСтраницы) Тогда
		НомерСтраницы = 1;
	КонецЕсли;
		
КонецПроцедуры

Функция СохраненныеНастройкиГлавнойФормы()

	Результат = ХранилищеОбщихНастроек_Загрузить("НастройкиГлавнойФормы");
	Возврат Результат;
	
КонецФункции

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

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

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

Процедура СохранитьНастройкиФормы()
	
	НастройкиГлавнойФормы = Новый Структура;
	НастройкиГлавнойФормы.Вставить("РазмерСтраницы",				РазмерСтраницы);
	НастройкиГлавнойФормы.Вставить("НомерСтраницы",					НомерСтраницы);
	НастройкиГлавнойФормы.Вставить("НастройкаВыбораПериода",		НастройкаВыбораПериода);
	НастройкиГлавнойФормы.Вставить("РежимОтображенияПриЗапуске",	РежимОтображенияПриЗапуске);
	НастройкиГлавнойФормы.Вставить("ПоказыватьЗавершенные",			ПоказыватьЗавершенные);
	
	ХранилищеОбщихНастроек_Сохранить("НастройкиГлавнойФормы", НастройкиГлавнойФормы);
	
	СохранитьВидимостьКолонок(РежимОтображенияДокументов);
	
КонецПроцедуры

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

//&НаКлиенте
Процедура ПроверитьНеобходимостьПереходаСПлагинаСчетВПакете()
	
	Ядро = Модуль_Ядро();
	
	ТребуетсяВыполнитьПереходСПлагина = Ядро.КонтурПлагины_СчетВПакете_ТребуетсяВыполнитьПереходСПлагина();
	
	Если ТребуетсяВыполнитьПереходСПлагина Тогда
		ПредложитьПользователюПерейтиСПлагинаСчетВПакете();
	Иначе
		ОбработчикПослеАвторизации();
	КонецЕсли;
	
КонецПроцедуры

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

//&НаКлиенте
Процедура ПослеЗакрытияПредложенияПерейтиСПлагинаСчетВПакете(Результат, ДополнительныеПараметры = Неопределено) Экспорт
	
	КатегорияМетрики = "КонвертацияНастроекПлагинаСчетВПакете";
	
	Ядро = Модуль_Ядро();
	
	Если Результат = КодВозвратаДиалога.ОК Тогда
		
		ДействиеМетрики = "Продолжить";
		Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
		
		КонвертацияВыполнена = Ядро.КонтурПлагины_СчетВПакете_ВыполнитьПереходСПлагина();
		
		Если КонвертацияВыполнена Тогда
			Сообщить(НСтр("ru = 'Настройки плагина успешно перенесены.'"));
		КонецЕсли;
		
	Иначе
		
		Если Результат = КодВозвратаДиалога.Пропустить Тогда
			
			ДействиеМетрики = "Инструкция";
			ЗапуститьПриложение("https://support.kontur.ru/diadoc-1s8x/41609-plagin_pervichnye_dokumenty_i_schet_na_oplatu#header_43830_1");
			
		Иначе
			ДействиеМетрики = "Закрыть";
		КонецЕсли;
		
		Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
		Ядро.Метрика_ДобавитьСтатистику_ПоКонтексту(КатегорияМетрики, ДействиеМетрики);
		
	КонецЕсли;
	
	Если Результат = КодВозвратаДиалога.Пропустить Тогда
		ПредложитьПользователюПерейтиСПлагинаСчетВПакете();
	Иначе
		ОбработчикПослеАвторизации();
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

//}		ОСНОВНЫЕ СОБЫТИЯ ФОРМЫ


// {	ОБРАБОТЧИКИ ПОСЛЕ АВТОРИЗАЦИИ

//&НаКлиенте
Процедура ПослеВыбораИнтеграционногоМодуля(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
	
	ЗакрытьГлавнуюФорму();
	
КонецПроцедуры

//&НаКлиенте
Процедура ПоказатьФормуВыбораИнтеграционногоМодуляКонфигурацияНеПоддерживается()

	ОповещениеОЗакрытииФормы = НовыйОписаниеОповещения("ПослеВыбораИнтеграционногоМодуля", ЭтаФорма);
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("Сценарий", "НеподдерживаемаяКонфигурация");
	
	ОткрытьФормуДиадокМодально(
		"ФормаВыбораИМ",
		ЭтаФорма,
		ДополнительныеПараметры,
		ОповещениеОЗакрытииФормы,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца
	);
	
КонецПроцедуры

//&НаКлиенте
Процедура ПоказатьФормуВыбораИнтеграционногоМодуляКонфигурацияУстарела()

	ОповещениеОЗакрытииФормы = НовыйОписаниеОповещения("ПослеВыбораИнтеграционногоМодуля", ЭтаФорма);
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("Сценарий", "УстаревшаяКонфигурация");
	
	ОткрытьФормуДиадокМодально(
		"ФормаВыбораИМ",
		ЭтаФорма,
		ДополнительныеПараметры,
		ОповещениеОЗакрытииФормы,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца
	);
	
КонецПроцедуры

Процедура ОбработчикПослеАвторизации()
	
	ОбновитьНадписьДекорацииДлительнойОперации();
	
	Ядро = Модуль_Ядро();
	
	ПроверитьОбновитьТипыДокументов(СохраненнаяВерсияПриЗапуске);
	
	ТаблицаТипов = Ядро.ПредопределенныеСписки_ТипыДокументовAPI();
	
	Для Каждого СтрокаТЗ Из ТаблицаТипов Цикл
		ПредставлениеТиповДокументов.Вставить(СтрокаТЗ.TypeNamedId, СтрокаТЗ.Title);
	КонецЦикла;
	
	ОбновитьНадписьДекорацииДлительнойОперации();
	
	НовыйРежимОтображенияДокументов = Неопределено;
	ОтборПоПакету = Неопределено;
	КоличествоДокументов = 0;
	
	ОбновитьСписок(
		НовыйРежимОтображенияДокументов,
		ОтборПоПакету,
		КоличествоДокументов
	);
	
	ОбновитьНадписьДекорацииДлительнойОперации();
	
	УстановитьЗаголовокКнопкиПериода();
	УстановитьПредставлениеТекущегоПользователяДиадок(ЭтаФорма);
	
	ПоказатьКнопкуСкачатьОбновление();
	НастроитьВидимостьКнопкиНастроекДоверенности();
	ОбновитьНадписьДекорацииДлительнойОперации();
	
	НачатьПроверкуОшибокКЭП();
	
	НачатьПроверкуОшибкокМЧДПоУмолчанию();
	
	ОтключитьДекорациюДлительнойОперацииОтложенно();
	
КонецПроцедуры

//&НаСервереБезКонтекста
Функция СинонимКонфигурации()
	Возврат Метаданные.Синоним;
КонецФункции

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

Процедура ДобавитьКнопкуСкачатьОбновление(ГруппаТехподдержка)
	
	ПоложениеСправа = ГруппаТехподдержка.Лево + ГруппаТехподдержка.Ширина;
	ШиринаКнопки 	= 140;
	
	ГруппаТехподдержка.ЦветФонаКнопки	= Новый Цвет(250, 227, 143);
	ГруппаТехподдержка.Заголовок		= "Обновите модуль";
	ГруппаТехподдержка.Лево				= ПоложениеСправа - ШиринаКнопки;
	ГруппаТехподдержка.Ширина			= ШиринаКнопки;
	
	КнопкиГруппыНастроек	= ГруппаТехподдержка.Кнопки;
	КнопкаСкачатьОбновление	= КнопкиГруппыНастроек.Найти("КнопкаСкачатьОбновление");
	
	Если КнопкаСкачатьОбновление = Неопределено Тогда
		
		КоллекцияКартинок = Модуль_Ядро().БиблиотекаКартинок();
		
		ИмяКнопкиСкачатьОбновление		= "КнопкаСкачатьОбновление";
		ТипКнопкиСкачатьОбновление		= ТипКнопкиКоманднойПанели.Действие;
		СинонимКнопкиСкачатьОбновление	= НСтр("ru = 'Скачать обновление модуля'");
		ДействиеКнопкиСкачатьОбновление	= Новый Действие("КнопкаСкачатьОбновлениеНажатие");
		
		Элемент = КнопкиГруппыНастроек.Добавить(
			ИмяКнопкиСкачатьОбновление,
			ТипКнопкиСкачатьОбновление,
			СинонимКнопкиСкачатьОбновление,
			ДействиеКнопкиСкачатьОбновление
		);
		
		Элемент.Картинка = КоллекцияКартинок.КартинкаСкачатьЧерная;
		
		КнопкиГруппыНастроек.Сдвинуть(Элемент, -13);
		
	КонецЕсли;

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

Процедура УдалитьКнопкуСкачатьОбновление(ГруппаТехподдержка)
	
	ПоложениеСправа = ГруппаТехподдержка.Лево + ГруппаТехподдержка.Ширина;
	ШиринаКнопки 	= 40;
	
	ГруппаТехподдержка.ЦветФонаКнопки	= Новый Цвет(243, 243, 243);
	ГруппаТехподдержка.Заголовок		= "";
	ГруппаТехподдержка.Ширина			= ШиринаКнопки;
	ГруппаТехподдержка.Лево				= ПоложениеСправа - ШиринаКнопки;
	
	КнопкиГруппыНастроек	= ГруппаТехподдержка.Кнопки;
	КнопкаСкачатьОбновление	= КнопкиГруппыНастроек.Найти("КнопкаСкачатьОбновление");
	
	Если КнопкаСкачатьОбновление <> Неопределено Тогда
		КнопкиГруппыНастроек.Удалить(КнопкаСкачатьОбновление);
	КонецЕсли;

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

Процедура НастроитьВидимостьКнопкиНастроекДоверенности()
	
	ВидимостьКнопки = ЕстьЯщикДляДействийСДокументамиВКоторомНужнаМЧД();
	Если ВидимостьКнопки Тогда
		ДобавитьКнопкуДоверенностиВМенюНастроек();		
	Иначе
		УдалитьКнопкуДоверенностиИзМенюНастроек();
	КонецЕсли;
	
КонецПроцедуры

Процедура ДобавитьКнопкуДоверенностиВМенюНастроек()

	ИмяКнопки = "ОткрытьСписокДоверенностей";
	
	КнопкиМенюНастроек = Элементы.ГруппаНастроек.Кнопки;
	
	КнопкаДоверенности = КнопкиМенюНастроек.Найти(ИмяКнопки);
	Если КнопкаДоверенности = Неопределено Тогда
		
		КоллекцияКартинок = Модуль_Ядро().БиблиотекаКартинок();
		
		КнопкаДоверенности = КнопкиМенюНастроек.Добавить(
			ИмяКнопки,
			ТипКнопкиКоманднойПанели.Действие,
			"Доверенности",
			Новый Действие("ОткрытьСписокДоверенностей"));
			
		КнопкаДоверенности.Отображение 	= ОтображениеКнопкиКоманднойПанели.НадписьКартинка;
		КнопкаДоверенности.Картинка 	= КоллекцияКартинок.КартинкаДокументЧерная; 
		
		КнопкаКонтрагенты = КнопкиМенюНастроек.Найти("ОткрытьСписокКонтрагентов");
		Если КнопкаКонтрагенты <> Неопределено Тогда
			
			ИндексКнопкиКонтрагенты 		= КнопкиМенюНастроек.Индекс(КнопкаКонтрагенты);
			ТекущийИндексКнопкиДоверенности = КнопкиМенюНастроек.Индекс(КнопкаДоверенности);
			
			СмещениеКнопкиДоверенности = ИндексКнопкиКонтрагенты + 1 - ТекущийИндексКнопкиДоверенности;
			
			КнопкиМенюНастроек.Сдвинуть(КнопкаДоверенности, СмещениеКнопкиДоверенности);
			
		КонецЕсли;
		
	КонецЕсли;

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

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

// }	ОБРАБОТЧИКИ ПОСЛЕ АВТОРИЗАЦИИ

// {	БЫСТРЫЕ ОТБОРЫ

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

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

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

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

	ОбновитьСписок();
	
КонецПроцедуры

Процедура ОтборПоОрганизацииОчистка(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	ОчиститьЗначениеПоляОтбора(ОтборПоОрганизации);
	
	ОтборПоОрганизацииПриИзменении(Элемент);
	
КонецПроцедуры

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

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

Процедура ОтборПоКонтрагентуОчистка(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	ОчиститьЗначениеПоляОтбора(ОтборПоКонтрагенту);
	
	ОтборПоКонтрагентуПриИзменении(Элемент);
	
КонецПроцедуры

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

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

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

	ВключитьОтборПоСтатусу = ЗначениеЗаполнено(ОтборПоСтатусу);
	
	Переменные = Новый Соответствие;
	Переменные.Вставить("ВключенОтбор", ВключитьОтборПоСтатусу);
	
	Модуль_Ядро().Метрика_ДобавитьСтатистику_ПоКонтексту(КатегорияМетрики, ДействиеМетрики, , Переменные);
	
	ОбновитьСписок();
	
КонецПроцедуры

Процедура ОтборПоСтатусуОчистка(Элемент, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	
	ОтборПоСтатусу = "";
	
	ОтборПоСтатусуПриИзменении(Элемент);
	
КонецПроцедуры

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

	ВключитьОтборПоВидуПакета = ЗначениеЗаполнено(ОтборПоВидуПакета);
	
	Переменные = Новый Соответствие;
	Переменные.Вставить("ВключенОтбор", ВключитьОтборПоВидуПакета);
	
	Модуль_Ядро().Метрика_ДобавитьСтатистику_ПоКонтексту(КатегорияМетрики, ДействиеМетрики, , Переменные);
	
	ОбновитьСписок();
	
КонецПроцедуры

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

//&НаКлиенте
Процедура ПоказыватьЗавершенныеПриИзменении(Элемент)
	
	ОбновитьСписок();
	
КонецПроцедуры

Процедура ОчиститьЗначениеПоляОтбора(ЗначениеОтбора)
	
	ТипЗначения = ТипЗнч(ЗначениеОтбора);
	
	КоллекцияТипов = Новый Массив;
	КоллекцияТипов.Добавить(ТипЗначения);
	
	ОписаниеТипов = Новый ОписаниеТипов(КоллекцияТипов);
	
	ЗначениеОтбора = ОписаниеТипов.ПривестиЗначение();
	
КонецПроцедуры

// }	БЫСТРЫЕ ОТБОРЫ


// {	СОПОСТАВЛЕНИЕ КОНТРАГЕНТА

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

//&НаСервере
Функция КонтрагентСопоставленНаСервере()
	
	Результат = Модуль_Ядро().Контрагенты_КонтрагентСопоставленСЯщикомДиадок(ОтборПоКонтрагенту);
	
	Возврат Результат;
	
КонецФункции

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

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

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

//&НаКлиенте
Процедура Метрики_ЗаписатьПоведение_ЗакрытьСопоставление()
	
	НазваниеФормы = "Упрощенная форма контрагентов";
	КатегорияМетрики = Метрика_НазваниеКатегории().Закрытие;
	ДействиеМетрики = "Закрыть";
	
	Ядро = Модуль_Ядро();
	
	Ядро.Метрика_ДобавитьПоведение_НажатиеКнопки(
		НазваниеФормы,
		КатегорияМетрики,
		ДействиеМетрики
	);
	
КонецПроцедуры

// }	СОПОСТАВЛЕНИЕ КОНТРАГЕНТА


// {	НАСТРОЙКИ

//&НаКлиенте
Процедура НастройкиИсходящих(Кнопка)
	
	КатегорияМетрики = Метрика_КатегорияНастройка();
	ДействиеМетрики = "НастройкиИсходящих";
	
	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	
	ОткрытьНастройки("НастройкиИсходящих");
	
КонецПроцедуры

//&НаКлиенте
Процедура НастройкиВходящих(Кнопка)
	
	КатегорияМетрики = Метрика_КатегорияНастройка();
	ДействиеМетрики = "НастройкиВходящих";
	
	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	
	ОткрытьНастройки("НастройкиВходящих");
	
КонецПроцедуры

//&НаКлиенте
Процедура НастройкиПодключаемыйМодуль(Команда)
	
	КатегорияМетрики	= Метрика_КатегорияНастройка();
	ДействиеМетрики		= "Подключаемый модуль";

	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);

	ОткрытьНастройки("ПодключаемыйМодуль");
	
КонецПроцедуры

//&НаКлиенте
Процедура НастройкиСервисныеФункции(Команда)
	
	КатегорияМетрики	= Метрика_КатегорияНастройка();
	ДействиеМетрики		= "Сервисные функции";

	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	
	ОткрытьНастройки("СервисныеФункции");
	
КонецПроцедуры

//&НаКлиенте
Процедура НастройкиСкачиваниеДокументов(Команда)
	
	КатегорияМетрики	= Метрика_КатегорияНастройка();
	ДействиеМетрики		= "Скачивание документов";

	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	
	ОткрытьНастройки("СкачиваниеДокументов");
	
КонецПроцедуры

//&НаКлиенте
Процедура НастройкиСоединениеССервером(Команда)
	
	КатегорияМетрики	= Метрика_КатегорияНастройка();
	ДействиеМетрики		= "Соединение с сервером";

	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	
	ОткрытьНастройки("СоединениеССервером");
	
КонецПроцедуры

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

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

Процедура ОповещениеОЗакрытииФормыНастроекВызовСервера()
	
	УстановитьЗаголовокФормы();
	ПрочитатьНастройкуИспользоватьСопоставлениеПодразделений();
	ПереключитьВидимостьКолонок(РежимОтображенияДокументов);
	
	УправлениеПМ_ВыгрузитьВСервис();
	
КонецПроцедуры

//&НаСервере
Процедура ПрочитатьНастройкуИспользоватьСопоставлениеПодразделений()
	
	Ядро = Модуль_Ядро();
	ИспользоватьСопоставлениеПодразделений = Ядро.ЗначениеНастройки_ИспользоватьСопоставлениеПодразделений();
	
КонецПроцедуры

Процедура ЗакрытьГлавнуюФорму()
	
	Закрыть();
	
КонецПроцедуры

Процедура ОткрытьСлужебныеСообщения(Команда)
	
	КатегорияМетрики	= Метрика_КатегорияНастройка();
	ДействиеМетрики		= "Служебные сообщения";

	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	
	ОткрытьФормуСпискаОшибок();
	
КонецПроцедуры

//&НаКлиенте
Процедура ОткрытьСписокОрганизаций(Команда)
	
	КатегорияМетрики	= Метрика_КатегорияНастройка();
	ДействиеМетрики		= "Организации";

	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	
	мОткрытьФорму("Организации_ФормаСписка");
	
КонецПроцедуры

//&НаКлиенте
Процедура ОткрытьСписокКонтрагентов(Команда)
	
	КатегорияМетрики	= Метрика_КатегорияНастройка();
	ДействиеМетрики		= "Контрагенты";
	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	
	ОткрытьСписокКонтрагентовЗавершение();
	
КонецПроцедуры

//&НаКлиенте
Процедура ОткрытьПоискНовыхКонтрагентов(Команда)
	
	КатегорияМетрики	= Метрика_КатегорияНастройка();
	ДействиеМетрики		= "Контрагенты";
	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	
	ОткрытьПоискНовыхКонтрагентовЗавершение();
	
КонецПроцедуры

Функция Организации_СписокОрганизацийДляВыбора(ДобавитьНеоплаченные = Ложь)
	
	Модуль_Ядро = Модуль_Ядро();
	Результат = Модуль_Ядро.Организации_СписокОрганизацийДляВыбора(ДобавитьНеоплаченные);
	
	Возврат Результат;
	
КонецФункции

Функция Организации_ИдентификаторПоССылке(ОрганизацияИБ)
	
	Модуль_Ядро = Модуль_Ядро();
	Результат = Модуль_Ядро.Организации_ИдентификаторПоССылке(ОрганизацияИБ);
	
	Возврат Результат;
	
КонецФункции

//&НаКлиенте
Процедура ОткрытьФормуСпискаКонтрагентовМодально() Экспорт
	
	ОткрытьСписокКонтрагентовЗавершение();
	
КонецПроцедуры

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

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

	Возврат Результат; 
	
КонецФункции

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

// Открывает список контрагентов в режиме выбора значения
//
// Параметры:
//  Организация - Строка - Идентификатор организации (BoxId)
//  ПараметрВладелец - ФормаКлиентскогоПриложения - (Необязательный) форма-владелец
//  ОповеститьОЗакрытии - Булево - (Необязательный) указывает нужно ли вызывать оповещение, при закрытии формы
//  ОбработчикЗакрытия - ОписаниеОповещения - (Необязательный) описание оповещения о закрытии формы
//
Процедура Контрагенты_ВыбратьКонтрагента(Организация = Неопределено, Знач ПараметрВладелец = Неопределено, 
		ОповеститьОЗакрытии = Ложь, ОбработчикЗакрытия = Неопределено) Экспорт
	
	РежимСпискаКА = "ВашиКонтрагенты";
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ОтборПоОрганизации", Организация);
	ПараметрыФормы.Вставить("ТекущийРежимСписка", РежимСпискаКА);
	ПараметрыФормы.Вставить("ЗакрыватьПриЗакрытииВладельца", Истина);
	ПараметрыФормы.Вставить("РежимВыбораИзСписка", Истина);
	ПараметрыФормы.Вставить("ОповеститьОЗакрытии", ОповеститьОЗакрытии);
	
	КлючУникальностиФормы = РежимСпискаКА;
	ИмяФормыСпискаКА = "Контрагенты_ФормаСпискаV2";
	
	Если ПараметрВладелец = Неопределено Тогда
		ПараметрВладелец = ЭтаФорма;
	КонецЕсли;
	
	мОткрытьФорму(
		ИмяФормыСпискаКА,
		ПараметрыФормы,
		ОбработчикЗакрытия,
		ПараметрВладелец,
		КлючУникальностиФормы
	);
	
КонецПроцедуры

Процедура ПодключаемыйМодуль_НачатьВыборФайла(ОписаниеОповещения) Экспорт
	
	ПараметрыВыбора = Новый Структура;
	ПараметрыВыбора.Вставить("Фильтр", "Внешняя обработка 1С:Предприятия 8 (*.epf)|*.epf");
	ПараметрыВыбора.Вставить("Заголовок", "Выберите файл подключаемого модуля");
	ПараметрыВыбора.Вставить("МножественныйВыбор", Ложь);
	
	ПоказатьДиалогВыбораФайла(
		ОписаниеОповещения,
		РежимДиалогаВыбораФайла.Открытие,
		ПараметрыВыбора
	);
	
КонецПроцедуры

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

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

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

// Открывает форму списка плагинов (менеджер или библиотека КонтурПлагины по флагу)
//
// Параметры:
//  Команда - КомандаФормы - команда формы (не используется, для совместимости).
//
//&НаКлиенте
Процедура ОткрытьСписокПлагинов(Команда)
	
	КатегорияМетрики = Метрика_КатегорияНастройка();
	ДействиеМетрики = Метрика_ДействиеОткрытьСписокПлагинов();
	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	
	Платформа = Модуль_Платформа();
	Платформа.Плагины_ПоказатьСписок();
	
КонецПроцедуры

//&НаКлиенте
Процедура СброситьНастройкиОтборов()
	
	ОбщийКонтекстКлиентСервер.АдресаСКД.Очистить();
	
КонецПроцедуры

//&НаКлиенте
Процедура ОткрытьФормуАвторизации()
	
	ПриИзмененииКонтекстаСеанса = НовыйОписаниеОповещения("ПослеЗакрытияФормыАвторизации", ЭтаФорма);
	
	Платформа = Модуль_Платформа();
	Платформа.Сеанс_РедактироватьКонтекст(ПриИзмененииКонтекстаСеанса);
	
КонецПроцедуры

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

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

//&НаКлиенте
Процедура АвторизацияЗавершение(Результат, ДополнительныеПараметры) Экспорт
	               
	ПроверитьНеобходимостьПереходаСПлагинаСчетВПакете();
	
	Справка_ПоказатьПриПервомЗапуске();
	
	УправлениеПМ_ВыгрузитьВСервис();
	
КонецПроцедуры

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

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

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

//&НаКлиенте
Процедура ПоказатьПредупреждениеКонфигурацияНеДоступнаНаТарифеСтартовом()
	
	Если СтатусПоддержкиКонфигурации = СтатусПоддержкиКонфигурации_КонфигурацияНеПоддерживается() Тогда
		
		ПредставлениеКонфигурации = СинонимКонфигурации();
		
		ТекстСообщения = НСтр(
				"ru = 'Тариф ""Стартовый"" не предусматривает работу на конфигурации
				|" + ПредставлениеКонфигурации + "
				|Для продолжения работы перейдите на тариф ""Универсальный"".'");
		
	КонецЕсли;
	
	Если СтатусПоддержкиКонфигурации = СтатусПоддержкиКонфигурации_КонфигурацияУстарела() Тогда
		
		ВерсияСовместимости = МинимальнаяВерсияПоддерживаемойКонфигурации();
		
		ТекстСообщения = НСтр(
				"ru = 'Тариф ""Стартовый"" не поддерживает работу на версиях  
				|конфигурации ниже " + ВерсияСовместимости + ". Для продолжения работы обновите 
				|конфигурацию до актуальной версии или перейдите на тариф 
				|""Универсальный"".'");
		
	КонецЕсли;
	
	Метрика_ПоказатьПредупреждениеОНеДоступностиКонфигурацииНаТарифе();
	
	ПоказатьПредупреждениеОНеДоступнойКонфигурацииТарифа(ТекстСообщения);
	
КонецПроцедуры

//&НаСервере
Функция МинимальнаяВерсияПоддерживаемойКонфигурации()
	
	МодульЯдро = Модуль_Ядро();
	
	Результат = МодульЯдро.МинимальнаяВерсияПоддерживаемойКонфигурации();
	
	Возврат Результат;
	
КонецФункции

//&НаКлиенте
Процедура ПоказатьПредупреждениеОНеДоступнойКонфигурацииТарифа(ТекстСообщения) Экспорт
	
	ЗаголовокСообщения = "";
	
	КнопкаПоУмолчанию = КодВозвратаДиалога.Отмена;
	
	СписокКнопок = Новый СписокЗначений;
	СписокКнопок.Добавить(КодВозвратаДиалога.ОК, "Узнать подробнее");
	СписокКнопок.Добавить(КнопкаПоУмолчанию, "Вернуться к выбору организаций");
	
	ИмяОбработчикаПослеВызоваВопроса = "ПослеВызоваПредупрежденияОНеДоступнойКонфигурацииТарифа";
	Таймаут = 0;
	
	ОповещениеОЗавершении = НовыйОписаниеОповещения(
		ИмяОбработчикаПослеВызоваВопроса,
		ЭтаФорма
	);
	
	ПоказатьВопросПереопределенная(
		ОповещениеОЗавершении,
		ТекстСообщения,
		СписокКнопок,
		Таймаут,
		КнопкаПоУмолчанию,
		ЗаголовокСообщения);
	
КонецПроцедуры
	
//&НаКлиенте
Процедура ПослеВызоваПредупрежденияОНеДоступнойКонфигурацииТарифа(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = КодВозвратаДиалога.ОК Тогда
		
		Метрика_УзнатьПодробнееОНеДоступностиКонфигурацииНаТарифе();
		
		АдресСсылки = "https://promo.diadoc.ru/tariff-universal";
		
		ПерейтиПоСсылке(АдресСсылки);
		
		ПоказатьПредупреждениеКонфигурацияНеДоступнаНаТарифеСтартовом();
		
	Иначе
		
		Метрика_ЗаписатьВернутьсяКВыборуОрганизаций();
		
		ОткрытьФормуАвторизации();
		
	КонецЕсли;
	
КонецПроцедуры

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

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

//&НаКлиенте
Процедура ОткрытьСписокДоверенностей(Команда) Экспорт
	
	ОткрытьФормуСпискаДоверенностей();
	
КонецПроцедуры

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

// }	НАСТРОЙКИ


// {	ТЕХПОДДЕРЖКА

//&НаКлиенте
Процедура ОткрытьБыструюНастройку(Кнопка)
	
	КатегорияМетрики = Метрика_НазваниеКатегории().БыстраяНастройка;
	ДействиеМетрики = "Мастер первого запуска";
	
	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	Модуль_Ядро().Метрика_ДобавитьСтатистику_ПоКонтексту(КатегорияМетрики, ДействиеМетрики);
	
	Платформа = Модуль_Платформа();
	Платформа.ЗапуститьНастройкуОрганизации();
	
КонецПроцедуры

//&НаКлиенте
Процедура ОткрытьРуководствоПользователя(Команда)
	
	КатегорияМетрики	= Метрика_НазваниеКатегории().Техподдержка;
	ДействиеМетрики		= "Руководство пользователя";
	
	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	Модуль_Ядро().Метрика_ДобавитьСтатистику_ПоКонтексту(КатегорияМетрики, ДействиеМетрики);
	
	ЗапуститьПриложение("https://support.kontur.ru/pages/viewpage.action?pageId=83865676");
	
КонецПроцедуры

//&НаКлиенте
Процедура ПоказатьИсториюОбновлений(Команда)
	
	КатегорияМетрики	= Метрика_НазваниеКатегории().Техподдержка;
	ДействиеМетрики		= "История обновлений";
	
	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	Модуль_Ядро().Метрика_ДобавитьСтатистику_ПоКонтексту(КатегорияМетрики, "Открытие формы", ДействиеМетрики);
	
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстОбновлений = ИсторияОбновлений();
	ТекстовыйДокумент.УстановитьТекст(ТекстОбновлений);
	ТекстовыйДокумент.ТолькоПросмотр = Истина;
	ТекстовыйДокумент.Показать("История обновлений");
	
КонецПроцедуры

//&НаКлиенте
Процедура ПровестиДиагностику(Команда)
	
	КатегорияМетрики	= Метрика_НазваниеКатегории().Техподдержка;
	ДействиеМетрики		= "Провести диагностику";
	
	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	Модуль_Ядро().Метрика_ДобавитьСтатистику_ПоКонтексту(КатегорияМетрики, ДействиеМетрики);
	
	ЗапуститьПриложение("https://help.kontur.ru/diadoc");
	
КонецПроцедуры

//&НаКлиенте
Процедура ДистанционнаяПомощь(Команда)
	
	КатегорияМетрики	= Метрика_НазваниеКатегории().Техподдержка;
	ДействиеМетрики		= "Дистанционная помощь VNC";
	
	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	Модуль_Ядро().Метрика_ДобавитьСтатистику_ПоКонтексту(КатегорияМетрики, ДействиеМетрики);
	
	ЗапуститьПриложение("https://help.kontur.ru/vnc");
	
КонецПроцедуры

//&НаКлиенте
Процедура ТелефонТехподдержки(Команда)
	
	// BSLLS:DeprecatedMessage-off
	Сообщить("Телефон поддержки 8-800-500-10-18");
	// BSLLS:DeprecatedMessage-on
	
КонецПроцедуры

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

	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	Модуль_Ядро().Метрика_ДобавитьСтатистику_ПоКонтексту(КатегорияМетрики, ДействиеМетрики);
	
	ЗапуститьПриложение("https://www.diadoc.ru/support#callback");
	
КонецПроцедуры

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

//&НаКлиенте
Процедура ОткрытьЦентрПоддержки(Команда)
	
	КатегорияМетрики = Метрика_НазваниеКатегории().Техподдержка;
	
	ЦентрПоддержки_Открыть(КатегорияМетрики);
	
КонецПроцедуры

Процедура НаписатьВТехподдержку(Команда)
	
	КатегорияМетрики	= Метрика_НазваниеКатегории().Техподдержка;
	ДействиеМетрики		= "Написать письмо в техподдержку";

	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	
	Обработчик_ОтправитьEmail();
	
КонецПроцедуры

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

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

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

Процедура Обработчик_ОтправитьEmail(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
		
	ОбработкаВыбораОрганизации = НовыйОписаниеОповещения("ОтправитьEmailПродолжение", ЭтаФорма, ДополнительныеПараметры);
	
	ВыбратьОрганизациюДляОбращения(ОбработкаВыбораОрганизации);
	
КонецПроцедуры

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

Функция ТекстовоеПредставлениеТехническойИнформации(BoxId)
	
	Ядро = Модуль_Ядро();
	ТехИнфо = Ядро.ТехническаяИнформацияV2(BoxId);
	Результат = Ядро.ТехническаяИнформацияКакТекст(ТехИнфо);
	
	Возврат Результат;
	
КонецФункции

Процедура ОтправитьEmailПродолжение(ВыбранныйЭлемент = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
	
	Если ВыбранныйЭлемент = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	
	Если НЕ ЗначениеЗаполнено(ВыбранныйЭлемент.Значение) Тогда 
		
		// вызов из формы экстренного уведомления - авторизация не пройдена, и из формы авторизации
		BoxId = "";
		РеквизитыОрганизации = Новый Структура;
		РеквизитыОрганизации.Вставить("Наименование", "");
		РеквизитыОрганизации.Вставить("ИНН", "");
		РеквизитыОрганизации.Вставить("КПП", "");
		
	Иначе
		
		BoxId = ВыбранныйЭлемент.Значение; // BoxId
		РеквизитыОрганизации = Модуль_Ядро().РеквизитыОрганизацииИзКонтекста(BoxId);
		
	КонецЕсли;
	
	ИнформацияДляТехПоддержки = Новый ТекстовыйДокумент;
	
	ИнформацияДляТехподдержки.ДобавитьСтроку("Описание проблемы:");
	ИнформацияДляТехподдержки.ДобавитьСтроку("");
	ИнформацияДляТехподдержки.ДобавитьСтроку("");
	
	ИнформацияДляТехПоддержки.ДобавитьСтроку("----------------------------");
	ВывестиИнформациюОбОрганизацииВТекстовыйДокумент(ИнформацияДляТехПоддержки, РеквизитыОрганизации);
	
	ИнформацияДляТехПоддержки.ДобавитьСтроку("----------------------------");
	ТехИнфоТекст = ТекстовоеПредставлениеТехническойИнформации(BoxId);
	ИнформацияДляТехподдержки.ДобавитьСтроку(ТехИнфоТекст);
	
	ПереводСтроки 	= "%0A";
	ТелоПисьма 		= ПереводСтроки;
	КоличествоСтрок = ИнформацияДляТехПоддержки.КоличествоСтрок();
	
	Для НомерСтроки = 1 По КоличествоСтрок Цикл 
		
		ТекСтрока 	= ИнформацияДляТехПоддержки.ПолучитьСтроку(НомерСтроки);
		ТекСтрока 	= СтрЗаменить(ТекСтрока, "\"	, "%2F");
		ТекСтрока 	= СтрЗаменить(ТекСтрока, """"	, "%22");
		
		ТелоПисьма 	= ТелоПисьма + ПереводСтроки + ТекСтрока;
		
	КонецЦикла;
	
	Гиперссылка = "mailto:[кому]?subject=[тема]&body=[тело]";
	Гиперссылка = СтрЗаменить(Гиперссылка, "[кому]", "diadoc@skbkontur.ru");
	Гиперссылка = СтрЗаменить(Гиперссылка, "[тема]", "Диадок. Модуль 1С");
	Гиперссылка = СтрЗаменить(Гиперссылка, "[тело]", ТелоПисьма);
	
	ЗапуститьПриложение(Гиперссылка);
	
	КатегорияМетрики	= Метрика_НазваниеКатегории().Техподдержка;
	ДействиеМетрики		= "Написать письмо в техподдержку";
	
	Модуль_Ядро().Метрика_ДобавитьСтатистику_ДляОрганизации(BoxId, КатегорияМетрики, ДействиеМетрики);
	
КонецПроцедуры

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

// Добавляет в текстовый документ сведения об организации:
// Наименование, ИНН, КПП
//
// Параметры:
//  ТекстовыйДокумент - ТекстовыйДокумент - заполняемый текстовый документ
Процедура ВывестиИнформациюОбОрганизацииВТекстовыйДокумент(ТекстовыйДокумент, РеквизитыОрганизации)
	
	ТекстовыйДокумент.ДобавитьСтроку("Организация: " 	+ РеквизитыОрганизации.Наименование);
	ТекстовыйДокумент.ДобавитьСтроку("ИНН: " 			+ РеквизитыОрганизации.ИНН);
	ТекстовыйДокумент.ДобавитьСтроку("КПП: " 			+ РеквизитыОрганизации.КПП);
	
КонецПроцедуры

// Обертка для формирования ключей параметров, передаваемых в URL
//&НаКлиенте
Функция ПродуктовыйПараметр(ИмяПараметра)
	
	Возврат СтрЗаменить("scope/1CDiadoc/%ИмяПараметра%", "%ИмяПараметра%", ИмяПараметра);
	
КонецФункции

// Обертка для формирования ключей параметров, передаваемых в URL
//&НаКлиенте
Функция БазовыйПараметр(ИмяПараметра)
	
	Возврат СтрЗаменить("base/%ИмяПараметра%", "%ИмяПараметра%", ИмяПараметра);
	
КонецФункции

// Преобразует коллекцию элементов КлючИЗначение в строку параметров URI
//
// Параметры:
//  КоллекцияПараметров - Структура - коллекция элементов КлючИЗначение
// 
// Возвращаемое значение:
//  Строка - строка параметров в формате ?paramName1=paramValue1&paramName2=paramValue2&...&paramNameN=paramValueN
//&НаКлиентеНаСервереБезКонтекста
Функция СтруктуруВСтрокуПараметровURI(КоллекцияПараметров)
	
	Результат = "";
	
	Для Каждого Параметр Из КоллекцияПараметров Цикл 
		
		Если Не ЗначениеЗаполнено(Параметр.Значение) Тогда 
			Продолжить;
		КонецЕсли;
		
		Результат = Результат 
					+ "" + Параметр.Ключ
					+ "=" + СокрЛП(Параметр.Значение)
					+ "&";
		
	КонецЦикла;
	
	Если ЗначениеЗаполнено(Результат) Тогда 
		Результат = "?" + Лев(Результат, СтрДлина(Результат)-1);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

// Преобразует коллекцию элементов КлючИЗначение в строку, представляющую собой массив параметров URI
//
// Параметры:
//  КоллекцияПараметров - Структура, Соответствие - коллекция элементов КлючИЗначение
// 
// Возвращаемое значение:
//  Строка - коллекция KeyValue в формате: {"key1":"value1","key2":"value2",...,"keyN":"valueN"}
//&НаКлиентеНаСервереБезКонтекста
Функция СтруктуруВКоллекциюПараметровURI(КоллекцияПараметров)
	
	Результат = "";
	
	Для Каждого Параметр Из КоллекцияПараметров Цикл 
		
		Если Не ЗначениеЗаполнено(Параметр.Значение) Тогда 
			Продолжить;
		КонецЕсли;
		
		Ключ 		= Параметр.Ключ;
		Значение 	= СокрЛП(Параметр.Значение);
		Значение 	= СтрЗаменить(Значение, "\"	, "\\"	); // экранируем обратный слеш
		Значение 	= СтрЗаменить(Значение, """", "\"""	); // экранируем кавычки
		
		ПараметрСтрокой = """" + Ключ + """:""" + Значение + """";
		
		Результат = Результат + ПараметрСтрокой + ",";
		
	КонецЦикла;
	
	Если ЗначениеЗаполнено(Результат) Тогда 
		Результат = Лев(Результат, СтрДлина(Результат)-1);
		Результат = СтрЗаменить("{%Параметры%}", "%Параметры%", Результат);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

// }	ТЕХПОДДЕРЖКА


// {	ПОСТРАНИЧНЫЙ ПРОСМОТР СПИСКА

//&НаСервере
Процедура ОбновитьЗаголовокНомерСтраницы()
	
	НовыйЗаголовок = Строка(НомерСтраницы) + " из " + Строка(КоличествоСтраниц);
	Элементы.НомерСтраницы.Заголовок = НовыйЗаголовок;
	
КонецПроцедуры

//&НаСервере
Процедура ОбновитьКнопкиНавигацииПоСтраницам()
	
	Элементы.ПерваяСтраница.Доступность		 = ?(НомерСтраницы > 1, Истина, Ложь);
	Элементы.ПредыдущаяСтраница.Доступность	 = ?(НомерСтраницы > 1, Истина, Ложь);
	Элементы.СледующаяСтраница.Доступность	 = ?(НомерСтраницы < КоличествоСтраниц, Истина, Ложь);
	Элементы.ПоследняяСтраница.Доступность	 = ?(НомерСтраницы < КоличествоСтраниц, Истина, Ложь);
	
КонецПроцедуры

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

//&НаКлиенте
Процедура ПредыдущаяСтраница(Команда)
	
	НомерСтраницы = НомерСтраницы - 1;
	ОбновитьСтраницуСпискаДокументов();
	
КонецПроцедуры

//&НаКлиенте
Процедура СледующаяСтраница(Команда)
	
	НомерСтраницы = НомерСтраницы + 1;
	ОбновитьСтраницуСпискаДокументов();
	
КонецПроцедуры

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

//&НаКлиенте
Процедура РазмерСтраницыПриИзменении(Элемент)
	
	Если РазмерСтраницы = 0 Тогда
		РазмерСтраницы = 1;
	КонецЕсли;
	
	КатегорияМетрики	= Метрика_НазваниеКатегории().ПостраничныйПросмотр;
	ДействиеМетрики		= "Изменить показатель";

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

	ОбновитьСтраницуСпискаДокументов();
	
КонецПроцедуры

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

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

// }	ПОСТРАНИЧНЫЙ ПРОСМОТР СПИСКА


// {	ОСНОВНЫЕ ДЕЙСТВИЯ

//&НаКлиенте
Процедура ВыбратьРежимДляОтправки(Команда)
	
	КатегорияМетрики	= Метрика_НазваниеКатегории().СменаВкладки;
	ДействиеМетрики		= "Для отправки";

	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	Модуль_Ядро().Метрика_ДобавитьСтатистику_ПоКонтексту(КатегорияМетрики, ДействиеМетрики);
	
	ОбновитьКэшСопоставленныхКонтрагентов();
	
	РежимОтображения = РежимыОтображения().ДляОтправки;
	УстановитьРежимОтбораПоПериоду(РежимОтображения);
	ОбновитьСписок(РежимОтображения);
	
КонецПроцедуры

Процедура ВыбратьРежимИсходящие(Команда)
	
	КатегорияМетрики	= Метрика_НазваниеКатегории().СменаВкладки;
	ДействиеМетрики		= "Исходящие";

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

Процедура ВыбратьРежимВходящие(Команда)
	
	КатегорияМетрики	= Метрика_НазваниеКатегории().СменаВкладки;
	ДействиеМетрики		= "Входящие";

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

Процедура ВыбратьРежимВнутренние(Команда)
	
	КатегорияМетрики	= Метрика_НазваниеКатегории().СменаВкладки;
	ДействиеМетрики		= "Внутренние";

	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	Модуль_Ядро().Метрика_ДобавитьСтатистику_ПоКонтексту(КатегорияМетрики, ДействиеМетрики);

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

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

Процедура УстановитьВидимостьОтбораПоКонтрагенту(РежимОтображения)
	
	Если РежимОтображения <> РежимыОтображения().Внутренние Тогда
		
		ЭлементыФормы.ВключитьОтборПоКонтрагенту.Видимость = Истина;
		ЭлементыФормы.ОтборПоКонтрагенту.Видимость = Истина;
		
	Иначе
		
		ЭлементыФормы.ВключитьОтборПоКонтрагенту.Видимость = Ложь;
		ЭлементыФормы.ОтборПоКонтрагенту.Видимость = Ложь;
		ВключитьОтборПоКонтрагенту = Ложь;
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

Процедура ВыделениеДокументов(Элемент)
	
	УстановитьФлажки = ЕстьВыбранныеСтрокиСпискаДокументов();
	
	ОбработатьВыделениеДокументов(УстановитьФлажки);
	
КонецПроцедуры

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

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

	ОткрытьФормуНовогоПакета();
	
КонецПроцедуры

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

//&НаКлиенте
Процедура НетНужногоДокумента(Команда)
	
	Метрика_НетНужногоДокумента();
	
	ПоказатьФормуНетНужногоДокумента();
	
КонецПроцедуры

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

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

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

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

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

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

//&НаКлиенте
Процедура ОбновитьГлавныйСписок()
	
	ИмяСобытия = "Диадок_ОбновитьГлавныйСписок";
	ПараметрыОповещения = Неопределено;
	ИсточникОповещения = ИдентификаторОсновнойФормы();
	
	Оповестить(
		ИмяСобытия,
		ПараметрыОповещения,
		ИсточникОповещения
	);
	
КонецПроцедуры
//&НаКлиенте
Процедура Переотправка(Команда)
	
	Метрика_Переотправка();
	
	ПоказатьФормуПереотправка();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

//&НаКлиенте
Процедура СписокДокументов_ПриВыбореСтатусаЭПД(ВыбраннаяСтрока)
	
	Метрика_ПриНажатииНаГиперссылкуСтатусаЭПД();
	
	Ядро = Модуль_Ядро();
	
	ДанныеСтроки = Новый_СтруктураДанныхСтрокиСписка(ВыбраннаяСтрока);
	
	РежимыОтображения = РежимыОтображения();
	ДляРазделаОтправки = (РежимОтображенияДокументов = РежимыОтображения.ДляОтправки);

	ДокументыУчета = Ядро.Пакеты_УчетныеДокументыСОснованиямиПоСтрокеСписка(
		ДанныеСтроки,
		ДляРазделаОтправки);
	
	Ядро.КонтурЛогистика_ОткрытьПеревозочныеДокументы(ЭтаФорма, ДокументыУчета);
	
КонецПроцедуры

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

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

//&НаКлиенте
Функция ВыбратьФайлыДляДобавленияВПакет() 
	
	Результат = Новый Массив;

	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Заголовок			= "Выберите файл";
	Диалог.ПолноеИмяФайла		= ""; 
	Диалог.Фильтр				= НСтр("ru = 'Все файлы(*.*)|*.*'"); 
    Диалог.МножественныйВыбор	= Истина;
	
	Если Диалог.Выбрать() Тогда
		Результат = Диалог.ВыбранныеФайлы;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

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

Процедура СписокДокументовСортироватьПоВозрастанию(Команда)
	
	СписокДокументовСортировать("Возр");
	
КонецПроцедуры

Процедура СписокДокументовСортироватьПоУбыванию(Команда)

	СписокДокументовСортировать("Убыв");
	
КонецПроцедуры

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

//&НаКлиенте
Процедура УбратьИконкиПакета()
	
	Для Каждого СтрокаСписка Из СписокДокументов Цикл
		СтрокаСписка.ИндексИконкиПакета = 0;
	КонецЦикла;

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

Процедура ВыполнитьОбмен(Команда)

	КатегорияМетрики	= Метрика_НазваниеКатегории().ОбменССервером;
	ДействиеМетрики		= "Обмен с сервером";
	
	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);

	ВыполнитьОбменССерверомСФормойПрогресса();
	
КонецПроцедуры

Функция ПроверитьАвторизациюСлужебногоПользователяНаСервере()
	
	Ядро = Модуль_Ядро();
	
	ЛогинДляОбмена = Ядро.ОбщиеНастройки_Прочитать("СлужебнаяУчетнаяЗаписьЛогин");
	ПарольДляОбмена = Ядро.ОбщиеНастройки_Прочитать("СлужебнаяУчетнаяЗаписьПароль");
	
	Результат = Ядро.Авторизация_ПроверкаАвторизации(Неопределено, ЛогинДляОбмена, ПарольДляОбмена);
	
	Возврат Результат;
	
КонецФункции

Процедура ВыполнитьОбменССерверомСФормойПрогресса() Экспорт
	
	СформироватьИзвещенияОПолучении();
	
	СформироватьОтменуФиксацииГИСМТ();
	
	Ядро = Модуль_Ядро();
	
	Ядро.ВнешнееХранение_ВыполнитьОчисткуУстаревшихДокументов();
	
	Если ОбщийКонтекстКлиентСервер.ИспользоватьСлужебнуюУчетнуюЗапись 
		 И Не ПроверитьАвторизациюСлужебногоПользователяНаСервере() Тогда 
			
		ТекстОшибкиАвторизации	= "В настройках введен неверный логин или пароль.
								  |Не удалось выполнить обмен с сервером.";
					  
		ПоказатьПредупреждениеОбОшибкеАвторизацииСлужебногоПользователя(ТекстОшибкиАвторизации);
		
		Возврат;	
		
	КонецЕсли;
	
	КоличествоОрганизаций = КонтекстСеансаКлиентСервер.Количество();
		
	ОрганизацииСОшибкамиАвторизации	= Новый Массив;
	СчетчикОрганизаций				= 0;
	
	Для Каждого СтрокаКонтекста Из КонтекстСеансаКлиентСервер Цикл
		
		Если НЕ СтрокаКонтекста.Значение.Свойство("ОрганизацияДиадок") Тогда
			Продолжить;
		КонецЕсли;
		
		BoxId = СтрокаКонтекста.Ключ;
		
		КатегорияМетрики	= Метрика_НазваниеКатегории().ОбменССервером;
		ДействиеМетрики		= "Обмен с сервером";

		Ядро.Метрика_ДобавитьСтатистику_ДляОрганизации(BoxId, КатегорияМетрики, ДействиеМетрики);
		
		СчетчикОрганизаций	= СчетчикОрганизаций + 1;
		ОрганизацияДиадок	= СтрокаКонтекста.Значение.ОрганизацияДиадок;
		
		ФормаПрогресса = Форма_ПрогрессВыполнения();
		ФормаПрогресса.МассоваяОбработка = Истина;
		ФормаПрогресса.УстановитьЗаголовок("Синхронизация (" + СчетчикОрганизаций + " из " + КоличествоОрганизаций + "): " + ОрганизацияДиадок);
		ФормаПрогресса.УстановитьЗначениеПрогресса(0);
		ФормаПрогресса.СброситьНадписи();
		
		Если СтрокаКонтекста.Значение.ПраваПользователя.DocumentAccessLevel <> "AllDocuments"
			И Не ОбщийКонтекстКлиентСервер.ИспользоватьСлужебнуюУчетнуюЗапись Тогда 
			 
			ОрганизацииСОшибкамиАвторизации.Добавить(ОрганизацияДиадок);
			
			Продолжить;
			
		КонецЕсли;
		
		СчетчикЦикла = 0;
		
		Пока Истина Цикл
			
			ОбработкаПрерыванияПользователя();
			
			СчетчикЦикла = СчетчикЦикла + 1;
			
			ОписаниеОрганизации		= Модуль_Ядро().Организации_ЗаполненныеРеквизиты(ОрганизацияДиадок);
			ОсталосьСобытийВЯщике	= Модуль_Ядро().Лента_ОбработатьНовыеСобытияДокументов(ОписаниеОрганизации, 1);
			ВсегоИтерацийКОбработке = СчетчикЦикла + Цел(ОсталосьСобытийВЯщике / 100);
			
			ФормаПрогресса.УстановитьМаксимальноеЗначение(ВсегоИтерацийКОбработке);
			ФормаПрогресса.УвеличитьЗначениеПрогресса();
			
			Если ОсталосьСобытийВЯщике = 0 Тогда
				Прервать;
			КонецЕсли;
			
		КонецЦикла;
		
		ФормаПрогресса.Закрыть();
		
	КонецЦикла;
	
	ОбновитьГлавныйСписок();
	
	Если ОрганизацииСОшибкамиАвторизации.Количество() > 0 Тогда
		
		ТекстОшибкиАвторизации	= "Не удалось выполнить обмен с сервером.
								  |Укажите служебную учетную запись с полным доступом ко всем подразделениям организаций: ";
								  
		ОрганизацииСтрокой		= Общее_СоединитьСтроку(ОрганизацииСОшибкамиАвторизации, ", ");
		ТекстОшибкиАвторизации	= ТекстОшибкиАвторизации + ОрганизацииСтрокой;
		
		ПоказатьПредупреждениеОбОшибкеАвторизацииСлужебногоПользователя(ТекстОшибкиАвторизации);
		
	КонецЕсли;
	
КонецПроцедуры

Процедура ПоказатьПредупреждениеОбОшибкеАвторизацииСлужебногоПользователя(ТекстОшибкиАвторизации)
	
	Оповещение = НовыйОписаниеОповещения("ОбработчикОткрытьНастройкуСервисныеФункции", ЭтаФорма);

	КнопкаПерейтиКНастройке = "Перейти к настройке";
	
	КнопкиВопроса = Новый СписокЗначений;
	КнопкиВопроса.Добавить(КнопкаПерейтиКНастройке);
	КнопкиВопроса.Добавить("Закрыть");

	ПоказатьВопросПереопределенная(Оповещение, ТекстОшибкиАвторизации, КнопкиВопроса, , КнопкаПерейтиКНастройке);
	
КонецПроцедуры

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

	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	Модуль_Ядро().Метрика_ДобавитьСтатистику_ПоКонтексту(КатегорияМетрики, ДействиеМетрики);
	
	ОткрытьНастройки("СервисныеФункции");
	
КонецПроцедуры

Процедура СформироватьИзвещенияОПолучении()
	
	Перем ФормироватьУС;
	
	Ядро = Модуль_Ядро();
	
	СтрокиКонтекста = Ядро.КонтекстСеанса_СтрокиКонтекста();
	
	Для Каждого СтрокаКонтекста Из СтрокиКонтекста Цикл
		
		BoxId = СтрокаКонтекста.Значение.Ящик.Идентификатор;
		
		Если ФормироватьУС = Истина Тогда
			Прервать;
		Иначе
			ФормироватьУС = Ядро.УС_ДоступноФормированиеУниверсальныхСообщений(BoxId);
		КонецЕсли;
		
	КонецЦикла;
	
	Если ФормироватьУС = Неопределено Тогда
		СформироватьИзвещенияОПолученииУстаревшегоФормата();
	Иначе
		
		Если ФормироватьУС Тогда
			СформироватьУниверсальныеСообщенияДляИзвещенийОПолучении();
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

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

	Ядро = Модуль_Ядро();
	
	ПодготовленныеИзвещенияВсехОрганизаций = Ядро.ИоП_ПодготовитьИзвещенияОПолучении();
	Ядро.ИоП_ОтправитьИзвещенияОПолучении(ПодготовленныеИзвещенияВсехОрганизаций);
	
КонецПроцедуры

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

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

//&НаКлиенте
Процедура ВыбратьПериод(Команда)
	
	КатегорияМетрики	= Метрика_НазваниеКатегории().Фильтры;
	ДействиеМетрики		= "Период";
	
	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	Модуль_Ядро().Метрика_ДобавитьСтатистику_ПоКонтексту(КатегорияМетрики, ДействиеМетрики);

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

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

//&НаКлиенте
Процедура ОткрытьФильтры(Элемент)
	
	КатегорияМетрики	= Метрика_НазваниеКатегории().Фильтры;
	ДействиеМетрики		= "Расширенные фильтры";
	
	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	Модуль_Ядро().Метрика_ДобавитьСтатистику_ПоКонтексту(КатегорияМетрики, ДействиеМетрики);

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

Процедура ПрименитьФильтры(КомпоновщикНастроек) Экспорт
	
	КатегорияМетрики	= Метрика_НазваниеКатегории().Фильтры;
	ДействиеМетрики		= "Применить";

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

Процедура УстановитьТекущиеОтборыНаСервере(КомпоновщикНастроек)
	
	СохранитьНастройкуКомпановкиДанныхДляРежима(РежимОтображенияДокументов, КомпоновщикНастроек);
    ТаблицаОтборов_УстановитьОтборыСпискаДокументов(РежимОтображенияДокументов);
	
	ОбновитьСтраницуСпискаДокументовНаСервере();
	
	КоличествоУстановленныхФильтров = КоличествоУстановленныхФильтров();	
	УстановитьЗаголовокКнопкиФильтров(КоличествоУстановленныхФильтров);
	
КонецПроцедуры

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

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

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

Процедура СброситьЗаголовокКнопкиФильтров()	
	
	Элементы.ОткрытьФильтры.Картинка = Элементы.КартинкаФильтрыНеактивныеСкрытая.Картинка;
	Элементы.ОткрытьФильтры.Заголовок = "";
	Элементы.ОткрытьФильтры.Подсказка = НСтр("ru='Открыть фильтры'");
		
КонецПроцедуры

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

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

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

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

	ОткрытьФормуСпискаОнлайнСчетов();
	
КонецПроцедуры

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

Процедура УстановитьСтандартныеНастройкиНажатие(Кнопка)
	
	УстановитьСтандартныеНастройки();
	
КонецПроцедуры

Процедура УстановитьСтандартныеНастройки()
	
	ИмяСписка = ИмяСпискаХраненияКолонок(РежимОтображенияДокументов);
	
	ХранилищеНастроекДанныхФорм.Удалить("Диадок", "Колонки" + ИмяСписка, Неопределено);
	
	ПереключитьВидимостьКолонок(РежимОтображенияДокументов);
	
КонецПроцедуры

// }	ОСНОВНЫЕ ДЕЙСТВИЯ


// {	ДОПОЛНИТЕЛЬНЫЕ ДЕЙСТВИЯ

Процедура ЗаполнитьМенюДействий(РежимОтображенияДокументов)
	
	РежимыОтображения = РежимыОтображения();
	
	// BSLLS:UnusedLocalVariable-off
	РежимДляОтправки	= (РежимОтображенияДокументов = РежимыОтображения.ДляОтправки);
	РежимИсходящие		= (РежимОтображенияДокументов = РежимыОтображения.Исходящие);
	РежимВходящие		= (РежимОтображенияДокументов = РежимыОтображения.Входящие);
	РежимВнутренние		= (РежимОтображенияДокументов = РежимыОтображения.Внутренние);
	РежимПеревозочные	= (РежимОтображенияДокументов = РежимыОтображения.Перевозочные);
	// BSLLS:UnusedLocalVariable-on
	
	Если ИспользуетсяПодсистемаДиадок Тогда
		
		ОтключитьАнализ = Модуль_Ядро().ОбщиеНастройки_Прочитать("ОтключитьАнализДляВходящихДокументов");
		
		Если ОтключитьАнализ Тогда
			УдалитьКнопкуКоманднойПанели("КоманднаяПанельВходящие", "ГруппаАнализИОбработка");
		КонецЕсли;
		
	Иначе
		
		УдалитьКнопкуКоманднойПанели("КоманднаяПанельДляОтправки", "ВыполнитьПерезаполнениеПакета");
		
		УдалитьКнопкуКоманднойПанели("КоманднаяПанельВходящие", "ВыполнитьПометитьДокументыКакЗавершенные");
		УдалитьКнопкуКоманднойПанели("КоманднаяПанельВходящие", "ВыполнитьРасшифроватьДокументы");
		УдалитьКнопкуКоманднойПанели("КоманднаяПанельВходящие", "ГруппаАнализИОбработка");
		
	КонецЕсли;
	
	УстановитьВидимостьОтбораПоСтатусу(РежимОтображенияДокументов);
	
	ЭлементыФормы.ПоказыватьЗавершенные.Видимость	= РежимВходящие И ИспользуетсяПодсистемаДиадок;
	
	МенюДополнительныхДействий = МенюДополнительныхДействий();
	ЗаполнитьДополнительныеКнопкиИзПодключаемогоМодуля(ЭтаФорма, РежимОтображенияДокументов, МенюДополнительныхДействий);
	УдалитьПустоеМенюДополнительныхДействий(МенюДополнительныхДействий);
	
	ПоказатьТекущуюПанельОсновныхДействий();
	
КонецПроцедуры

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

Процедура УдалитьПустоеМенюДополнительныхДействий(МенюДополнительныхДействий)
	
	Если МенюДополнительныхДействий.Кнопки.Количество() = 0 Тогда
		ТекущаяКоманднаяПанель().Кнопки.Удалить(МенюДополнительныхДействий);
	КонецЕсли;
	
КонецПроцедуры

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

Процедура УдалитьКнопкуКоманднойПанели(ИмяКоманднойПанели, ИмяКнопки)
	
	Кнопка = ЭлементыФормы[ИмяКоманднойПанели].Кнопки.Найти(ИмяКнопки);
	
	Если Кнопка <> Неопределено Тогда
		ЭлементыФормы[ИмяКоманднойПанели].Кнопки.Удалить(Кнопка);
	КонецЕсли;
	
КонецПроцедуры

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

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

// }	ДОПОЛНИТЕЛЬНЫЕ ДЕЙСТВИЯ


// {	МАССОВАЯ ОБРАБОТКА ДОКУМЕНТОВ

// { Создание документов

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

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

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

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

Процедура ОбработатьСоздатьДокументыВерсия2(ПараметрыОбработки) Экспорт
	
	Перем ОбщиеПараметрыОбработки;
	
	Действие			= ПараметрыОбработки.Действие;
	ДанныеДляОбработки	= ПараметрыОбработки.ДанныеДляОбработки;
	КатегорияМетрики	= ПараметрыОбработки.КатегорияМетрики;
	ДействиеМетрики		= ПараметрыОбработки.ДействиеМетрики;
	
	ПараметрыОбработки.Свойство("ДополнительныеПараметры", ОбщиеПараметрыОбработки);
	
	ПослеСозданияДокументов = НовыйОписаниеОповещения(
		"ОбработчикЗавершенияСозданияДокументовВерсия2",
		ЭтаФорма,
		ПараметрыОбработки
	);
	
	Ядро = Модуль_Ядро();
	
	ПакетыДокументов = Ядро.СгруппироватьДокументыПоПакетам(ДанныеДляОбработки);
	
	ВыполнитьМассовуюОбработкуДанных(
		"СоздатьДокументыПоПравилу",
		ПакетыДокументов,
		Действие,
		ОбщиеПараметрыОбработки,
		ПослеСозданияДокументов
	);
	
	Ядро.Метрика_ДобавитьСтатистику_МассовоеДействиеПоДокументам(КатегорияМетрики, ДействиеМетрики, ДанныеДляОбработки);
	
КонецПроцедуры

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

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

Функция НовыйАдресТаблицыСопоставленияНоменклатуры()
	
	Результат = ПоместитьВоВременноеХранилище(Неопределено);
	Возврат Результат;
	
КонецФункции

Функция ДополнительныеПараметрыСозданияДокументов()
	
	АдресВХ = НовыйАдресТаблицыСопоставленияНоменклатуры();
	
	Результат = Новый Структура;
	Результат.Вставить("АдресНоменклатурыДляСопоставления", АдресВХ);
	Результат.Вставить("ИдентификаторОперации");
	Результат.Вставить("ДополнительныеПараметры");
	
	Возврат Результат;
	
КонецФункции

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

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

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

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

Процедура СоздатьДокументы(КонтекстФункции)
	
	ИмяМетода = "Документы_СоздатьДокументы";
	
	ДокументыДляОбработки				= КонтекстФункции.Данные;
	ИдентификаторОперации				= КонтекстФункции.Параметры.ИдентификаторОперации;
	ДополнительныеПараметры				= КонтекстФункции.Параметры.ДополнительныеПараметры;
	АдресНоменклатурыДляСопоставления	= КонтекстФункции.Параметры.АдресНоменклатурыДляСопоставления;
	
	ОписаниеЗадачи = Модуль_Платформа().ДлительныеОперации_ВыполнитьВФоне(
		ИмяМетода,
		ДокументыДляОбработки,
		ИдентификаторОперации,
		ДополнительныеПараметры,
		АдресНоменклатурыДляСопоставления);
	
	ОчередьЗадач_ЗавершитьЗадачу(КонтекстФункции, ОписаниеЗадачи);
	
КонецПроцедуры

Процедура СоздатьДокументыПоПравилу(КонтекстФункции)
	
	Пакеты = КонтекстФункции.Данные;
		
	ИмяМетода = "Пакеты_СоздатьДокументыПоПравилу";
	ОписаниеЗадачи = Модуль_Платформа().ДлительныеОперации_ВыполнитьВФоне(ИмяМетода, Пакеты);
	
	ОчередьЗадач_ЗавершитьЗадачу(КонтекстФункции, ОписаниеЗадачи);
	
КонецПроцедуры

Процедура ТематическаяКартинкаНажатие(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Метрика_ТематическаяКартинкаНажатие();
	
	// BSLLS:UsingSynchronousCalls-off
	ЗапуститьПриложение(ЛендингНовыйГод);
	// BSLLS:UsingSynchronousCalls-on
	
КонецПроцедуры

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

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

//&НаКлиенте
Процедура ЗакрытОнбордингЛентыКонтрагентов(Результат, ДополнительныеПараметры) Экспорт
	
	 ИнициализироватьНастройку_НеПоказыватьОнбордингЛентыКонтрагентов();
	 
КонецПроцедуры


// } Создание документов


// { Сопоставление документов

//&НаКлиенте
Процедура ВыполнитьСопоставитьДокументы(Команда)
	
	КатегорияМетрики	= Метрика_НазваниеКатегории().СопоставлениеДокументов;
	ДействиеМетрики		= "Сопоставить";

	ДанныеДляОбработки = ДанныеДокументовВыделенныхСтрокТЧ();
	
	Метрика_НажатиеКнопкиПакетнойОбработки(КатегорияМетрики, ДействиеМетрики, ДанныеДляОбработки.Количество());

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

//&НаКлиенте
Процедура ОбработатьСопоставитьДокументы(ПараметрОповещения = Неопределено, ПараметрыОбработки) Экспорт
	
	Действие			= ПараметрыОбработки.Действие;
	ДанныеДляОбработки	= ПараметрыОбработки.ДанныеДляОбработки;
	КатегорияМетрики	= ПараметрыОбработки.КатегорияМетрики;
	ДействиеМетрики		= ПараметрыОбработки.ДействиеМетрики;
	
	ВыполнитьМассовуюОбработкуДанных("СопоставитьДокументы", ДанныеДляОбработки, Действие);
	
	Модуль_Ядро().Метрика_ДобавитьСтатистику_МассовоеДействиеПоДокументам(КатегорияМетрики, ДействиеМетрики, ДанныеДляОбработки);
	
КонецПроцедуры

Процедура СопоставитьДокументы(КонтекстФункции)
	
	ИмяМетода = "Документы_СопоставитьДокументы";
	ОписаниеЗадачи = Модуль_Платформа().ДлительныеОперации_ВыполнитьВФоне(ИмяМетода, КонтекстФункции.Данные);
	
	ОчередьЗадач_ЗавершитьЗадачу(КонтекстФункции, ОписаниеЗадачи);
	
КонецПроцедуры

// } Сопоставление документов


// { Анализ документов

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

//&НаКлиенте
Процедура ОбработатьАнализДокументов(ПараметрОповещения = Неопределено, ПараметрыОбработки) Экспорт
	
	Действие			= ПараметрыОбработки.Действие;
	ДанныеДляОбработки	= ПараметрыОбработки.ДанныеДляОбработки;
	
	ВыполнитьМассовуюОбработкуДанных("АнализДокументов", ДанныеДляОбработки, Действие);
		
КонецПроцедуры

Процедура АнализДокументов(КонтекстФункции)
	
	ИмяМетода = "Документы_ПровестиАнализВходящихДокументов";
	ОписаниеЗадачи = Модуль_Платформа().ДлительныеОперации_ВыполнитьВФоне(ИмяМетода, КонтекстФункции.Данные);
	
	ОчередьЗадач_ЗавершитьЗадачу(КонтекстФункции, ОписаниеЗадачи);
	
КонецПроцедуры

// } Анализ документов


// { Анализ пакетов

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

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

//&НаКлиенте
Процедура ОбработатьАнализаПакетов(ПараметрОповещения = Неопределено, ПараметрыОбработки) Экспорт
	
	Действие			= ПараметрыОбработки.Действие;
	ДанныеДляОбработки	= ПараметрыОбработки.ДанныеДляОбработки;

	ВыполнитьМассовуюОбработкуДанных("АнализПакетов", ДанныеДляОбработки, Действие);
	
КонецПроцедуры

Процедура АнализПакетов(КонтекстФункции)
	
	ИмяМетода = "Пакеты_ПровестиАнализВходящихПакетов";
	ОписаниеЗадачи = Модуль_Платформа().ДлительныеОперации_ВыполнитьВФоне(ИмяМетода, КонтекстФункции.Данные);
	
	ОчередьЗадач_ЗавершитьЗадачу(КонтекстФункции, ОписаниеЗадачи);
	
КонецПроцедуры

// } Анализ пакетов


// { Выполнить требуемые действия

//&НаКлиенте
Процедура ВыполнитьТребуемоеДействие(Команда)
	
	КатегорияМетрики	= Метрика_НазваниеКатегорииРежимаОтображения();
	ДействиеМетрики		= "Выполнить действие в 1С";

	ДанныеДляОбработки = ДанныеДокументовВыделенныхСтрокТЧ();
	
	Метрика_НажатиеКнопкиПакетнойОбработки(КатегорияМетрики, ДействиеМетрики, ДанныеДляОбработки.Количество());

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

//&НаКлиенте
Процедура ОбработатьТребуемоеДействие(ПараметрОповещения = Неопределено, ПараметрыОбработки) Экспорт
	
	Действие			= ПараметрыОбработки.Действие;
	ДанныеДляОбработки	= ПараметрыОбработки.ДанныеДляОбработки;
	КатегорияМетрики	= ПараметрыОбработки.КатегорияМетрики;
	ДействиеМетрики		= ПараметрыОбработки.ДействиеМетрики;
	
	ВыполнитьМассовуюОбработкуДанных("ТребуемоеДействие", ДанныеДляОбработки, Действие);
	
	Модуль_Ядро().Метрика_ДобавитьСтатистику_МассовоеДействиеПоДокументам(КатегорияМетрики, ДействиеМетрики, ДанныеДляОбработки);
	
КонецПроцедуры

Процедура ТребуемоеДействие(КонтекстФункции)
	
	ИмяМетода = "Документы_ВыполнитьТребуемоеДействиеПоВходящимДокументам";
	ОписаниеЗадачи = Модуль_Платформа().ДлительныеОперации_ВыполнитьВФоне(ИмяМетода, КонтекстФункции.Данные);
	
	ОчередьЗадач_ЗавершитьЗадачу(КонтекстФункции, ОписаниеЗадачи);
	
КонецПроцедуры

// } Выполнить требуемые действия


// { Пометка документов завершенными

//&НаКлиенте
Процедура ВыполнитьПометитьДокументыКакЗавершенные(Команда)
	
	КатегорияМетрики	= Метрика_НазваниеКатегорииРежимаОтображения();
	ДействиеМетрики		= "Пометить как завершенный";

	ДанныеДляОбработки = ДанныеДокументовВыделенныхСтрокТЧ();
	
	Метрика_НажатиеКнопкиПакетнойОбработки(КатегорияМетрики, ДействиеМетрики, ДанныеДляОбработки.Количество());

	ПараметрыОбработки = Новый_ПараметрыГрупповойОбработки(ДанныеДляОбработки, ДействияЭДО().ПометитьКакЗавершенный, КатегорияМетрики, ДействиеМетрики);
	
	ПолучитьСогласиеНаГрупповуюОбработкуВыделенныхСтрок("ОбработатьПометитьДокументыКакЗавершенные", ПараметрыОбработки);
	
КонецПроцедуры

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

Процедура ПометитьДокументыКакЗавершенные(КонтекстФункции)
	
	ИмяМетода = "ХранениеДанных_ОбновлениеРеквизитовДокументов";
	
	ОписаниеЗадачи = Модуль_Платформа().ДлительныеОперации_ВыполнитьВФоне(
		ИмяМетода,
		КонтекстФункции.Данные,
		КонтекстФункции.Параметры);
	
	ОчередьЗадач_ЗавершитьЗадачу(КонтекстФункции, ОписаниеЗадачи);
	
КонецПроцедуры

// } Пометка документов завершенными


// { Расшифровка

//&НаКлиенте
Процедура ВыполнитьРасшифроватьДокументы(Команда)
	
	КатегорияМетрики	= Метрика_НазваниеКатегорииРежимаОтображения();
	ДействиеМетрики		= "Расшифровать";

	ДанныеДляОбработки = ДанныеДокументовВыделенныхСтрокТЧ();
	
	Метрика_НажатиеКнопкиПакетнойОбработки(КатегорияМетрики, ДействиеМетрики, ДанныеДляОбработки.Количество());

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

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

//&НаКлиенте
Процедура ОбработатьРасшифроватьДокументы(ПараметрОповещения = Неопределено, ПараметрыОбработки) Экспорт
	
	Действие			= ПараметрыОбработки.Действие;
	ДанныеДляОбработки	= ПараметрыОбработки.ДанныеДляОбработки;
	КатегорияМетрики	= ПараметрыОбработки.КатегорияМетрики;
	ДействиеМетрики		= ПараметрыОбработки.ДействиеМетрики;
	
	ВыполнитьМассовуюОбработкуДанных("РасшифроватьДокументы", ДанныеДляОбработки, Действие);
	
	Модуль_Ядро().Метрика_ДобавитьСтатистику_МассовоеДействиеПоДокументам(КатегорияМетрики, ДействиеМетрики, ДанныеДляОбработки);
	
КонецПроцедуры

Процедура РасшифроватьДокументы(КонтекстФункции)
	
	ДокументыДляРасшифровки = КонтекстФункции.Данные;
	
	Для каждого Документ Из ДокументыДляРасшифровки Цикл
	
		ХранилищеКонтента = Модуль_Ядро().Документы_Расшифровать(Документ.Идентификаторы);
	
	КонецЦикла;
	
	ОчередьЗадач_ЗавершитьЗадачу(КонтекстФункции);
	
КонецПроцедуры

// } Расшифровка


// { Сохранение документов на диск

Процедура ВыполнитьСохранитьДокумент(Команда)
	
	КатегорияМетрики	= Метрика_НазваниеКатегории().СкачиваниеДокументов;
	ДействиеМетрики		= "Скачать документы";

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

//&НаКлиенте
Процедура ОбработатьСохранитьДокумент(ПараметрОповещения = Неопределено, ПараметрыОбработки) Экспорт
	
	Действие			= ПараметрыОбработки.Действие;
	ДанныеДляОбработки	= ПараметрыОбработки.ДанныеДляОбработки;
	КатегорияМетрики	= ПараметрыОбработки.КатегорияМетрики;
	ДействиеМетрики		= ПараметрыОбработки.ДействиеМетрики;
	
	ВыполнитьМассовуюОбработкуДанных("СохранитьДокументы", ДанныеДляОбработки, Действие);
	
	Модуль_Ядро().Метрика_ДобавитьСтатистику_МассовоеДействиеПоДокументам(КатегорияМетрики, ДействиеМетрики, ДанныеДляОбработки);
	
КонецПроцедуры

Процедура СохранитьДокументы(КонтекстФункции)
	
	ИмяМетода = "Сохранение_СохранитьДокументы";
	ДокументыДляОбработки = ОчередьЗадач_ВыгрузитьДокументыИзМассиваПакетов(КонтекстФункции.Данные);
	
	ОписаниеЗадачи = Модуль_Платформа().ДлительныеОперации_ВыполнитьВФоне(ИмяМетода, ДокументыДляОбработки);
	
	ОчередьЗадач_ЗавершитьЗадачу(КонтекстФункции, ОписаниеЗадачи);
	
КонецПроцедуры

// } Сохранение документов на диск


// { Получение печатных форм

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

	ДанныеДляОбработки = ДанныеДокументовВыделенныхСтрокТЧ(Истина);
	
	Метрика_НажатиеКнопкиПакетнойОбработки(КатегорияМетрики, ДействиеМетрики, ДанныеДляОбработки.Количество());

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

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

Процедура ПолучитьПечатнуюФормуСервераДиадок(Документ) Экспорт
	
	ДвоичныеДанныеПечатнойФормы = Модуль_Ядро().Документы_ПечатнаяФормаСервераДиадок(Документ.Идентификаторы);
	
	Модуль_Ядро().Метрика_ДобавитьСтатистику_СкачиваниеДокументов("Получить печатную форму", Документ);
	
	Если ТипЗнч(ДвоичныеДанныеПечатнойФормы) = Тип("ДвоичныеДанные") Тогда
		
		ПредставлениеДокумента = Модуль_Ядро().Документы_ПредставлениеДокумента(Документ);
		
		ИмяФайлаПечатнойФормы = ПредставлениеДокумента + " - " + Документ.Идентификаторы.DocumentId + ".pdf";
		ИмяФайлаПечатнойФормы = ЗаменитьНедопустимыеСимволыИмениФайла(ИмяФайлаПечатнойФормы);
		
		#Если ВебКлиент Тогда
			
			АдресПечатнойФормы = ПоместитьВоВременноеХранилище(ДвоичныеДанныеПечатнойФормы, УникальныйИдентификатор);
			
			ПолучитьФайл(АдресПечатнойФормы, ИмяФайлаПечатнойФормы, Истина);
			
		#Иначе
			
			ПутьКФайлуПечатнойФормы = КаталогВременныхФайлов() + ИмяФайлаПечатнойФормы;
			
			ДвоичныеДанныеПечатнойФормы.Записать(ПутьКФайлуПечатнойФормы);
			
			ЗапуститьПриложение(ПутьКФайлуПечатнойФормы);
			
		#КонецЕсли
		
	Иначе
		
		ОчиститьСообщения();
		Сообщить("Печатная форма не сформирована!", СтатусСообщения.Важное);
		
	КонецЕсли;
	
КонецПроцедуры

// } Получение печатных форм


// { Передача в подразделение

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

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

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

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

Процедура ПередатьВПодразделение(КонтекстФункции)
	
	ИмяМетода = "Документы_ПереместитьМассивДокументовВПодразделение";
	ДокументыДляОбработки = ОчередьЗадач_ВыгрузитьДокументыИзМассиваПакетов(КонтекстФункции.Данные);
	
	ОписаниеЗадачи = Модуль_Платформа().ДлительныеОперации_ВыполнитьВФоне(
		ИмяМетода,
		КонтекстФункции.Параметры.BoxId,
		КонтекстФункции.Параметры.DepartmentId,
		ДокументыДляОбработки);
	
	ОчередьЗадач_ЗавершитьЗадачу(КонтекстФункции, ОписаниеЗадачи);
	
КонецПроцедуры

// } Передача в подразделение


// { Согласование

//&НаКлиенте
Процедура ВыполнитьПередатьНаСогласование(Команда)
	
	ВыполнитьДействиеПоМаршрутизации(ДействияЭДО().ПередатьНаСогласование);
	
КонецПроцедуры

//&НаКлиенте
Процедура ВыполнитьПередатьНаПодпись(Команда)
	
	ВыполнитьДействиеПоМаршрутизации(ДействияЭДО().ПередатьНаПодпись);
	
КонецПроцедуры

//&НаКлиенте
Процедура ВыполнитьПередатьПоМаршруту(Команда)
	
	ВыполнитьДействиеПоМаршрутизации(ДействияЭДО().ПередатьПоМаршруту);
	
КонецПроцедуры

//&НаКлиенте
Процедура ВыполнитьСогласовать(Команда)
	
	ВыполнитьДействиеПоМаршрутизации(ДействияЭДО().Согласование);
	
КонецПроцедуры

//&НаКлиенте
Процедура ВыполнитьОтказатьВСогласовании(Команда)
	
	ВыполнитьДействиеПоМаршрутизации(ДействияЭДО().ОтказВСогласовании);
	
КонецПроцедуры

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

	ПараметрыОбработки = Новый_ПараметрыГрупповойОбработки(ДанныеДляОбработки, Действие, КатегорияМетрики, ДействиеМетрики);
	ПараметрыОбработки.Вставить("ДокументыОтправлены", ДокументыОтправлены);

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

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

Процедура ОткрытьФормуСогласования(ПараметрыОбработки)
	
	ОписаниеОповещения = НовыйОписаниеОповещения("ФормаСогласованияПослеЗакрытия", ЭтаФорма, ПараметрыОбработки);
	
	ПараметрыФормы = Новый Структура("BoxId, Действие", ПараметрыОбработки.BoxId, ПараметрыОбработки.Действие);
	ОткрытьФормуДиадокМодально("Согласование", ЭтаФорма, ПараметрыФормы, ОписаниеОповещения);
	
КонецПроцедуры

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

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

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

Процедура ОтправитьДокументыНаМаршрутизацию(КонтекстФункции)
	
	ИмяМетода = "Пакеты_МаршрутизироватьДокументыПакетов";
	ОписаниеЗадачи = Модуль_Платформа().ДлительныеОперации_ВыполнитьВФоне(ИмяМетода, КонтекстФункции.Данные);
	
	ОчередьЗадач_ЗавершитьЗадачу(КонтекстФункции, ОписаниеЗадачи);
	
КонецПроцедуры

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

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

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

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

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

// } Согласование


// { Аннулирование

//&НаКлиенте
Процедура ВыполнитьАннулировать(Команда) Экспорт
	
	ВыполнитьДействиеПоАннулированию(ДействияЭДО().Аннулировать);
	
КонецПроцедуры

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

	ВыполнитьДействиеПоАннулированию(ДействияЭДО().ОтказатьВАннулировании);
	
КонецПроцедуры

Процедура ВыполнитьДействиеПоАннулированию(Действие)
	
	КатегорияМетрики	= Метрика_НазваниеКатегорииРежимаОтображения();
	ДействиеМетрики		= Метрика_НазваниеДействияАннулирования(Действие);

	ДанныеДляОбработки = ДанныеДокументовВыделенныхСтрокТЧ(, Истина);

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

Процедура ОбработатьДействиеПоАннулированию(ПараметрОповещения = Неопределено, ПараметрыОбработки) Экспорт
	
	ОбработкаАннулирования(ПараметрыОбработки);
	
КонецПроцедуры

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

Функция ПараметрыФормыАннулированияОтказаВАннулировании(Действие, КоличествоДокументов, КоличествоДоступныхДокументов, ПараметрыОбработки)

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

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

// } Аннулирование


// { Отправка пакетов

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

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

				Сообщить(ТекстСообщения, СтатусСообщения.Информация);
				Результат = Ложь;
				
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

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

Процедура ПоказатьПредупреждениеОбОтсутствииПравНаФормированиеУС(ЯщикиБезПраваНаФормированиеУС)
    
	ТекстHTML = HTML_ПредупреждениеОбОтсутствииПравНаФормированиеУС(ЯщикиБезПраваНаФормированиеУС);
	
	ПараметрыОткрытияФормы = Новый Структура;
	ПараметрыОткрытияФормы.Вставить("ТекстСообщения", ТекстHTML);
	
	ОповещениеОЗакрытииФормы = Неопределено;
	
	ОткрытьФормуДиадокМодально(
		"ФормаHTMLСообщения",
		ЭтаФорма,
		ПараметрыОткрытияФормы,
		ОповещениеОЗакрытииФормы,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца
		);
	
КонецПроцедуры

//&НаКлиенте
Функция ТребуетсяПодписьДокументов(ВыбранныеДокументы)
	
	Результат = Ложь;
	
	Для Каждого ВыбранныйДокумент Из ВыбранныеДокументы Цикл
		Если Не ВыбранныйДокумент.Шаблон Тогда
			Результат = Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

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

Процедура ПакетДляОтправки(КонтекстФункции)
	
	Пакеты = КонтекстФункции.Данные;
	ПараметрыСогласования = КонтекстФункции.Параметры;
	
	ТекущаяОперация = ДлительныеОперации_ПодготовитьПакетыДляОтправки(Пакеты);
	
	КонтекстФункции.Очистить();
	КонтекстФункции.Вставить("Обработчик",				"ОтправитьПакет");
	КонтекстФункции.Вставить("ТекущаяОперация",			ТекущаяОперация);
	КонтекстФункции.Вставить("ПараметрыСогласования",	ПараметрыСогласования);
	
КонецПроцедуры

Функция ДлительныеОперации_ПодготовитьПакетыДляОтправки(Знач Пакеты)
	
	ИмяМетода = "Пакеты_ПодготовитьПакетыДляОтправки";
	ПроверятьXDTO = Ложь;
	
	Результат = Модуль_Платформа().ДлительныеОперации_ВыполнитьВФоне(ИмяМетода, Пакеты, ПроверятьXDTO);
	
	Возврат Результат;
	
КонецФункции

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

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

	ОчередьЗадач_ЗавершитьЗадачу(КонтекстФункции, ТекущаяОперация);
	
КонецПроцедуры

// } Отправка пакетов


// { Отправка готовых ответов

//&НаКлиенте
Процедура ВыполнитьОтправитьГотовыеОтветы(Команда)
	
	КатегорияМетрики	= Метрика_НазваниеКатегорииРежимаОтображения();
	ДействиеМетрики		= "Ответить контрагенту";

	ДанныеДляОбработки	= ДанныеДокументовВыделенныхСтрокТЧ(, Истина);
	
	Метрика_НажатиеКнопкиПакетнойОбработки(КатегорияМетрики, ДействиеМетрики, ДанныеДляОбработки.Количество());

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

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

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

// } Отправка готовых ответов


// { Подписать входящие

//&НаКлиенте
Процедура ВыполнитьПодписатьВходящие(Команда)
	
	ВыполнитьПодписатьИлиОтказатьВходящие(ДействияЭДО().ПодписатьВходящий);
	
КонецПроцедуры

//&НаКлиенте
Процедура ВыполнитьПодписатьИлиОтказатьВходящие(Действие)
	
	КатегорияМетрики	= Метрика_НазваниеКатегорииРежимаОтображения();
	ДействиеМетрики		= Метрика_НазваниеДействияПодписание(Действие);
	
	ДанныеДляОбработки = ДанныеДокументовВыделенныхСтрокТЧ(, Истина);

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

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

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

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

// Для ОФ не используется
//
Функция ВыбраныТолькоФормализованныеАктыСверокСРазногласиями(ДанныеДляОбработки, ТипКонтента)
	
	Результат = Ложь;
	
	Возврат Результат;
	
КонецФункции

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

			ДанныеДляОбработки = ПараметрыОбработки.ДанныеДляОбработки;
			
			ДополнитьАктыСверкиДаннымиОтправителяАктаСверки(ДанныеДляОбработки, ПараметрыОбработки.Действие);
			
			КатегорияМетрики	= ПараметрыОбработки.КатегорияМетрики;
			ДействиеМетрики		= ПараметрыОбработки.ДействиеМетрики;
			
			Ядро = Модуль_Ядро();
			
			ПакетыДокументов = Ядро.СгруппироватьДокументыПоПакетам(ДанныеДляОбработки);

			ВыполнитьМассовуюОбработкуДанных("ОбработатьДокументыСПодписанием", ПакетыДокументов, ДействияЭДО().ОтправитьОтвет);
			
			Ядро.Метрика_ДобавитьСтатистику_МассовоеДействиеПоДокументам(КатегорияМетрики, ДействиеМетрики, ДанныеДляОбработки);

		КонецЕсли;
		
	КонецЕсли;	
	
КонецПроцедуры

//&НаКлиенте
Процедура ЗаполнитьКонтентОтвета(ПараметрыОбработки)
	
	Действие			= ПараметрыОбработки.Действие;
	ДанныеДляОбработки	= ПараметрыОбработки.ДанныеДляОбработки;
	ДанныеДляПодписания	= ПараметрыОбработки.ДанныеДляПодписания;
	ОтветЭДО			= ОтветыЭДО()[Действие];
	Модуль_Ядро			= Модуль_Ядро();
	
	Для Каждого Документ Из ДанныеДляОбработки Цикл
			
		BoxId			= Документ.Идентификаторы.BoxId;
		ТипДокумента	= Документ.Тип.ТипДокумента;
		ТипКонтента		= Документ.Тип.ТипКонтента;
		
		Если Не Модуль_Ядро.Документы_ФормироватьОтветныйТитул(Документ) Тогда
			ТипКонтента = "";
		КонецЕсли;
		
		КлючШаблонаОтветногоТитула = КлючШаблонаОтветногоТитула(BoxId, ТипДокумента, ТипКонтента);
		
		ДанныеОтвета = ДанныеДляПодписания[КлючШаблонаОтветногоТитула].ДанныеОтвета;
		
		Если ЭтоФормализованныйАктСверки405(ТипКонтента) Тогда
			ДанныеОтвета = Модуль_Ядро.КопияКоллекцииЗначений(ДанныеОтвета);
		КонецЕсли;
		
		Документ.СлужебнаяИнформация.Вставить("КонтентОтвета", ДанныеОтвета);
		Документ.СлужебнаяИнформация.Вставить("КонтрактМЧД", ДанныеОтвета.ДополнительныеПараметры.КонтрактМЧД);
		Документ.РезультатАнализа.ТребуемоеДействиеВДД = ОтветЭДО;
		
	КонецЦикла;
	
КонецПроцедуры

//&НаКлиенте
Функция КлючШаблонаОтветногоТитула(BoxId, ТипДокумента, ТипКонтента)
	
	Возврат BoxId + "_" + ТипДокумента + "_" + ТипКонтента;
	
КонецФункции

//&НаКлиенте
Процедура ДополнитьАктыСверкиДаннымиОтправителяАктаСверки(ДанныеДляОбработки, Действие)
	
	Если Действие <> ДействияЭДО().ПодписатьВходящий Тогда
		Возврат;
	КонецЕсли;
	
	Для Каждого Документ Из ДанныеДляОбработки Цикл
		
		ТипКонтента = Документ.Тип.ТипКонтента;
		
		Если НЕ ЭтоФормализованныйАктСверки405(ТипКонтента) Тогда
			Продолжить;
		КонецЕсли;
		
		КонтентОтвета = Документ.СлужебнаяИнформация.КонтентОтвета;
		
		IdentityInfoSender = КонтентОтвета.ReconciliationAct.IdentityInfoSender;
		
		Модуль_Ядро().Документы_ЗаполнитьХранилищеКонтента(Документ);
		
		IdentityInfoSender.BaseIdFile = СтрЗаменить(Документ.Метаданные.FileName, ".xml", "");
		IdentityInfoSender.DateFileInfoSender = Документ.СлужебнаяИнформация.Контент.DateCreateFile;
		IdentityInfoSender.TimeFileInfoSender = Документ.СлужебнаяИнформация.Контент.TimeCreateFile;
		IdentityInfoSender.SignSender = Документ.Документооборот.ХранилищеКонтента.Подпись.ДанныеПодписи;
		
	КонецЦикла;
	
КонецПроцедуры

// } Подписать входящие


// { Отказ в подписи входящих

//&НаКлиенте
Процедура ВыполнитьОтказатьВПодписиВходящих(Команда)
	
	ВыполнитьПодписатьИлиОтказатьВходящие(ДействияЭДО().ОтказатьВПодписи);
	
КонецПроцедуры

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

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

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


// } Отказ в подписи входящих


// { Перезаполнение

//&НаКлиенте
Процедура ВыполнитьПерезаполнениеПакета(Команда)
	
	КатегорияМетрики	= Метрика_НазваниеКатегорииРежимаОтображения();
	ДействиеМетрики		= "Перезаполнить";

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

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

Процедура ПерезаполнитьПакет(КонтекстФункции)
	
	ИмяМетода = "Пакеты_ПерезаполнитьПакетыПоСтрокамСписка";
	СтрокиСписка = КонтекстФункции.Данные;
	
	ОписаниеЗадачи = Модуль_Платформа().ДлительныеОперации_ВыполнитьВФоне(ИмяМетода, СтрокиСписка);
	
	КонтекстФункции.Вставить("Обработчик",				"ЗаполнитьПараметрыПереотправки");
	КонтекстФункции.Вставить("ТекущаяОперация",			ОписаниеЗадачи);
	
КонецПроцедуры

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

Функция ВыполнитьВалидациюПереотправляемогоПакета(СтрокаСписка)
	
	Ядро = Модуль_Ядро();
	
	Результат = Ядро.СписокДокументов_ВалидацияПереотправляемогоПакета(СтрокаСписка);
	
	Возврат Результат;
	
КонецФункции

// } Перезаполнение


// { Перезаполнение и отправка

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

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

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

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

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

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

// } Перезаполнение и отправка


// { Обработка документов для действий с подписанием

Процедура ОбработатьДокументыСПодписанием(КонтекстФункции)
	
	ИмяМетода				 = "Документы_ДанныеДляMessagePatchToPost";
	ДокументыДляОбработки	 = ОчередьЗадач_ВыгрузитьДокументыИзМассиваПакетов(КонтекстФункции.Данные);
	Действие				 = КонтекстФункции.Параметры;
	
	ОписаниеЗадачи = Модуль_Платформа().ДлительныеОперации_ВыполнитьВФоне(ИмяМетода, ДокументыДляОбработки, Действие);
	
	КонтекстФункции.Очистить();
	КонтекстФункции.Вставить("Обработчик", "ЗавершитьОбработкуДокументовСПодписанием");
	КонтекстФункции.Вставить("ТекущаяОперация", ОписаниеЗадачи);
	
КонецПроцедуры

Процедура ЗавершитьОбработкуДокументовСПодписанием(КонтекстФункции)
	
	ПодготовленныеДанные = Модуль_Платформа().ДлительныеОперации_Результат(
		КонтекстФункции.ТекущаяОперация.АдресРезультата);
	
	КонтекстФункции.Удалить("ТекущаяОперация");
	
	Модуль_Ядро = Модуль_Ядро();
	Модуль_Ядро.Документы_ПодписатьДанныеДляMessagePatchToPost(ПодготовленныеДанные);
	
	ИмяМетода = "Документы_ОтправитьДанныеДляMessagePatchToPost";
	ОписаниеЗадачи = Модуль_Платформа().ДлительныеОперации_ВыполнитьВФоне(ИмяМетода, ПодготовленныеДанные);
	
	ОчередьЗадач_ЗавершитьЗадачу(КонтекстФункции, ОписаниеЗадачи);
	
КонецПроцедуры

// } Обработка документов для действий с подписанием


// { Обработка документов для действий без подписания

Процедура ОбработатьДокументыБезПодписания(КонтекстФункции)
	
	ИмяМетода				 = "Документы_ВыполнитьДействиеСДокументами";
	ДокументыДляОбработки	 = ОчередьЗадач_ВыгрузитьДокументыИзМассиваПакетов(КонтекстФункции.Данные);
	Действие				 = КонтекстФункции.Параметры;
	
	ОписаниеЗадачи = Модуль_Платформа().ДлительныеОперации_ВыполнитьВФоне(ИмяМетода, ДокументыДляОбработки, Действие);
	
	ОчередьЗадач_ЗавершитьЗадачу(КонтекстФункции, ОписаниеЗадачи);
	
КонецПроцедуры

// } Обработка документов для действий без подписания


// { Обработка очереди задач

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

Функция Новый_ОчередьАсинхронныхЗадач()
	
	Результат = Новый Структура;
	
	Результат.Вставить("ПулЗадач", Новый Массив);
	Результат.Вставить("КоличествоПотоков", 10);
	Результат.Вставить("ЗаголовокФормыПрогресса");
	Результат.Вставить("ЗаголовокВыполненнойОчереди");
	
	Возврат Результат;
	
КонецФункции

Процедура ПолучитьСогласиеНаГрупповуюОбработкуВыделенныхСтрок(ИмяОбработчика, ПараметрыОбработки = Неопределено)
	
	ДанныеДляОбработки = ПараметрыОбработки.ДанныеДляОбработки;
	КоличествоСтрок = ДанныеДляОбработки.Количество();
	
	Если КоличествоСтрок = 0 Тогда
		
		ПоказатьПредупреждениеНеВыбраноНиОднойСтроки();
		
	ИначеЕсли КоличествоСтрок = 1 Тогда
		
		ПараметрыОбработки.ГрупповоеДействие = Истина;
		
		ОписаниеГрупповойОперации = Новый_ОписаниеГрупповойОперации(
				ИмяОбработчика,
				ПараметрыОбработки);
		
		ОбработчикСогласияНаГрупповуюОбработкуВыделенныхСтрок(
			КодВозвратаДиалога.Да,
			ОписаниеГрупповойОперации);
		
	Иначе
		
		Модуль_Ядро = Модуль_Ядро();
		
		ОбрабатываемаяСущность = ОбрабатываемаяСущность();
		ШаблонВопроса = "Вы собираетесь выполнить групповые действия. %1ов к обработке %2. Продолжить?";
		ТекстВопроса = Модуль_Ядро.Общее_ПодставитьПараметрыВСтроку(
				ШаблонВопроса,
				ОбрабатываемаяСущность,
				КоличествоСтрок);
		
		ПараметрыОбработки.ГрупповоеДействие = Истина;
		
		ОписаниеГрупповойОперации = Новый_ОписаниеГрупповойОперации(ИмяОбработчика, ПараметрыОбработки);
		
		ОписаниеОповещения = НовыйОписаниеОповещения(
				"ОбработчикСогласияНаГрупповуюОбработкуВыделенныхСтрок",
				ЭтаФорма,
				ОписаниеГрупповойОперации);
		
		ПоказатьВопросПереопределенная(
			ОписаниеОповещения,
			ТекстВопроса,
			РежимДиалогаВопрос.ДаНет);
		
	КонецЕсли;
	
КонецПроцедуры

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

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

//&НаКлиенте
Функция Новый_ОписаниеГрупповойОперации(ИмяОбработчика, ПараметрыОбработки) Экспорт

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

// Проверяет данные перед выполнением групповой операции 
//	1. Проверяет сертификаты на КЭП
//	2. Проверяет данные МЧД
//	3. Выполняет обработчик групповой операции
//
// Параметры:
//	ОписаниеГрупповойОперации - Структура - см. Новый_ОписаниеГрупповойОперации()
//
//&НаКлиенте
Процедура ПроверитьПараметрыГрупповойОперацииИВыполнитьОбработчик(ОписаниеГрупповойОперации) 
	
	КЭП_НачатьПроверкуДанныхГрупповойОперации(ОписаниеГрупповойОперации);
	
КонецПроцедуры

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

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

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

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

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

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

Процедура ОбработатьОчередьЗадач(ОчередьЗадач)
	
	КоличествоПотоков	 = ОчередьЗадач.КоличествоПотоков;
	НовыеЗадачи			 = ОчередьЗадач.ПулЗадач;
	ВсегоЗадач			 = НовыеЗадачи.Количество();
	ВыполненоЗадач		 = 0;

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

Функция ОчередьЗадач_КоличествоДокументовВЗадачах(Задачи)
	
	Результат = 0;
	Для каждого Задача Из Задачи Цикл
	
		Результат = Результат + Задача.Данные.Количество();
	
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

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

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

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

Процедура ОчередьЗадач_ЗавершитьЗадачу(КонтекстФункции, ТекущаяОперация = Неопределено)
	
	КонтекстФункции.Очистить();
	
	КонтекстФункции.Вставить("ЗавершитьЗадачу");
	
	Если ТекущаяОперация <> Неопределено Тогда
		КонтекстФункции.Вставить("ТекущаяОперация", ТекущаяОперация);
	КонецЕсли;
	
КонецПроцедуры

//&НаКлиенте
Функция ОчередьЗадач_ПричинаОшибки(ИнформацияОбОшибке)
	
	Результат		= ИнформацияОбОшибке;
	ПричинаОшибки	= ИнформацияОбОшибке;
	
	Пока ПричинаОшибки <> Неопределено Цикл
		
		ПричинаОшибки = ПричинаОшибки.Причина;
		
		Если ПричинаОшибки <> Неопределено И ПричинаОшибки.НомерСтроки > 0 Тогда
			Результат = ПричинаОшибки;
		КонецЕсли;
		
	КонецЦикла; 
	
	Возврат Результат;
	
КонецФункции

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

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

Процедура ОчередьЗадач_ПроверитьРезультат(ОписаниеЗадания)
	
	Модуль_Ядро = Модуль_Ядро();
	Модуль_Ядро.ДлительныеОперации_ПроверитьСостояние(ОписаниеЗадания);
	
	Если ОписаниеЗадания.Завершено Тогда
		Модуль_Ядро.ДлительныеОперации_ОбработатьОшибки(ОписаниеЗадания);
	КонецЕсли;
	
КонецПроцедуры

Функция ЗаголовокФормыПрогресса()
	
	ОбрабатываемаяСущность = НРег(ОбрабатываемаяСущность());
	
	Результат = "Обработка %количество% " + ОбрабатываемаяСущность + "ов";
	
	Возврат Результат;
	
КонецФункции

//&НаКлиенте
Функция ПредставлениеДействияЭДО(Действие)
	
	Ядро = Модуль_Ядро();
	
	ПредставленияДействийЭДО = Ядро.Перечисление_ПредставленияДействийЭДО();
	Результат = ПредставленияДействийЭДО[Действие];
	
	Если НЕ ЗначениеЗаполнено(Результат) Тогда
		Результат = "Обработка";
	КонецЕсли;
		
	Возврат Результат;
	
КонецФункции

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

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

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

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

// } Обработка очереди задач

// }	МАССОВАЯ ОБРАБОТКА ДОКУМЕНТОВ

// {	ВСПОМОГАТЕЛЬНЫЕ МЕТОДЫ ФОРМЫ

Процедура УстановитьВидГруппыКнопокПодписать()
	// для устранения расхождения в коде
	Возврат;
КонецПроцедуры

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

Процедура УстановитьЗаголовокКнопкиПериода()
	
	Элементы.ВыбратьПериод.Заголовок = ЗаголовокКнопкиВыбораПериода();
	Элементы.ВыбратьПериод.Подсказка = НСтр("ru='Выбрать период'");
	
КонецПроцедуры

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

//&НаКлиенте
Функция СтруктураПериода()
	
	ДатаНачала		 = НастройкаВыбораПериода.ДатаНачала;
	ДатаОкончания	 = НастройкаВыбораПериода.ДатаОкончания;
	
	Если ДатаОкончания < ДатаНачала Тогда
		ДатаОкончания = '00010101';
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ДатаОкончания) Тогда
		ДатаОкончания = КонецДня(ДатаОкончания);
	КонецЕсли;
	
	Представление = ПредставлениеПериода(ДатаНачала, ДатаОкончания);
	
	Если НЕ ЗначениеЗаполнено(Представление) Тогда
		Представление = "<период не установлен>";
	КонецЕсли;
	
	Если НЕ ЗначениеЗаполнено(ДатаОкончания) Тогда
		ДатаОкончания = КонецДня('39990101');
	КонецЕсли;
	
	Результат = Новый Структура;
	Результат.Вставить("ДатаНачала",	ДатаНачала);
	Результат.Вставить("ДатаОкончания",	ДатаОкончания);
	Результат.Вставить("Представление",	Представление);
	
	Возврат Результат;
	
КонецФункции

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

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

//&НаКлиенте
Процедура ОчиститьОтборПоСтатусуИВидуПакета()
	ВключитьОтборПоСтатусу = Ложь;
	ОтборПоСтатусу = "";
	ВключитьОтборПоВидуПакета = Ложь;
	ОтборПоВидуПакета = "";
КонецПроцедуры

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

	ОписаниеОповещения = НовыйОписаниеОповещения("ДлительныеОперации_ОбновитьСтатусыЭПД", ЭтаФорма);
	
	МодульПлатформа.ДлительныеОперации_ОжидатьЗавершение(ОписаниеЗадания, ОписаниеОповещения);
	
КонецПроцедуры

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

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

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

Процедура ЗаполнитьПеременныеМетрикиПоДаннымКэшаДокументов(АдресСпискаДокументов, РежимСписка, ДопПеременные)
	
	// BSLLS:MissingTempStorageDeletion-off
	КэшСпискаДокументовЛокальный = ПолучитьИзВременногоХранилища(АдресСпискаДокументов);
	// BSLLS:MissingTempStorageDeletion-on
	
	Если ЗначениеЗаполнено(КэшСпискаДокументовЛокальный) Тогда
		
		ДопПеременные.Вставить("Количество документов", КэшСпискаДокументовЛокальный.Количество());
		
	КонецЕсли;
	
КонецПроцедуры

//&НаКлиенте 
Функция ПараметрыОбновленияСпискаДокументов(НовыйРежимОтображенияДокументов, ОтборПоПакету = Неопределено)
	
	Результат = Модуль_Ядро().Контракт_ПараметрыПолученияСпискаДокументов();
	
	СтруктураПериода = СтруктураПериода();
	
	РежимДляОбновления = РежимСпискаДокументовДляОбновления(НовыйРежимОтображенияДокументов);
	
	ВыбранныеВидыДокументов = ВыбранныеВидыДокументовНаСервере(РежимДляОбновления);
	
	Результат.Режим							 = РежимДляОбновления;
	Результат.НачалоПериода					 = СтруктураПериода.ДатаНачала;
	Результат.КонецПериода					 = СтруктураПериода.ДатаОкончания;
	Результат.МассивВыбранныхВидов			 = ВыбранныеВидыДокументов;
	Результат.ПоказыватьЗавершенные			 = ПоказыватьЗавершенные;
	Результат.РежимОтбораПоПериоду			 = НастройкаВыбораПериода.РежимОтбораПоПериоду;
	Результат.ВключитьОтборПоОрганизации	 = ВключитьОтборПоОрганизации;
	Результат.ВключитьОтборПоКонтрагенту	 = ВключитьОтборПоКонтрагенту;
	Результат.ВключитьОтборПоСтатусу		 = ВключитьОтборПоСтатусу;
	Результат.ОтборПоПакету					 = ОтборПоПакету;
	
	Результат.ОтборПоСтатусу				 = ?(ВключитьОтборПоСтатусу, ОтборПоСтатусу, Неопределено);
	
	Если ВключитьОтборПоКонтрагенту Тогда
		Результат.ОтборПоКонтрагенту		 = ?(ЗначениеЗаполнено(ОтборПоКонтрагенту), ОтборПоКонтрагенту, Неопределено);
	КонецЕсли;
	Если ВключитьОтборПоОрганизации Тогда
		Результат.ОтборПоОрганизации		 = ?(ЗначениеЗаполнено(ОтборПоОрганизации), ОтборПоОрганизации, Неопределено);
	КонецЕсли;
	
	Если ДоступнаНастройкаПоказыватьЧерновики() Тогда
		Результат.ПоказыватьЧерновики = ПоказыватьЧерновики;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

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

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

Процедура ОбновитьСписокНаСервере(Знач ПараметрыОбновленияСписка)
	
	СтарыйРежимОтображенияДокументов = РежимОтображенияДокументов;
	РежимОтображенияДокументов = ПараметрыОбновленияСписка.Режим;
	РежимОтображенияПриЗапуске = РежимОтображенияДокументов;
	
	Если СтарыйРежимОтображенияДокументов <> РежимОтображенияДокументов Тогда
		СохранитьВидимостьКолонок(СтарыйРежимОтображенияДокументов);
		ПереключитьВидимостьКолонок(РежимОтображенияДокументов);
	КонецЕсли;
	
	УстановитьВидимостьОтбораПоСтатусу(РежимОтображенияДокументов);
	УстановитьВидимостьОтбораПоВидуПакета(РежимОтображенияДокументов);
	
	ЗаполнитьМенюДействий(РежимОтображенияДокументов);
	УстановитьЦветКнопокПереключенияРежимов();
	НастроитьДополнительныеКолонки();
	НастроитьФормуПриСменеРежима();
	
	СписокДокументов_ОбновитьКэш(
		ПараметрыОбновленияСписка,
		СписокДокументов,
		СопоставленныеКонтрагенты1С
	);
	ТаблицаОтборов_УстановитьОтборыСпискаДокументов(РежимОтображенияДокументов);
	
	ОбновитьСтраницуСпискаДокументовНаСервере();
	
	КоличествоУстановленныхФильтров = КоличествоУстановленныхФильтров();
	УстановитьЗаголовокКнопкиФильтров(КоличествоУстановленныхФильтров);
	
	ПроверитьСобытияЛентыКонтрагентов();
	
КонецПроцедуры

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

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

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

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

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

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

	ХранилищеНастроекДанныхФорм.Сохранить("Диадок", "Колонки" + ИмяСписка, ВидимостьКолонокСпискаДокументов);
	
КонецПроцедуры

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

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

		Если ОтключитьАнализ Тогда
			Результат = Результат + "_ОтключитьАнализ";
		КонецЕсли;
		
	КонецЕсли;	
			
	Возврат Результат;
	
КонецФункции	

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

// Возвращает структуру для подмены у колонки источника данных
//
// Параметры:
//  РежимОтображенияДокументов	 - Строка - см. РежимыОтображения()
// 
// Возвращаемое значение:
//  Структура - Структура для подмены данных:
//   * Ключ - Строка - имя колонки табличного поля СписокДокументов, в котором необходимо заменить Данные
//   * Значение - Строка - значение для замены в поле Данные
//
Функция СтруктураЗаменыДанныхКолонокСписка(РежимОтображенияДокументов)
	
	Результат = Новый Структура();
	
	// BSLLS:DuplicateStringLiteral-off
	Если РежимОтображенияДокументов = РежимыОтображения().Перевозочные Тогда
		
		Результат.Вставить("Контрагент", "Контрагент_");
		Результат.Вставить("Организация", "Организация_");
		Результат.Вставить("ПромежуточныйПолучатель", "ПромежуточныйПолучатель_");
		Результат.Вставить("ВнешнийСтатус", "ВнешнийСтатус_");
		
		Результат.Вставить("Грузоотправитель", "Организация");
		Результат.Вставить("Перевозчик", "Контрагент");
		Результат.Вставить("Грузополучатель", "ПромежуточныйПолучатель");
		Результат.Вставить("ВнешнийСтатусЭПД", "ВнешнийСтатус");
		
	Иначе
		
		Результат.Вставить("Грузоотправитель", "Грузоотправитель");
		Результат.Вставить("Перевозчик", "Перевозчик");
		Результат.Вставить("Грузополучатель", "Грузополучатель");
		Результат.Вставить("ВнешнийСтатусЭПД", "ВнешнийСтатусЭПД");
		
		Результат.Вставить("Контрагент", "Контрагент");
		Результат.Вставить("Организация", "Организация");
		Результат.Вставить("ПромежуточныйПолучатель", "ПромежуточныйПолучатель");
		Результат.Вставить("ВнешнийСтатус", "ВнешнийСтатус");
		
	КонецЕсли;
	// BSLLS:DuplicateStringLiteral-on
	
	Возврат Результат;
	
КонецФункции

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

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

Функция ДоступныеСкрытыеКолонкиСписка()
	
	Результат = Новый Массив;
	
	РежимыОтображения = РежимыОтображения();
	
	Если РежимОтображенияДокументов = РежимыОтображения.ДляОтправки Тогда
		
		Результат.Добавить("СтатусПакета");
		Результат.Добавить("ЭтоЧерновик");
		
	ИначеЕсли РежимОтображенияДокументов = РежимыОтображения.Исходящие Тогда
		
		Результат.Добавить("ВидПакета");
		Результат.Добавить("ВидЭлДокумента");
		Результат.Добавить("Пакет");
		Результат.Добавить("ДокументЭДО");
		Результат.Добавить("ПредставлениеДокументаДиадок");
		Результат.Добавить("Метка");
		Результат.Добавить("ЗаблокированныйПакет");
		Результат.Добавить("ВнешнийСтатус"); 
		Результат.Добавить("СтатусПКФНС");
		Результат.Добавить("СтатусТЭДО");
		Результат.Добавить("ОбъектМаршрутизации");
		
	ИначеЕсли РежимОтображенияДокументов = РежимыОтображения.Входящие Тогда
		
		Результат.Добавить("Пакет");
		Результат.Добавить("ДокументЭДО");
		Результат.Добавить("ПредставлениеДокументаДиадок");
		Результат.Добавить("ДействиеВДД");
		Результат.Добавить("ДействиеВ1С");
		Результат.Добавить("ТребуетсяРасшифровка");
		Результат.Добавить("ЗаблокированныйПакет");
		Результат.Добавить("АнализПроведен");
		Результат.Добавить("ВнешнийСтатус");
		Результат.Добавить("СтатусПКФНС");
		Результат.Добавить("СтатусТЭДО");
		Результат.Добавить("ОбъектМаршрутизации");
		
	ИначеЕсли РежимОтображенияДокументов = РежимыОтображения.Внутренние Тогда
		
		Результат.Добавить("ВидПакета");
		Результат.Добавить("ВидЭлДокумента");
		Результат.Добавить("Пакет");
		Результат.Добавить("ДокументЭДО");
		Результат.Добавить("ПредставлениеДокументаДиадок");
		Результат.Добавить("Метка");
		Результат.Добавить("ЗаблокированныйПакет");
		Результат.Добавить("СтатусПКФНС");
		Результат.Добавить("ОбъектМаршрутизации");
		
	ИначеЕсли РежимОтображенияДокументов = РежимыОтображения.Перевозочные Тогда
		
		Результат.Добавить("ВидПакета");
		Результат.Добавить("ВидЭлДокумента");
		Результат.Добавить("Пакет");
		Результат.Добавить("ДокументЭДО");
		Результат.Добавить("ПредставлениеДокументаДиадок");
		Результат.Добавить("Метка");
		Результат.Добавить("ЗаблокированныйПакет");
		Результат.Добавить("СтатусПКФНС");
		Результат.Добавить("ОбъектМаршрутизации");
		
	Иначе
		
		ВызватьИсключение "Неизвестный режим отображения";
		
	КонецЕсли;
	
	Результат.Добавить("BoxId");
	Результат.Добавить("LetterId");
	Результат.Добавить("DocumentId");
	
	Возврат Результат;
	
	
КонецФункции

Процедура ИнициализироватьНастройкуИВидимостьКнопкиЛентыКонтрагентов()
	
	Ядро = Модуль_Ядро();
	УведомлятьОНовыхСобытиях = Ядро.ЗначениеНастройки_УведомлятьОНовыхСобытиях();
	
	Если НЕ УведомлятьОНовыхСобытиях Тогда
		ЭлементыФормы.Удалить(ЭлементыФормы.СписокСобытий);
		ЭлементыФормы.ОбновитьСписок.Лево = 
			ЭлементыФормы.ПоказыватьЗавершенные.Лево 
			+ ЭлементыФормы.ПоказыватьЗавершенные.Ширина
			- ЭлементыФормы.ОбновитьСписок.Ширина
			- 10; 
	КонецЕсли;
	
КонецПроцедуры

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

Процедура НастроитьДополнительныеКолонки()
	
	ПараметрыПМ = Новый Структура;
	ПараметрыПМ.Вставить("Режим", РежимОтображенияДокументов);
	НастройкиДопКолонок = Модуль_Ядро().ПодключаемыйМодуль_ОбработатьСобытие("ПолучитьНастройкиДополнительныхКолонокСпискаДокументов", ПараметрыПМ);
	
	КолонкиСпискаДокументов = ЭлементыФормы.СписокДокументов.Колонки;
	
	Для Сч = 1 По 5 Цикл
		
		ИмяКолонки = "ДопРеквизит" + Формат(Сч, "ЧГ=0");
		КолонкиСпискаДокументов[ИмяКолонки].Видимость = Ложь;
		КолонкиСпискаДокументов[ИмяКолонки].ИзменятьВидимость = Ложь;
		
	КонецЦикла;
	
	Если НастройкиДопКолонок <> Неопределено Тогда
		
		Для Сч = 0 По НастройкиДопКолонок.Количество() - 1 Цикл
			
			Если Сч > 4 Тогда
				ВызватьИсключение "Допускается не более 5 дополнительных колонок в списке документов";
			КонецЕсли;
			
			ТекКолонка = КолонкиСпискаДокументов["ДопРеквизит" + Формат(Сч + 1, "ЧГ=0")];
			ТекКолонка.ТекстШапки = НастройкиДопКолонок[Сч].Заголовок;
			ТекКолонка.Видимость = Истина;
			ТекКолонка.ИзменятьВидимость = Истина;
			
		КонецЦикла;
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

Функция ОбщийBoxId(ВыбранныеBoxId)
	
	Результат = Неопределено;
	
	Если ВыбранныеBoxId.Количество() > 0 Тогда
		
		Если ВыбранныеBoxId.Количество() <> 1 Тогда
			ПоказатьПредупреждениеПереопределенная( , "В списке выбраны документы по различным организациям.
													|Выберите документы, относящиеся только к одной организации.");
		Иначе
			Результат = ВыбранныеBoxId[0];
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция BoxIdИзДокументов(ДокументыДляОбработки)
	
	Результат = Новый Массив;
	
	Для Каждого Документ Из ДокументыДляОбработки Цикл
		
		BoxId = Документ.Идентификаторы.BoxId;
		
		Если Результат.Найти(BoxId) = Неопределено Тогда
			Результат.Добавить(BoxId);
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

Функция BoxIdИзСтрокСписка(СтрокиСписка)
	
	Результат		= Новый Массив;
	Организации1С	= Новый Массив;
	
	Для Каждого СтрокаСписка Из СтрокиСписка Цикл
		
		Организация = СтрокаСписка.Организация;
		
		Если Организации1С.Найти(Организация) = Неопределено Тогда
			Организации1С.Добавить(Организация);
		КонецЕсли;
		
	КонецЦикла;
	
	УчастникиДО = ДанныеОрганизаций(Организации1С);
	
	Для Каждого УчастникДО Из УчастникиДО Цикл
		
		BoxId = УчастникДО.BoxId;
		
		Если Результат.Найти(BoxId) = Неопределено Тогда
			Результат.Добавить(BoxId);
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

Функция ДанныеОрганизаций(Организации1С)
	
	Результат = Новый Массив;
	
	Для Каждого Организация1С Из Организации1С Цикл
		
		Идентификаторы			= Модуль_Ядро().Новый_ИдентификаторыСправочника(Организация1С);
		УчастникДО_Организации	= Модуль_Ядро().Организации_ЗаполнитьУчастникаДО(Идентификаторы);
		Результат.Добавить(УчастникДО_Организации);
		
	КонецЦикла;	
		
	Возврат Результат;
	
КонецФункции

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

Функция Новый_СтруктураДанныхСтрокиСписка(Источник)
	
	Ядро = Модуль_Ядро();
	Результат = Ядро.Контракт_СтрокаСпискаДокументов();
	
	Если Источник <> Неопределено Тогда
		ЗаполнитьЗначенияСвойств(Результат, Источник);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

//&НаКлиенте
Функция ДанныеВыделенныхСтрокТЧ(ОбрабатыватьШаблоны)

	Результат = Новый Массив;
	
	ВыделенныеСтроки = ВыделенныеСтрокиСпискаДокументов();
	
	Для Каждого СтрокаТЧ Из ВыделенныеСтроки Цикл
		
		Если СтрокаТЧ.Видимость И (НЕ СтрокаТЧ.Шаблон ИЛИ ОбрабатыватьШаблоны) Тогда
			
			СтруктураСтроки = Новый_СтруктураДанныхСтрокиСписка(СтрокаТЧ);
			
			Результат.Добавить(СтруктураСтроки);
			
		КонецЕсли;
		
	КонецЦикла;	
	
	Возврат Результат;
	
КонецФункции

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

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

//&НаСервере
Функция ИдентификаторыПакетаДокумента(СтрокаСписка)
	
	Документ = ДокументИзДанныхСтрокиТЧ(СтрокаСписка);
	
	Результат = Модуль_Ядро().Контракт_ИдентификаторыПакета();
	
	Результат.BoxId		= Документ.Идентификаторы.BoxId;
	Результат.LetterId	= Документ.Идентификаторы.LetterId;
	Результат.ПакетЭДО	= Документ.Идентификаторы.ПакетЭДО;
	
	Возврат Результат;
	
КонецФункции	

//&НаКлиенте
Процедура ДополнитьМассивДокументовДокументамиПакетов(МассивДокументов, ИдентификаторыПакетов)
	
	Ядро = Модуль_Ядро();
	
	ДокументыПакетов = Ядро.Пакеты_ДокументыПакетов(ИдентификаторыПакетов);
	
	Ядро.ДополнитьМассив(МассивДокументов, ДокументыПакетов);
	
КонецПроцедуры

//&НаСервере
Функция МассивДокументовИзДанныхДокументов(СтрокиСпискаДокументов) Экспорт
	
	Результат = Новый Массив;
	
	Для Каждого СтрокаСписка Из СтрокиСпискаДокументов Цикл
		
		Документ = ДокументИзДанныхСтрокиТЧ(СтрокаСписка);
		Результат.Добавить(Документ);
		
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

//&НаСервере
Функция ДокументИзДанныхСтрокиТЧ(СтрокаСписка) Экспорт
	
	Модуль_Ядро = Модуль_Ядро();
	
	Результат = Модуль_Ядро.Документ_ДокументИзДанныхСтрокиСписка(СтрокаСписка);
	
	Возврат Результат;
	
КонецФункции

Процедура ОбновитьКэшСопоставленныхКонтрагентов()
	
	Ядро = Модуль_Ядро();
	// BSLLS:UnusedLocalVariable-off
	СопоставленныеКонтрагенты1С = Ядро.Контрагенты_СопоставленныеПартнеры();
	// BSLLS:UnusedLocalVariable-on
	
КонецПроцедуры

//&НаКлиенте
Функция ДействияЭДО() Экспорт
	
	Результат = Модуль_Ядро().Перечисление_ДействияЭДО();
	
	Возврат Результат;
	
КонецФункции

//&НаКлиенте
Функция ОтветыЭДО() Экспорт
	
	Ядро = Модуль_Ядро();
	
	Результат = Ядро.Перечисление_ВариантыОтветаПоДокументу();
	
	Возврат Результат;
	
КонецФункции

Функция ДокументыПакетов(Пакеты)
	
	Результат = Новый Массив;
	
	Для Каждого Пакет Из Пакеты Цикл
		
		Для Каждого Документ Из Пакет.Документы Цикл
			Результат.Добавить(Документ);
		КонецЦикла;
		
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

Процедура СписокДокументовПриПолученииДанных(Элемент, ОформленияСтрок)
	
	РежимыОтображения = РежимыОтображения();
	
	// BSLLS:StyleElementConstructors-off
	// BSLLS:MagicNumber-off
	Цвет_НаличиеОшибок = Новый Цвет(255, 214, 214);
	Цвет_ДокументНеСопоставлен = Новый Цвет(240, 240, 240);
	Цвет_ОшибкаВоВнешнемСтатусе = Новый Цвет(206, 0, 20);
	Цвет_Подсказка = Новый Цвет(128, 128, 128);
	Цвет_Предупреждение = Новый Цвет(235, 168, 0);
	// BSLLS:MagicNumber-on
	// BSLLS:StyleElementConstructors-on
	
	УровниКритичности = Модуль_Ядро().Контракт_УровниКритичностиСтатусаДокумента();
	
	Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
		
		ДанныеСтроки = ОформлениеСтроки.ДанныеСтроки;
		Ячейки = ОформлениеСтроки.Ячейки;
		
		ИндексИконкиПакета = ДанныеСтроки.ИндексИконкиПакета;
		
		Если ИндексИконкиПакета > 0 Тогда
			
			Ячейки.КартинкаПакета.ОтображатьКартинку = Истина;
			Ячейки.КартинкаПакета.ИндексКартинки = ИндексИконкиПакета;
			
		КонецЕсли;
		
		ТипДокумента = ДанныеСтроки.ТипДокумента;
		ФункцияДокумента = ДанныеСтроки.ФункцияДокумента;
		
		Если ЗначениеЗаполнено(ТипДокумента) Тогда
			
			Если ТипДокумента = "Nonformalized" Тогда
				
				ОписаниеТипаДокумента = ДанныеСтроки.ПредставлениеДокументаДиадок;
				
			Иначе
				
				ОписаниеТипаДокумента = ПредставлениеТиповДокументов.Получить(ТипДокумента);
				
				Если ОписаниеТипаДокумента <> Неопределено Тогда
					
					ФункцияДокументаДляXML = ФункцияДокументаДляВыводаВСписок(ТипДокумента, ФункцияДокумента);
					
					Если ЗначениеЗаполнено(ФункцияДокументаДляXML) Тогда
						ОписаниеТипаДокумента = ОписаниеТипаДокумента + ", " + ФункцияДокументаДляXML;
					КонецЕсли;
					
				КонецЕсли;
				
			КонецЕсли;
			
			Если ЗначениеЗаполнено(ОписаниеТипаДокумента) Тогда
				
				Ячейки.ОписаниеТипаДокумента.ОтображатьТекст = Истина;
				Ячейки.ОписаниеТипаДокумента.Текст = ОписаниеТипаДокумента;
				
			КонецЕсли;
			
		КонецЕсли;
		
		Если ЗначениеЗаполнено(ДанныеСтроки.ОшибкиПроверкиТекст) Тогда
			
			ОформлениеСтроки.ЦветФона = Цвет_НаличиеОшибок;
			
		ИначеЕсли РежимОтображенияДокументов = РежимыОтображения.Входящие Тогда
			
			ТребуетсяСопоставление = ТребуетсяСопоставлениеДокумента(ДанныеСтроки.ТипДокумента);
			
			ДокументНеСопоставлен = НЕ ЗначениеЗаполнено(ДанныеСтроки.Документ)
				И ТребуетсяСопоставление;
			
			Если ДокументНеСопоставлен Тогда
				ОформлениеСтроки.ЦветФона = Цвет_ДокументНеСопоставлен;
			КонецЕсли;
			
		КонецЕсли;
		
		Если Найти(ВРег(ДанныеСтроки.ВнешнийСтатус), "ОШИБКА") > 0 Тогда
			Ячейки.ВнешнийСтатус.ЦветТекста = Цвет_ОшибкаВоВнешнемСтатусе;
		КонецЕсли;
		
		Если ДанныеСтроки.СтатусМЧДКритичность = УровниКритичности.Error Тогда
			Ячейки.СтатусМЧД.ЦветТекста = Цвет_ОшибкаВоВнешнемСтатусе;
		КонецЕсли;
		
		Если ДанныеСтроки.СтатусПКФНСКритичность = УровниКритичности.Error
			ИЛИ ДанныеСтроки.СтатусПКФНСКритичность = УровниКритичности.Warning Тогда
			Ячейки.СтатусПКФНС.ЦветТекста = Цвет_Предупреждение;
		КонецЕсли;
		
		Если ИспользоватьСопоставлениеПодразделений Тогда
			Ячейки.Подразделение.Текст = "< из настройки >";
			Ячейки.Подразделение.ЦветТекста = Цвет_Подсказка;
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(ДанныеСтроки.Организация) Тогда
			Ячейки.Организация.Текст = СокрЛП(ДанныеСтроки.ПредставлениеОрганизацииЭДО);
			Ячейки.Организация.ЦветТекста = Цвет_Подсказка;
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(ДанныеСтроки.Контрагент) Тогда
			Ячейки.Контрагент.Текст = СокрЛП(ДанныеСтроки.ПредставлениеКонтрагентаЭДО);
			Ячейки.Контрагент.ЦветТекста = Цвет_Подсказка;
		КонецЕсли;
		
		Если РежимОтображенияДокументов = РежимыОтображения.Перевозочные Тогда
			
			Если Не ЗначениеЗаполнено(ДанныеСтроки.Организация) Тогда
				Ячейки.Грузоотправитель.Текст = СокрЛП(ДанныеСтроки.ПредставлениеОрганизацииЭДО);
				Ячейки.Грузоотправитель.ЦветТекста = Цвет_Подсказка;
			КонецЕсли;
			
			Если Не ЗначениеЗаполнено(ДанныеСтроки.ПромежуточныйПолучатель) Тогда
				Ячейки.Грузополучатель.Текст = СокрЛП(ДанныеСтроки.ПредставлениеПромежуточногоПолучателяЭДО);
				Ячейки.Грузополучатель.ЦветТекста = Цвет_Подсказка;
			КонецЕсли;
			
			Если Не ЗначениеЗаполнено(ДанныеСтроки.Контрагент) Тогда
				Ячейки.Перевозчик.Текст = СокрЛП(ДанныеСтроки.ПредставлениеКонтрагентаЭДО);
				Ячейки.Перевозчик.ЦветТекста = Цвет_Подсказка;
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЦикла;
	
	Попытка
		
		ПараметрыПМ = Новый Структура;
		ПараметрыПМ.Вставить("Форма", ЭтаФорма);
		ПараметрыПМ.Вставить("ИмяФормы", "ОсновнаяФорма");
		ПараметрыПМ.Вставить("Элемент", Элемент);
		ПараметрыПМ.Вставить("ОформленияСтрок", ОформленияСтрок);
		
		Модуль_Ядро().ПодключаемыйМодуль_ОбработатьСобытие("ПриПолученииДанныхТабличнойЧасти", ПараметрыПМ);
		
	Исключение
		Сообщить("Не удалось применить для формы условное оформление из ПМ!", СтатусСообщения.Важное);
	КонецПопытки;
	
КонецПроцедуры

Функция ФункцияДокументаДляВыводаВСписок(ТипДокумента, ФункцияДокумента)
	
	Результат = "";
	
	Если ТипДокумента = "UniversalTransferDocument"
		ИЛИ ТипДокумента = "UniversalTransferDocumentRevision"
		ИЛИ ТипДокумента = "UniversalCorrectionDocument"
		ИЛИ ТипДокумента = "UniversalCorrectionDocumentRevision" Тогда
		
		Результат = Модуль_Ядро().Документы_ФункцияДокументаДляXML(ТипДокумента, ФункцияДокумента);
		
	КонецЕсли;
				
	Возврат Результат;
	
КонецФункции


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

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

Функция ТипыДокументовДляСопоставления()
	
	Результат = Новый Структура;
	
	Результат.Вставить("UniversalTransferDocument");
	Результат.Вставить("UniversalTransferDocumentRevision");
	Результат.Вставить("Invoice");
	Результат.Вставить("InvoiceRevision");
	Результат.Вставить("UniversalCorrectionDocument");
	Результат.Вставить("UniversalCorrectionDocumentRevision");
	Результат.Вставить("InvoiceCorrection");
	Результат.Вставить("InvoiceCorrectionRevision");
	Результат.Вставить("XmlTorg12");
	Результат.Вставить("XmlAcceptanceCertificate");
	
	Возврат Результат;
	
КонецФункции

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

//&НаКлиентеНаСервереБезКонтекста
Функция ОтпечаткиСертификатовКонтекстаСеанса(КонтекстСеанса)
	
	Результат = Новый Массив;
	
	Для Каждого текКлючЗначение Из КонтекстСеанса Цикл
		
		ДанныеКонтекстаСеанса = текКлючЗначение.Значение;
		Отпечаток = ДанныеКонтекстаСеанса.ОтпечатокСертификата;
		
		Если ЗначениеЗаполнено(Отпечаток)
			И Результат.Найти(Отпечаток) = Неопределено Тогда
			
			Результат.Добавить(Отпечаток);
			
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

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

Процедура УстановитьПредставлениеТекущегоПользователяДиадок(Форма)
	
	ИменаПользователей = АвторизованныеПользователиКонтекстаСеанса(КонтекстСеансаКлиентСервер);
	
	Если ИменаПользователей.Количество() = 0 Тогда // Не авторизован
		
		ПредставлениеТекущегоПользователя = "Авторизуйтесь";
		
	ИначеЕсли ИменаПользователей.Количество() = 1 Тогда 
		
		ПредставлениеТекущегоПользователя = ИменаПользователей[0];
		
	Иначе // Несколько активных сессий
		
		ПредставлениеТекущегоПользователя = "Список пользователей";
		
	КонецЕсли;
	
	ЭлементыФормы.ПредставлениеПользователя.Заголовок = ПредставлениеТекущегоПользователя;
	
КонецПроцедуры

Процедура УстановитьТекущуюСтрокуСпискаДокументов()

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

//&НаКлиенте
Процедура ОбновитьЗначенияПараметровОбщегоКонтекста()
	
	Ядро = Модуль_Ядро();
	Ядро.ОбщийКонтекст_ДополнитьЗначениямиИзОбщихНастроек(ОбщийКонтекстКлиентСервер);
	
КонецПроцедуры

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

	Возврат Результат;
	
КонецФункции

//&НаКлиенте
Функция Метрика_НазваниеКатегории() Экспорт
	
	Результат = Модуль_Ядро().Метрика_НазваниеКатегории();

	Возврат Результат;
	
КонецФункции

//&НаКлиенте
Функция Метрика_КатегорияНастройка()
	
	Результат = Метрика_НазваниеКатегории().Настройка;
	Возврат Результат;
	
КонецФункции

//&НаКлиенте
Функция Метрика_КатегорияНайтиНужныйДокумент()
	
	КатегорииМетрик = Метрика_НазваниеКатегории();
	
	Результат = КатегорииМетрик.НайтиНужныйДокумент;
	
	Возврат Результат;
	
КонецФункции

//&НаКлиенте
Функция Метрика_ДействиеОткрытиеПомощника()
	
	ДействияМетрик = Метрика_НазваниеДействий();
	
	Результат = ДействияМетрик.ОткрытиеПомощника;
	
	Возврат Результат;
	
КонецФункции

//&НаКлиенте
Процедура Метрика_ДобавитьСтатистику_ПоКонтексту(КатегорияМетрики, ДействиеМетрики)
	
	Ядро 		= Модуль_Ядро();
	Ядро.Метрика_ДобавитьСтатистику_ПоКонтексту(
		КатегорияМетрики,
		ДействиеМетрики
	);
	
КонецПроцедуры

//&НаКлиенте
Процедура Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики)
	
	НазваниеФормы = Метрика_НазваниеФормы();
	
	Ядро = Модуль_Ядро();
	Ядро.Метрика_ДобавитьПоведение_НажатиеКнопки(
		НазваниеФормы,
		КатегорияМетрики,
		ДействиеМетрики
	);
	
КонецПроцедуры

//&НаКлиенте
Процедура Метрика_НажатиеКнопкиПакетнойОбработки(КатегорияМетрики, ДействиеМетрики, КоличествоДанных = 1)
	
	НазваниеФормыДляМетрики = Метрика_НазваниеФормы();
	
	Ядро = Модуль_Ядро();
	
	Ядро.Метрика_ДобавитьПоведение_МассовоеДействиеНажатиеКнопки(НазваниеФормыДляМетрики,
		КатегорияМетрики,
		ДействиеМетрики,
		КоличествоДанных);
	
КонецПроцедуры

//&НаКлиенте
Функция Метрика_НазваниеДействий() Экспорт
	
	Результат = Модуль_Ядро().Метрика_НазваниеДействий();

	Возврат Результат;

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

Функция Метрика_ДействиеСоздатьДокументы()
	Возврат "Создать";
КонецФункции

//&НаКлиентеНаСервереБезКонтекста
Функция Метрика_ДействиеОткрытьСписокПлагинов()
	Возврат "Плагины";
КонецФункции

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

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

Функция Метрика_НазваниеКатегорийМассовыхДействий(Действие)

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

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

Функция Метрика_НазваниеДействияМаршрутизации(Действие) Экспорт
	
	Результат = Модуль_Ядро().Метрика_НазваниеДействияМаршрутизации(Действие);	
	
	Возврат Результат;
	
КонецФункции	

Функция Метрика_НазваниеДействияАннулирования(Действие) Экспорт
	
	Результат = "";
	
	Если Действие = ДействияЭДО().Аннулировать Тогда
		Результат = "Аннулировать";
	ИначеЕсли Действие = ДействияЭДО().ОтказатьВАннулировании Тогда
		Результат = "Отказать в аннулировании";
	КонецЕсли;	
	
	Возврат Результат;
	
КонецФункции

//&НаКлиенте
Функция Метрика_НазваниеДействияПодписание(Действие)
	
	Результат = "";
	
	Если Действие = ДействияЭДО().ПодписатьВходящий Тогда
		Результат = "Подписать";
	ИначеЕсли Действие = ДействияЭДО().ОтказатьВПодписи Тогда
		Результат = "Отказать контрагенту в подписи";
	КонецЕсли;	
	
	Возврат Результат;
	
КонецФункции

//&НаКлиенте
Функция Метрика_НазваниеФормы()
	
	Возврат "Основная форма";
	
КонецФункции

// Возвращает признак что в конфигурации есть объекты для хранения данных, РегистрДопСведений или ПодсистемаДиадока.
//
// Возвращаемое значение:
//    Булево
//
Функция СистемаХраненияОпределена()
	
	Ядро = Модуль_Ядро();
	Данные = Ядро.РезультатИнициализацииОсновногоМодуля();
	
	Результат = (Данные.УстановленРегистрДопСведений Или Данные.УстановленаПодсистемаДиадока);
	
	Возврат Результат;
	
КонецФункции

Процедура ВключитьДекорациюДлительнойОперации()
	
	СтраницыФормы = ЭтаФорма.ЭлементыФормы.СтраницыОсновныхЭлементовФормы;
	СтраницыФормы.ТекущаяСтраница = СтраницыФормы.Страницы.СтраницаДлительнаяОперация; 
	
КонецПроцедуры

Процедура ОбновитьНадписьДекорацииДлительнойОперации()
	
	ПорядковыйНомерОперацииЗагрузки = ПорядковыйНомерОперацииЗагрузки + 1;
	КоличествоОпераций = 7;
	
	ШаблонЗаголовка = НСтр(
		"ru = 'Запускаем модуль %1/%2.
		|Это может занять несколько минут.'"
	);
	
	Ядро = Модуль_Ядро();
	ТекстЗаголовкаДекорации = Ядро.Общее_ПодставитьПараметрыВСтроку(ШаблонЗаголовка, ПорядковыйНомерОперацииЗагрузки, КоличествоОпераций);
	
	ЭтаФорма.ЭлементыФормы.НадписьДлительнаяОперация.Заголовок = ТекстЗаголовкаДекорации;
	
КонецПроцедуры

Процедура ОтключитьДекорациюДлительнойОперацииОтложенно()
	
	ПодключитьОбработчикОжидания("ОтключитьДекорациюДлительнойОперации", 0.1, Истина);
	
КонецПроцедуры

Процедура ОтключитьДекорациюДлительнойОперации() Экспорт
	
	СтраницыФормы = ЭтаФорма.ЭлементыФормы.СтраницыОсновныхЭлементовФормы;
	СтраницыФормы.ТекущаяСтраница = СтраницыФормы.Страницы.СтраницаСписокДокументов;
	
КонецПроцедуры

Процедура ПоказатьИндикаторДлительнойОперации()
	
	СтраницыИндикаторыДлительнойОперации = ЭтаФорма.ЭлементыФормы.ПанельИндикаторыДлительнойОперации;
	СтраницыИндикаторыДлительнойОперации.ТекущаяСтраница = СтраницыИндикаторыДлительнойОперации.Страницы.СтраницаДлительнаяОперация;
	
КонецПроцедуры

Процедура ПоказатьИндикаторПредупреждения()
	
	СтраницыИндикаторыДлительнойОперации = ЭтаФорма.ЭлементыФормы.ПанельИндикаторыДлительнойОперации;
	СтраницыИндикаторыДлительнойОперации.ТекущаяСтраница = СтраницыИндикаторыДлительнойОперации.Страницы.СтраницаПредупреждение;
	
КонецПроцедуры

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

// }	ВСПОМОГАТЕЛЬНЫЕ МЕТОДЫ ФОРМЫ

// {	ОБЩИЕ МЕТОДЫ

//&НаКлиенте
Процедура ОбновитьСвойствоЭлементаФормы(Элемент, СвойствоЭлемента, ЗначениеСвойства) Экспорт
	
	Если Элемент[СвойствоЭлемента] <> ЗначениеСвойства Тогда
		Элемент[СвойствоЭлемента] = ЗначениеСвойства;
	КонецЕсли;
	
КонецПроцедуры

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

Процедура Обработчик_ОткрытьФайл(ИмяВременногоФайла, ИмяФайла) Экспорт
		
	Если ЗначениеЗаполнено(ИмяВременногоФайла) Тогда
		ЗапуститьПриложение(ИмяВременногоФайла);
	КонецЕсли;
	
КонецПроцедуры

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

Процедура Обработчик_КопироватьФайл_Завершение(ВыбранныеФайлы, ИмяВременногоФайла) Экспорт
	
	Если ЗначениеЗаполнено(ВыбранныеФайлы) Тогда
		КопироватьФайл(ИмяВременногоФайла, ВыбранныеФайлы[0]);
	КонецЕсли;
	
КонецПроцедуры

Функция СохранитьДвоичныеДанныеВоВременныйФайл(ДвоичныеДанные, ИмяФайла) Экспорт
	
	Каталог = Вычислить("КаталогВременныхФайлов()");
	
	Результат = СохранитьДвоичныеДанныеВФайл(ДвоичныеДанные, ИмяФайла, Каталог);
	
	Возврат Результат;
	
КонецФункции

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

Функция ЗаменитьНедопустимыеСимволыИмениФайла(ИмяФайла) Экспорт
	
	Результат = ИмяФайла;
	
	НедопустимыеСимволы = ":~!@/\#$%^&*=|`""?<>";
	КоличествоНедопустимыхСимволов = СтрДлина(НедопустимыеСимволы);
	
	Для Сч = 1 По КоличествоНедопустимыхСимволов Цикл
		Результат = СтрЗаменить(Результат, Сред(НедопустимыеСимволы, Сч, 1), "_");
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

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

Функция ЭтоОповещение(Знач АдресСсылки)
	
	АдресСсылки = НРег(АдресСсылки);
	
	Результат = Найти(АдресСсылки, "alert:") > 0 ИЛИ Найти(АдресСсылки, "alertandclose:") > 0;
	
	Возврат Результат;
	
КонецФункции

Функция ЭтоАдресСсылки(Знач АдресСсылки)
	
	АдресСсылки = НРег(АдресСсылки);
	
	Результат = Ложь
	Или Найти(АдресСсылки, "e1cib/")	 = 1
	Или Найти(АдресСсылки, "http:")		 = 1
	Или Найти(АдресСсылки, "https:")	 = 1
	Или Найти(АдресСсылки, "e1c:")		 = 1
	Или Найти(АдресСсылки, "v8help:")	 = 1
	Или Найти(АдресСсылки, "mailto:")	 = 1
	Или Найти(АдресСсылки, "tel:")		 = 1
	Или Найти(АдресСсылки, "skype:")	 = 1;
	
	Возврат Результат;
	
КонецФункции

Процедура ВыполнитьОповещение(АдресСсылки, ДополнительныеПараметры, ФормаСобытия)
	
	ПараметрыОповещения		= Модуль_Ядро().ПараметрыОповещенияИзСтрокиHTMLСообщения(АдресСсылки);
	ОбработчикОповещения	= ПараметрыОповещения.ОбработчикОповещения;
	РезультатОповещения		= ПараметрыОповещения.РезультатОповещения;
	
	ОписаниеОповещения = НовыйОписаниеОповещения(ОбработчикОповещения, ФормаСобытия, ДополнительныеПараметры);
	
	ВыполнитьОбработкуОповещенияПереопределенная(ОписаниеОповещения, РезультатОповещения);
	
КонецПроцедуры

//&НаКлиенте
Процедура ПерейтиПоСсылке(АдресСсылки)
	
	#Если ТолстыйКлиентОбычноеПриложение Тогда
		ЗапуститьПриложение(АдресСсылки);
	#Иначе
		ПерейтиПоНавигационнойСсылке(АдресСсылки);
	#КонецЕсли
	
КонецПроцедуры

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

//&НаКлиенте
Функция ПараметрыВМассив(Параметр0 = NULL,
						 Параметр1 = NULL,
						 Параметр2 = NULL,
						 Параметр3 = NULL,
						 Параметр4 = NULL) Экспорт
	
	Результат = Модуль_Ядро().ПараметрыВМассив(Параметр0, Параметр1, Параметр2, Параметр3, Параметр4);
	
	Возврат Результат;
	
КонецФункции

Функция Цвет_АктивнаяКнопка() Экспорт
	
	Результат = Новый Цвет(255, 255, 255);
	
	Возврат Результат;
	
КонецФункции

Функция Цвет_НеактивнаяКнопка() Экспорт
	
	Результат = Новый Цвет(230, 230, 230);
	
	Возврат Результат;
	
КонецФункции

Функция Цвет_НетСвязиСДанными1С() Экспорт
	
	Результат = Новый Цвет(128, 128, 128); // Серый
	
	Возврат Результат;
	
КонецФункции

Функция Цвет_ИннКппНеЗаполнены() Экспорт
	
	Результат = Новый Цвет(255, 0, 0); // красный
	
	Возврат Результат;
	
КонецФункции

Процедура ОткрытьФормуСДаннымиСертификата(ДанныеСертификата, мВладелецФормы) Экспорт
	
	Платформа = Модуль_Платформа();
	Платформа.ПоказатьОписаниеСертификата(ДанныеСертификата, мВладелецФормы);
	
КонецПроцедуры

//&НаКлиенте
Функция ЭтоФормализованныйАктСверки405(ТипКонтента)
	
	Возврат Нрег(ТипКонтента) = "reconciliationact405";
	
КонецФункции

// {	ТИПИЗАЦИЯ ПОЛЯ СОСТАВНОГО ТИПА

//&НаКлиенте
Функция ОграничениеТипа_Неопределено() Экспорт
	
	Результат = Новый ОписаниеТипов("Неопределено");
	
	Возврат Результат;
	
КонецФункции

// }	ТИПИЗАЦИЯ ПОЛЯ СОСТАВНОГО ТИПА


// }	ОБЩИЕ МЕТОДЫ

// {	МЧД

// Для переданных данных групповой операции выполняет проверку данных МЧД
//
// Параметры:
//	ОписаниеГрупповойОперации - Структура - см. Новый_ОписаниеГрупповойОперации()
//
//&НаКлиенте
Процедура МЧД_НачатьПроверкуДанныхГрупповойОперации(ОписаниеГрупповойОперации)
	
	ПараметрыГрупповойОбработки = ОписаниеГрупповойОперации.ПараметрыГрупповойОбработки;
	ТекущееДействиеЭДО = ПараметрыГрупповойОбработки.Действие;
	
	ТребуетсяМЧД = Модуль_Ядро().МЧД_ДействияТребующиеДоверенность().Получить(ТекущееДействиеЭДО);
	
	Если ТребуетсяМЧД = Истина Тогда
		
		МЧД_ПроверитьДанныеГрупповойОперацииНаПоддержкуМЧДВРоуминге(ОписаниеГрупповойОперации);
		
	Иначе
		
		Обработчик_ВыполнитьГрупповуюОперациюПослеЗавершенияПроверок(Неопределено, ОписаниеГрупповойОперации);
		
	КонецЕсли;
	
КонецПроцедуры

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

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

//&НаСервере
Функция СтороныДокументооборотаДляПроверкиПоддержкиМЧДВРоуминге(Документ)
	
	Ядро = Модуль_Ядро();
	РежимыОтображения = РежимыОтображения();
	
	Результат = Новый Структура("Контрагент, Организация");

	ЕстьОтправитель = Документ.Свойство("Отправитель");
	ЕстьПолучатель = Документ.Свойство("Получатель");
	
	Если ЕстьОтправитель И ЕстьПолучатель Тогда
		
		Результат.Контрагент = Ядро.Документы_Контрагент(Документ);
		Результат.Организация = Ядро.Документы_Организация(Документ);
		
	Иначе
		
		ИдентификаторыОрганизации	 = Ядро.Новый_ИдентификаторыСправочника(Документ.Организация);
		УчастникДО_Организации		 = Ядро.Организации_ЗаполнитьУчастникаДО(ИдентификаторыОрганизации);
		ИдентификаторыКонтрагента	 = Ядро.Новый_ИдентификаторыСправочника(Документ.Контрагент); 
		УчастникДО_Контрагенты		 = Ядро.Контрагенты_ЗаполнитьУчастникаДО(ИдентификаторыКонтрагента, ИдентификаторыОрганизации);
		
		ОрганизацияBoxId			 = УчастникДО_Организации.BoxId;
		КонтрагентFNSParticipantId	 = УчастникДО_Контрагенты.FNSParticipantId;
		КонтрагентНаименование		 = УчастникДО_Контрагенты.Наименование;
		
		Результат.Контрагент = УчастникДО_Контрагенты;
		Результат.Организация = УчастникДО_Организации;
		
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции // ()

//&НаСервере
Процедура ДополнитьСписокОшибокМЧДВРоуминге(ОшибкиПоОрганизациям, СтороныДокументооборота)
	
	Ядро = Модуль_Ядро();
	
	КонтрагентFNSParticipantId	 = СтороныДокументооборота.Контрагент.FNSParticipantId;
	ОрганизацияBoxId			 = СтороныДокументооборота.Организация.BoxId;
	
	ОписаниеОшибки = ОшибкиПоОрганизациям.Получить(ОрганизацияBoxId);
	Если ОписаниеОшибки = Неопределено Тогда
		
		Метрика_ВидыОшибокПроверокМЧД = Метрика_ВидыОшибокПроверокМЧД();
		РазделыОшибок = Ядро.МЧД_РазделыОшибокПроверкиМЧД();
		
		ОписаниеОшибки = Новый_ОписаниеОшибкиПроверкиМЧДпоУмолчанию(
			РазделыОшибок.КонтрагентНеПоддерживаетМЧДВРоуминге,
			"",
			Новый Массив,
			Метрика_ВидыОшибокПроверокМЧД.НеУказанаДоверенность,
			ОрганизацияBoxId
		);
		
		ОшибкиПоОрганизациям.Вставить(ОрганизацияBoxId, ОписаниеОшибки);
		
	КонецЕсли;
	
	ИдентификаторФНСОператора	 = Ядро.ИдентификаторФНСИзИдентификаторУчастникаЭДО(КонтрагентFNSParticipantId);
	ПредставлениеОператораЭДО	 = Ядро.ПредставлениеОператораЭДО(ИдентификаторФНСОператора, ОрганизацияBoxId);
	ПредставлениеКонтрагента	 = СтороныДокументооборота.Контрагент.Наименование + " (" + ПредставлениеОператораЭДО + ")";
	
	ОшибкаВСписке = ОписаниеОшибки.СписокОшибок.Найти(ПредставлениеКонтрагента);
	Если ОшибкаВСписке = Неопределено Тогда
		ОписаниеОшибки.СписокОшибок.Добавить(ПредставлениеКонтрагента);
	КонецЕсли;

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

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

// Для переданных данных групповой операции выполняет заполнение МЧД по умолчанию
// Выводит диалог выбора с ошибками проверки
//
// Параметры:
//	ОписаниеГрупповойОперации - Структура - см. Новый_ОписаниеГрупповойОперации()
//
Процедура МЧД_ПроверитьДанныеГрупповойОперацииНаМЧДПоУмолчанию(ОписаниеГрупповойОперации)

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

Функция ПараметрыДляПроверкиМЧД(ОповещениеЗавершения, ИдентификаторЯщика, ВыбраннаяМЧД, ДействиеЭДО, ГрупповоеДействие = Ложь) Экспорт

	Результат = Новый Структура;
	Результат.Вставить("ОповещениеЗавершения"		, ОповещениеЗавершения);
	Результат.Вставить("ИдентификаторЯщика"			, ИдентификаторЯщика);
	Результат.Вставить("ВыбраннаяМЧД"				, ВыбраннаяМЧД);
	Результат.Вставить("ДействиеЭДО"				, ДействиеЭДО);
	Результат.Вставить("ГрупповоеДействие"			, ГрупповоеДействие); 
	Результат.Вставить("ВызовИзТитулаИлиОтказа"		, Ложь); 
	Результат.Вставить("ОшибкиПроверокМЧД"			, Новый Массив); 
	
	Результат.Вставить("РезультатПроверкиМЧД");
	Результат.Вставить("НазваниеФормыДляМетрики");

	Результат.Вставить("ОписаниеОповещенияДобавленияМетрики");
	
	Возврат Результат;

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

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

// BSLLS:MissingReturnedValueDescription-off
// BSLLS:MissingParameterDescription-off
Функция МЧД_БыстраяПроверка(Знач ВыбраннаяМЧД, Знач ИдентификаторЯщика)
	// BSLLS:MissingReturnedValueDescription-on
	// BSLLS:MissingParameterDescription-on
	Модуль_Ядро = Модуль_Ядро();
	
	Результат = Модуль_Ядро.МЧД_БыстраяПроверка(ВыбраннаяМЧД, ИдентификаторЯщика);
	
	Возврат Результат;
	
КонецФункции

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

Процедура ПоказатьВопрос_НеВыбранаМЧД(Оповещение, ПараметрыДляПроверкиМЧД)

	ПараметрыДляПроверкиМЧД.НазваниеФормыДляМетрики = Метрика_НазванияФормМЧД().НеВыбранаДоверенность;
	
	Метрика_ОткрытиеФормыПредупрежденияПослеПроверкиМЧД(ПараметрыДляПроверкиМЧД);
	
	ГрупповоеДействие = ПараметрыДляПроверкиМЧД.ГрупповоеДействие И НЕ ПараметрыДляПроверкиМЧД.ВызовИзТитулаИлиОтказа;
	
	ДействияНаФормеВопросаМЧД = ДействияНаФормеВопросаМЧД();
	
	КнопкиВопроса = Новый СписокЗначений;
	КнопкиВопроса.Добавить(ДействияНаФормеВопросаМЧД.ПродолжитьБезМЧД, ДействияНаФормеВопросаМЧД.ПродолжитьБезМЧД);
	Если ГрупповоеДействие Тогда
		КнопкиВопроса.Добавить(
			ДействияНаФормеВопросаМЧД.ОткрытьСписокОшибок,
			ДействияНаФормеВопросаМЧД.ОткрытьСписокОшибок
		);
	КонецЕсли;
	КнопкиВопроса.Добавить(ДействияНаФормеВопросаМЧД.Закрыть, ДействияНаФормеВопросаМЧД.Закрыть);
	
	ТекстВопроса = 
	"С 1 сентября 2024 года при работе с электронными документами требуется подтверждать полномочия подписанта "
	+ "машиночитаемой доверенностью (МЧД). Если подтверждаете полномочия иным способом, продолжите без МЧД.";
	
	Если ГрупповоеДействие Тогда
		ОписаниеОповещенияОЗавершении = НовыйОписаниеОповещения(
			"ОбработатьРезультатПриГрупповыхДействияхНаФормеВопросаМЧД",
			ЭтаФорма,
			ПараметрыДляПроверкиМЧД
		);
	Иначе
		ОписаниеОповещенияОЗавершении = Оповещение;
	КонецЕсли;
	
	ПоказатьВопросПереопределенная(
		ОписаниеОповещенияОЗавершении,
		ТекстВопроса,
		КнопкиВопроса,
		,
		ДействияНаФормеВопросаМЧД.Закрыть,
		"Не выбрана доверенность"
	);
	
КонецПроцедуры

Процедура ПоказатьВопрос_ВыбраннаяМЧДНеПодходит(Оповещение, ПараметрыДляПроверкиМЧД)
	
	ПараметрыДляПроверкиМЧД.НазваниеФормыДляМетрики = Метрика_НазванияФормМЧД().ВыбраннаяДоверенностьНеПодходит;
	
	Метрика_ОткрытиеФормыПредупрежденияПослеПроверкиМЧД(ПараметрыДляПроверкиМЧД);
	
	ДействияНаФормеВопросаМЧД = ДействияНаФормеВопросаМЧД();
	
	КнопкиВопроса = Новый СписокЗначений;
	КнопкиВопроса.Добавить(ДействияНаФормеВопросаМЧД.ПродолжитьБезМЧД			, ДействияНаФормеВопросаМЧД.ПродолжитьБезМЧД);
	КнопкиВопроса.Добавить(ДействияНаФормеВопросаМЧД.Закрыть					, ДействияНаФормеВопросаМЧД.Закрыть);
	
	ШаблонВопроса = 
	"%1
	|
	|%2 
	|
	|Выберите другую доверенность или выпустите новую.";
	
	МассивОшибок = Новый Массив;
	Для каждого ОписаниеОшибки Из ПараметрыДляПроверкиМЧД.РезультатПроверкиМЧД.СписокОшибок Цикл
		РасшифровкаОшибки	 = "- " + ОписаниеОшибки.Расшифровка;
		МассивОшибок.Добавить(РасшифровкаОшибки);
	КонецЦикла;
	СписокОшибокСтрокой	 = Модуль_Ядро().СоединитьСтроку(МассивОшибок, Символы.ПС);
	ПредставлениеМЧД	 = ПараметрыДляПроверкиМЧД.ВыбраннаяМЧД.ПредставлениеМЧД;
	
	ТекстВопроса = Модуль_Ядро().Общее_ПодставитьПараметрыВСтроку(ШаблонВопроса, ПредставлениеМЧД, СписокОшибокСтрокой);
	
	ПоказатьВопросПереопределенная(Оповещение, ТекстВопроса, КнопкиВопроса, , ДействияНаФормеВопросаМЧД.Закрыть , "Выбранная доверенность не подходит");
	
КонецПроцедуры

// BSLLS:MissingReturnedValueDescription-off
// BSLLS:MissingParameterDescription-off
Процедура ПоказатьВопрос_ВыбраннаяМЧДИмеетПредупреждения(Оповещение, ПараметрыДляПроверкиМЧД)
	// BSLLS:MissingReturnedValueDescription-on
	// BSLLS:MissingParameterDescription-on
	ПараметрыДляПроверкиМЧД.НазваниеФормыДляМетрики = Метрика_НазванияФормМЧД().ВыбраннаяДоверенностьИмеетПредупреждения;
	
	Метрика_ОткрытиеФормыПредупрежденияПослеПроверкиМЧД(ПараметрыДляПроверкиМЧД);
	Метрика_ЗаписатьСтатистику_ДоверенностьСПредупреждениями(ПараметрыДляПроверкиМЧД);
	
	ДействияНаФормеВопросаМЧД = ДействияНаФормеВопросаМЧД();
	
	КнопкиВопроса = Новый СписокЗначений;
	КнопкиВопроса.Добавить(ДействияНаФормеВопросаМЧД.ПродолжитьСМЧД, ДействияНаФормеВопросаМЧД.ПродолжитьСМЧД);
	КнопкиВопроса.Добавить(ДействияНаФормеВопросаМЧД.ПродолжитьБезМЧД, ДействияНаФормеВопросаМЧД.ПродолжитьБезМЧД);
	КнопкиВопроса.Добавить(ДействияНаФормеВопросаМЧД.Закрыть, ДействияНаФормеВопросаМЧД.Закрыть);
	
	ШаблонВопроса =
		"%1
		|
		|%2 
		|
		|Если хотите выполнить действие с выбранной доверенностью, то продолжите с МЧД. При необходимости выберите другую 
		|доверенность или продолжите действие без МЧД.";
	
	МассивОшибок = Новый Массив;
	Для Каждого ОписаниеОшибки Из ПараметрыДляПроверкиМЧД.РезультатПроверкиМЧД.СписокОшибок Цикл
		РасшифровкаОшибки = "- " + ОписаниеОшибки.Расшифровка;
		МассивОшибок.Добавить(РасшифровкаОшибки);
	КонецЦикла;
	
	Модуль_Ядро = Модуль_Ядро();
	
	СписокОшибокСтрокой = Общее_СоединитьСтроку(МассивОшибок, Символы.ПС);
	ПредставлениеМЧД = ПараметрыДляПроверкиМЧД.ВыбраннаяМЧД.ПредставлениеМЧД;
	
	ТекстВопроса = Модуль_Ядро.Общее_ПодставитьПараметрыВСтроку(ШаблонВопроса, ПредставлениеМЧД, СписокОшибокСтрокой);
	
	ПоказатьВопросПереопределенная(
		Оповещение,
		ТекстВопроса,
		КнопкиВопроса,
		,
		ДействияНаФормеВопросаМЧД.ПродолжитьСМЧД,
		"Выбранная доверенность с предупреждениями");
	
КонецПроцедуры

Процедура ПоказатьВопрос_НетПодходящейДоверенности(ПараметрыДляПроверкиМЧД, ОбработчикВопроса = Неопределено) Экспорт
	
	ПараметрыДляПроверкиМЧД.НазваниеФормыДляМетрики = Метрика_НазванияФормМЧД().НетПодходящихДовереностей;
	
	Метрика_ОткрытиеФормыПредупрежденияПослеПроверкиМЧД(ПараметрыДляПроверкиМЧД);
	
	ДействияНаФормеВопросаМЧД = ДействияНаФормеВопросаМЧД();
	
	КнопкиВопроса = Новый СписокЗначений;
	КнопкиВопроса.Добавить(ДействияНаФормеВопросаМЧД.ПродолжитьБезМЧД	, ДействияНаФормеВопросаМЧД.ПродолжитьБезМЧД);
	КнопкиВопроса.Добавить(ДействияНаФормеВопросаМЧД.ОткрытьСписокОшибок, ДействияНаФормеВопросаМЧД.ОткрытьСписокОшибок);
	КнопкиВопроса.Добавить(ДействияНаФормеВопросаМЧД.Закрыть			, ДействияНаФормеВопросаМЧД.Закрыть);
	
	ТекстВопроса =
	"С 1 сентября 2024 года при работе с электронными документами требуется подтверждать полномочия подписанта "
	+ "машиночитаемой доверенностью (МЧД).
	|
	|При выполнении действия с доверенностями произошли ошибки. Перейдите по кнопке ""Подробнее"" для просмотра причин";
	
	Если ОбработчикВопроса = Неопределено Тогда
		ОбработчикВопроса = НовыйОписаниеОповещения(
			"ОбработатьРезультатПриГрупповыхДействияхНаФормеВопросаМЧД",
			ЭтаФорма,
			ПараметрыДляПроверкиМЧД
		);
	КонецЕсли;
	
	ПоказатьВопросПереопределенная(
		ОбработчикВопроса,
		ТекстВопроса,
		КнопкиВопроса,
		,
		ДействияНаФормеВопросаМЧД.Закрыть,
		"Нет подходящих доверенностей"
	);
	
КонецПроцедуры

// Выводит вопрос "Оператор контрагента не поддерживает МЧД"
// Используется для группового действия
//
// Параметры:
//	ПараметрыДляПроверкиМЧД - Структура - см. ПараметрыДляПроверкиМЧД()
//
Процедура ПоказатьВопрос_КонтрагентыДокументовНеПоддерживаютМЧД(ПараметрыДляПроверкиМЧД) 
	
	ПараметрыДляПроверкиМЧД.НазваниеФормыДляМетрики = Метрика_НазванияФормМЧД().ПоддержкаОператоромМЧД;
	
	Метрика_ОткрытиеФормыПредупрежденияПослеПроверкиМЧД(ПараметрыДляПроверкиМЧД);
	
	ДействияНаФормеВопросаМЧД = ДействияНаФормеВопросаМЧД();
	
	КнопкиВопроса = Новый СписокЗначений;
	КнопкиВопроса.Добавить(ДействияНаФормеВопросаМЧД.Продолжить, ДействияНаФормеВопросаМЧД.Продолжить);
	КнопкиВопроса.Добавить(ДействияНаФормеВопросаМЧД.ОткрытьСписокОшибок, ДействияНаФормеВопросаМЧД.ОткрытьСписокОшибок);
	КнопкиВопроса.Добавить(ДействияНаФормеВопросаМЧД.Закрыть, ДействияНаФормеВопросаМЧД.Закрыть);
	
	ШаблонВопроса = 
	"Не для всех выделенных документов можно выполнить операцию: %1 с МЧД в роуминге.
	|
	|Перейдите по кнопке ""Подробнее"" для просмотра причин. 
	|
	|Нажмите ""Продолжить"", чтобы выполнить действие для всех документов. Они отправятся без МЧД или с ней.";

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

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

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

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

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

Функция ПолучитьДействующиеМЧДпоУмолчанию(ИдентификаторыЯщиков, СписокОшибок) Экспорт
	
	Результат = Новый Соответствие;
	
	Модуль_Ядро = Модуль_Ядро();
	
	КонекстыДанныхМЧД = Модуль_Ядро.МЧД_ДанныеПоИспользованиюДоверенностейПоСпискуBoxId(ИдентификаторыЯщиков);
	РазделыОшибок = Модуль_Ядро.МЧД_РазделыОшибокПроверкиМЧД();
	Метрика_ВидыОшибокПроверокМЧД = Метрика_ВидыОшибокПроверокМЧД();
	
	Для Каждого ИдентификаторЯщика Из ИдентификаторыЯщиков Цикл
		
		КонтекстМЧД = КонекстыДанныхМЧД.Получить(ИдентификаторЯщика);
		
		Если НЕ КонтекстМЧД.ТребуетсяМЧД Тогда
			Продолжить;
		КонецЕсли;
		
		КонтрактМЧД = Неопределено;
		
		Если ЗначениеЗаполнено(КонтекстМЧД.МЧД) Тогда
			
			КонтрактМЧД = КонтекстМЧД.СписокМЧД.Получить(КонтекстМЧД.МЧД);
			
			РезультатПроверкиМЧД = КонтекстМЧД.РезультатПроверкиМЧД;
			Если НЕ РезультатПроверкиМЧД.ЭтоДействующаяМЧД 
				И НЕ РезультатПроверкиМЧД.ЭтоПредупреждение Тогда
				
				НаименованиеОрганизации = Модуль_Ядро.КонтекстСеанса_Прочитать(ИдентификаторЯщика, "ОрганизацияНаименование");
				
				ТекстОшибки = Модуль_Ядро.Общее_ПодставитьПараметрыВСтроку(
					"Для организации ""%1"" доверенность ""%2"" не прошла проверку",
					НаименованиеОрганизации,
					КонтрактМЧД.Представитель.Наименование);
				
				ОписаниеОшибки = Новый_ОписаниеОшибкиПроверкиМЧДпоУмолчанию(
					РазделыОшибок.МЧДнеПодходит,
					ТекстОшибки,
					РезультатПроверкиМЧД.СписокОшибок,
					Метрика_ВидыОшибокПроверокМЧД.ДоверенностьНеПодходит,
					ИдентификаторЯщика);
				
				СписокОшибок.Добавить(ОписаниеОшибки);
				
				КонтрактМЧД = Неопределено;

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

	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

//&НаКлиентеНаСервереБезКонтекста
Функция Новый_ОписаниеОшибкиПроверкиМЧДпоУмолчанию(Раздел, РасшифровкаСтатуса, СписокОшибок, Метрика_ВидОшибкиПроверкиМЧД, ИдентификаторЯщика)

	Результат = Новый Структура;
	Результат.Вставить("Раздел"				, Раздел);
	Результат.Вставить("РасшифровкаСтатуса"	, РасшифровкаСтатуса);
	Результат.Вставить("СписокОшибок"		, СписокОшибок);
	Результат.Вставить("Метрика_ВидОшибкиПроверкиМЧД"		, Метрика_ВидОшибкиПроверкиМЧД);
	Результат.Вставить("ИдентификаторЯщика"		, ИдентификаторЯщика);
	 
	Возврат Результат;
	
КонецФункции

Функция ТребуетсяМЧД(ИдентификаторЯщика) Экспорт
	
	Результат = Ложь;
	
	Если ЗначениеЗаполнено(ИдентификаторЯщика) Тогда
		КонтекстСеансаПоЯщику = Модуль_Ядро().КонтекстСеанса_СтрокаКонтекста(ИдентификаторЯщика);
		Результат = КонтекстСеансаПоЯщику.ТребуетсяМЧД = Истина;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция ПараметрыФормыВыбораМЧД(ЗаголовокФормы = ""
	, ЗаголовокКнопки = ""
	, ИдентификаторЯщика = ""
	, ДействиеЭДО = ""
	, КатегорияМетрикиДокумента = ""
	, КонтрагентПоддерживаетМЧД = Истина) Экспорт

	Результат = Новый Структура;
	Результат.Вставить("ЗаголовокФормы"				, ЗаголовокФормы);
	Результат.Вставить("ЗаголовокКнопкиДействия"	, ЗаголовокКнопки);
	Результат.Вставить("ИдентификаторЯщика"			, ИдентификаторЯщика);
	Результат.Вставить("ДействиеЭДО"				, ДействиеЭДО);
	Результат.Вставить("КатегорияМетрикиДокумента"	, КатегорияМетрикиДокумента);
	Результат.Вставить("КонтрагентПоддерживаетМЧД"	, КонтрагентПоддерживаетМЧД);

	Возврат Результат;
	
КонецФункции

//&НаКлиенте
Функция РезультатВыбораМЧД(РазрешитьДействие, КонтрактМЧД) Экспорт

	Результат = Новый Структура;
	Результат.Вставить("РазрешитьДействие"	, РазрешитьДействие);
	Результат.Вставить("КонтрактМЧД"		, КонтрактМЧД);
	
	Возврат Результат;
	
КонецФункции 

// см. ДополнитьДокументыСведениямиМЧДКлиентСервер()
// 
//&НаКлиенте
Процедура ДополнитьДокументыСведениямиМЧДНаКлиенте(КонтрактыДокументов, КонтрактМЧД) Экспорт
	
	Для Каждого Документ Из КонтрактыДокументов Цикл	
		ДополнитьДокументСведениямиМЧДКлиентСервер(Документ, КонтрактМЧД)
	КонецЦикла;
	
КонецПроцедуры

// Дополняет служебную информацию переданных документов КонтрактомМЧД 
// 
// Параметры:
//    Документ		 - Структура - ДокументДД, см. Модуль_Ядро.Контракт_Документ().
//    КонтрактМЧД	 - Структура - см. Модуль_Ядро.Контракт_МЧД().
// 
//&НаКлиентеНаСервереБезКонтекста
Процедура ДополнитьДокументСведениямиМЧДКлиентСервер(Документ, КонтрактМЧД)
	
	Если НЕ Документ.СлужебнаяИнформация.Свойство("КонтрактМЧД") Тогда
		Документ.СлужебнаяИнформация.Вставить("КонтрактМЧД", КонтрактМЧД);
	КонецЕсли;
	
КонецПроцедуры

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

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

Процедура ОбработатьЗакрытиеФормыHTMLСообщения(Результат, ДополнительныеПараметры) Экспорт

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

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

Функция ДействияНаФормеВопросаМЧД() Экспорт
	
	Результат = Новый Структура;
	Результат.Вставить("ПродолжитьБезМЧД", "Продолжить без МЧД");
	Результат.Вставить("ДействоватьСМЧД", "Действовать с МЧД");
	Результат.Вставить("ПродолжитьСМЧД", "Продолжить с МЧД");
	Результат.Вставить("ОткрытьСписокОшибок", "Подробнее");
	Результат.Вставить("Закрыть", "Закрыть");
	Результат.Вставить("Продолжить", "Продолжить");
	
	Возврат Результат;
	
КонецФункции

Процедура ОткрытьФормуВыбораДоверенности(ОписаниеОбработчикаЗакрытия, ПараметрыОткрытияФормы) Экспорт
	
	ОткрытьФормуДиадокМодально(
		"МЧД_ФормаВыбора",
		ОписаниеОбработчикаЗакрытия.Модуль,
		ПараметрыОткрытияФормы,
		ОписаниеОбработчикаЗакрытия,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

Процедура НачатьПроверкуОшибкокМЧДПоУмолчанию()
	
	БольшеНеПоказывать = НастройкиПользователяПрочитать_НеПоказыватьПредупрежденияПоМЧД();
	
	Если БольшеНеПоказывать = Ложь Тогда
		
		ПодключитьОбработчикОжидания("ПоказатьПредупреждениеСОшибкамиМЧДУСотрудниковПоОрганизациям", 0.1, Истина);
		
	КонецЕсли;
	
КонецПроцедуры  

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

//&НаКлиенте
Функция ЕстьЯщикДляДействийСДокументамиВКоторомНужнаМЧД()
	
	Результат = Ложь;
	
	СтрокиКонтекста = Модуль_Ядро().КонтекстСеанса_СтрокиКонтекста();
	Для Каждого СтрокаКонтекста Из СтрокиКонтекста Цикл
		КонтекстЯщика = СтрокаКонтекста.Значение;
		Если КонтекстЯщика.ТребуетсяМЧД Тогда
			Результат = Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Результат;

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

// Обрабатывает нажатие гиперссылки на скачивание файлов доверенности в формах пакета и сообщения HTML
//
// Параметры:
//  ПараметрыСкачиванияФайловМЧД - Строка - см. Ядро.Новый_ПараметрыГиперссылкиСкачатьФайлыДоверенности()
//
Процедура ОбработатьНажатиеГиперссылкиСкачатьФайлыМЧД(ПараметрыСкачиванияФайловМЧД) Экспорт
	
	ОписаниеОповещения = НовыйОписаниеОповещения("ОкончаниеВыбораКаталогаПриНажатииСкачатьФайлыДоверенности", ЭтаФорма, ПараметрыСкачиванияФайловМЧД);
	ПоказатьДиалогВыбораКаталога(ОписаниеОповещения, НСтр("ru = 'Сохранение файлов доверенности на диск'"));
	
КонецПроцедуры

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

Процедура СохранитьФайлыДоверенностиНаДиск(ФайлыДоверенности, ПолноеИмяКаталога)
	
	ДанныеДоверенности	= ФайлыДоверенности.Данные;
	ДанныеПодписи		= ФайлыДоверенности.Подпись.ДанныеПодписи;
	
	ИмяФайлаДоверенности	= ФайлыДоверенности.ИмяФайла + ".xml";
	ИмяФайлаПодписи			= ФайлыДоверенности.ИмяФайла + ".sig";
	
	ПолноеИмяФайлаДоверенности = СохранитьДвоичныеДанныеВФайл(ДанныеДоверенности, ИмяФайлаДоверенности, ПолноеИмяКаталога);
	ПолноеИмяФайлаПодписи = СохранитьДвоичныеДанныеВФайл(ДанныеПодписи, ИмяФайлаПодписи, ПолноеИмяКаталога);
	
КонецПроцедуры

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

Процедура ОкончаниеВыбораКаталогаПриНажатииСкачатьФайлЭлектроннойПодписи(
		ВыбранныйКаталог,
		ДанныеЭлектроннойПодписи) Экспорт
	
	Если НЕ ЗначениеЗаполнено(ВыбранныйКаталог) Тогда
		Возврат;
	КонецЕсли;
	
	ПолноеИмяКаталога = ВыбранныйКаталог[0];
	// BSLLS:UsingSynchronousCalls-off
	СоздатьКаталог(ПолноеИмяКаталога);
	// BSLLS:UsingSynchronousCalls-on
	ДанныеПодписи = ДанныеЭлектроннойПодписи.ДанныеПодписи;
	ИмяФайлаПодписи = ДанныеЭлектроннойПодписи.ИмяФайлаПодписи;
	ДвоичныеДанныеПодписи = Base64Значение(ДанныеПодписи);
	СохранитьДвоичныеДанныеВФайл(
		ДвоичныеДанныеПодписи, 
		ИмяФайлаПодписи, 
		ПолноеИмяКаталога);
	
КонецПроцедуры

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

Процедура ОкончаниеВыбораКаталогаПриНажатииСкачатьФайлСертификата(
		ВыбранныйКаталог, 
		ДанныеЭлектроннойПодписи) Экспорт
	
	Если НЕ ЗначениеЗаполнено(ВыбранныйКаталог) Тогда
		Возврат;
	КонецЕсли;
	
	Модуль_Ядро = Модуль_Ядро();
	ПолноеИмяКаталога = ВыбранныйКаталог[0];
	// BSLLS:UsingSynchronousCalls-off
	СоздатьКаталог(ПолноеИмяКаталога);
	// BSLLS:UsingSynchronousCalls-on
	ДанныеПодписи = ДанныеЭлектроннойПодписи.ДанныеПодписи;
	ДвоичныеДанныеПодписи = Base64Значение(ДанныеПодписи);
	ДанныеСертификата = Модуль_Ядро.ПолучитьСертификатИзПодписи(ДвоичныеДанныеПодписи);
	ИмяФайлаСертификата = ДанныеСертификата.СерийныйНомер + ".crt";
	
	СохранитьДвоичныеДанныеВФайл(
		ДанныеСертификата.ДвоичныеДанные, 
		ИмяФайлаСертификата, 
		ПолноеИмяКаталога);
	
КонецПроцедуры

Функция Метрика_НазванияФормМЧД()
	
	Результат = Новый Структура;
	Результат.Вставить("НеВыбранаДоверенность", "НеВыбранаДоверенность");
	Результат.Вставить("ВыбраннаяДоверенностьНеПодходит", "ВыбраннаяДоверенностьНеПодходит");
	Результат.Вставить("ВыбраннаяДоверенностьИмеетПредупреждения", "ВыбраннаяДоверенностьИмеетПредупреждения");
	Результат.Вставить("ОписаниеОшибокСМЧД", "ОписаниеОшибокСМЧД");
	Результат.Вставить("НетПодходящихДовереностей", "НетПодходящихДовереностей");
	Результат.Вставить("ПоддержкаОператоромМЧД", "ПоддержкаОператоромМЧД");
	
	Возврат Результат;
	
КонецФункции

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

//&НаКлиентеНаСервереБезКонтекста
Функция Метрика_ВидыОшибокПроверокМЧД()

	Результат = Новый Структура; 
	Результат.Вставить("НеУказанаДоверенность"				, "НеУказанаДоверенность");
	Результат.Вставить("ДоверенностьНеПодходит"				, "ДоверенностьНеПодходит");
	Результат.Вставить("ОператорНеПоддерживаетМЧДВРоуминге"	, "ОператорНеПоддерживаетМЧДВРоуминге");
	
	Возврат Результат;
	
КонецФункции

Процедура Метрика_ПродолжитьБезМЧД(ДополнительныеПараметры)

	КатегорияМетрики		 = Метрика_НазваниеКатегории().УведомлениеПриМассовыхДействиях;
	ДопПеременные			 = Метрика_ДополнительныеПеременныеМЧД(ДополнительныеПараметры);
	НазваниеФормыДляМетрики	 = ДополнительныеПараметры.НазваниеФормыДляМетрики;
	ЛейблМетрики			 = Метрика_НазваниеДействий().НажатиеКнопки;
	ПредставлениеМетрики	 = Метрика_ЛейблПоНазваниюФормыМЧД(НазваниеФормыДляМетрики);
	TraceId					 = Модуль_Ядро().TraceId();
	
	ДействиеМетрики = Метрика_НазваниеДействий().ДействоватьБезДоверенности;
	Модуль_Ядро().Метрика_ДобавитьПоведение_НажатиеКнопки(НазваниеФормыДляМетрики, КатегорияМетрики, ДействиеМетрики, ЛейблМетрики, ПредставлениеМетрики, TraceId);
	Для каждого ОписаниеОшибки Из ДополнительныеПараметры.ОшибкиПроверокМЧД Цикл
		Модуль_Ядро().Метрика_ДобавитьСтатистику_ДляОрганизации(ОписаниеОшибки.ИдентификаторЯщика, КатегорияМетрики, ДействиеМетрики, ЛейблМетрики, ДопПеременные, ПредставлениеМетрики, TraceId);
	КонецЦикла;
	
КонецПроцедуры

Процедура Метрика_СписокОшибокМЧД(ДополнительныеПараметры, ОткрытиеФормы)

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

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

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

	Возврат Результат;
	
КонецФункции

Функция Метрика_КолонкиФормыСписка()

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

Процедура Метрика_ОткрытиеФормыПредупрежденияПослеПроверкиМЧД(ПараметрыДляПроверкиМЧД)

	НазваниеФормыДляМетрики	= ПараметрыДляПроверкиМЧД.НазваниеФормыДляМетрики;
	ДопПеременные			= Метрика_ДополнительныеПеременныеМЧД(ПараметрыДляПроверкиМЧД);
	ДействиеМетрики			= Метрика_НазваниеДействий().ОткрытиеФормы;
	ЛейблМетрики			= Метрика_НазваниеДействий().НажатиеКнопки;
	ПредставлениеМетрики	= Метрика_ЛейблПоНазваниюФормыМЧД(НазваниеФормыДляМетрики);
	
	Если ПараметрыДляПроверкиМЧД.ГрупповоеДействие Тогда
		КатегорияМетрики	= Метрика_НазваниеКатегории().УведомлениеПриМассовыхДействиях;
	Иначе
		КатегорияМетрики	= Метрика_НазваниеКатегории().УведомлениеИзФормыПакета;
	КонецЕсли;

	Модуль_Ядро = Модуль_Ядро();
	
	Модуль_Ядро.Метрика_ДобавитьПоведение_ДействиеСФормой(
		НазваниеФормыДляМетрики, 
		КатегорияМетрики, 
		Истина, 
		ЛейблМетрики, 
		ПредставлениеМетрики);
		
	Для каждого ОписаниеОшибки Из ПараметрыДляПроверкиМЧД.ОшибкиПроверокМЧД Цикл
		
		Модуль_Ядро.Метрика_ДобавитьСтатистику_ДляОрганизации(
			ОписаниеОшибки.ИдентификаторЯщика, 
			КатегорияМетрики, 
			ДействиеМетрики, 
			ЛейблМетрики, 
			ДопПеременные, 
			ПредставлениеМетрики);

	КонецЦикла;
	
КонецПроцедуры

Процедура Метрика_ЗаписатьСтатистику_ДоверенностьСПредупреждениями(ПараметрыДляПроверкиМЧД)
	
	Модуль_Ядро = Модуль_Ядро();
	Метрика_НазваниеКатегории = Метрика_НазваниеКатегории();
	Метрика_НазваниеДействий = Метрика_НазваниеДействий();
	
	Если ПараметрыДляПроверкиМЧД.ГрупповоеДействие Тогда
		КатегорияМетрики = Метрика_НазваниеКатегории.УведомлениеПриМассовыхДействиях;
	Иначе
		КатегорияМетрики = Метрика_НазваниеКатегории.УведомлениеИзформыПакета;
	КонецЕсли;
	
	ИдентификаторЯщика = ПараметрыДляПроверкиМЧД.ИдентификаторЯщика;
	ДействиеМетрики = Метрика_НазваниеДействий.ОткрытиеФормы;
	Переменные = Метрика_ДополнительныеПеременныеМЧД(ПараметрыДляПроверкиМЧД);
	Метка = Неопределено;
	Представление = Неопределено;
	
	Модуль_Ядро.Метрика_ДобавитьСтатистику_ДляОрганизации(
		ИдентификаторЯщика,
		КатегорияМетрики,
		ДействиеМетрики,
		Метка,
		Переменные,
		Представление);
	
КонецПроцедуры

Процедура Метрика_ЗакрытиеФормыФормыПредупрежденияПослеПроверкиМЧД(ПараметрыДляПроверкиМЧД)

	НазваниеФормыДляМетрики	 = ПараметрыДляПроверкиМЧД.НазваниеФормыДляМетрики;
	ДопПеременные			 = Метрика_ДополнительныеПеременныеМЧД(ПараметрыДляПроверкиМЧД);
	ЛейблМетрики			 = Метрика_НазваниеДействий().НажатиеКнопки;
	ПредставлениеМетрики	 = Метрика_ЛейблПоНазваниюФормыМЧД(НазваниеФормыДляМетрики);
	TraceId					 = Модуль_Ядро().TraceId();
	
	Если ПараметрыДляПроверкиМЧД.ГрупповоеДействие Тогда
		КатегорияМетрики	= Метрика_НазваниеКатегории().УведомлениеПриМассовыхДействиях;
	Иначе
		КатегорияМетрики	= Метрика_НазваниеКатегории().УведомлениеИзФормыПакета;
	КонецЕсли;
	
	ДействиеМетрики			 = Метрика_НазваниеДействий().ЗакрытиеФормы;
	Модуль_Ядро().Метрика_ДобавитьПоведение_ДействиеСФормой(НазваниеФормыДляМетрики, КатегорияМетрики, Ложь, ЛейблМетрики, ПредставлениеМетрики, TraceId);
	Для каждого ОписаниеОшибки Из ПараметрыДляПроверкиМЧД.ОшибкиПроверокМЧД Цикл
		Модуль_Ядро().Метрика_ДобавитьСтатистику_ДляОрганизации(ОписаниеОшибки.ИдентификаторЯщика, КатегорияМетрики, ДействиеМетрики, ЛейблМетрики, ДопПеременные, ПредставлениеМетрики, TraceId);
	КонецЦикла;

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

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

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

Функция МЧД_ПредставлениеСведенийОДоверенностиНаСервере_HTML(КонтрактМЧД)
	
	Результат = МЧД_ПредставлениеСведенийОДоверенности_HTML(КонтрактМЧД);
	Возврат Результат;
	
КонецФункции

Функция МЧД_ПредставлениеПолномочийСервер_HTML(КонтрактМЧД)
	
	Результат = ОбработкаОбъект().МЧД_ПредставлениеПолномочий_HTML(КонтрактМЧД);
	
	Возврат Результат;
	
КонецФункции

Процедура МЧД_ПоказатьЦепочкуПередоверия(ДанныеМЧД, ПредставлениеТекущегоДокумента, ФормаВызова) Экспорт
	
	ПараметрыОткрытияФормы = Новый Структура;
	ПараметрыОткрытияФормы.Вставить("ДанныеМЧД", ДанныеМЧД);
	ПараметрыОткрытияФормы.Вставить("Режим", "ПередовериеМЧД");
	ПараметрыОткрытияФормы.Вставить("ПредставлениеТекущегоДокумента", ПредставлениеТекущегоДокумента);
	
	ОткрытьФормуДиадокМодально(
		"ФормаHTMLСообщения",
		ФормаВызова,
		ПараметрыОткрытияФормы,
		,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры



// }	МЧД

// {	КЭП

//&НаКлиенте
Процедура НачатьПроверкуОшибокКЭП()
	
	ПодключитьОбработчикОжидания("ПоказатьПредупреждениеСОшибкамиКЭППослеАвторизации", 0.1, Истина);
	
КонецПроцедуры

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

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

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

// Для переданных данных групповой операции выполняет проверку сертификатов на КЭП.
//
// Параметры:
//	ДанныеДляОбработки	 - Массив - см. Новый_ПараметрыГрупповойОбработки().ДанныеДляОбработки
//
// Возвращаемое значение:
//  Структура
//		* ОшибкиПроверки				 - Массив- Список ошибок проверки. См Ядро.Новый_ОписаниеОшибкиПроверкиКЭП() 
//		* ДанныеДляОбработкиБезОшибок	 - Массив- ДанныеДляОбработки без ошибок КЭП 
//
Функция КЭП_ПроверитьДанныеГрупповойОперацииНаСервере(ДанныеДляОбработки, ДействиеЭДО)
	
	Результат = Новый Структура;
	Результат.Вставить("ОшибкиПроверки"					, Новый Массив);
	Результат.Вставить("ДанныеДляОбработкиБезОшибок"	, Новый Массив);
	
	Модуль_Ядро = Модуль_Ядро();
	
	СгруппированныеДанные = СгруппироватьДанныеДляОбработкиПоИдентификаторуЯщика(ДанныеДляОбработки);
	
	Для каждого КлючЗначение Из СгруппированныеДанные Цикл
		
		BoxID = КлючЗначение.Ключ;
		
		ОписаниеОшибкиПроверкиКЭП = Модуль_Ядро.КЭП_ДоступноДействиеЭДО(ДействиеЭДО, BoxID);
		Если ЗначениеЗаполнено(ОписаниеОшибкиПроверкиКЭП) Тогда
			
			СгруппированныеДанные.Вставить(BoxId, Новый Массив);
			Модуль_Ядро.ДополнитьМассив(Результат.ОшибкиПроверки, ОписаниеОшибкиПроверкиКЭП);
			
		КонецЕсли;
		
	КонецЦикла;
	
	Для каждого ДанныеПоBoxID Из СгруппированныеДанные Цикл
		Модуль_Ядро.ДополнитьМассив(Результат.ДанныеДляОбработкиБезОшибок, ДанныеПоBoxID.Значение);
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

// Показывает пользователям форму с визуализацией ошибок проверок 
//
// Параметры:
//	ОписаниеГрупповойОперации - Структура - см. Новый_ОписаниеГрупповойОперации()
//
//&НаКлиенте
Процедура ПоказатьВопрос_НеДляВсехДокументовМожноВыполнитьДействиеКЭП(ОписаниеГрупповойОперации)
		
	ДействияНаФормеВопросаКЭП = ДействияНаФормеВопросаКЭП();
	
	КнопкиВопроса = Новый СписокЗначений;
	КнопкиВопроса.Добавить(ДействияНаФормеВопросаКЭП.Продолжить			, ДействияНаФормеВопросаКЭП.Продолжить);
	КнопкиВопроса.Добавить(ДействияНаФормеВопросаКЭП.ОткрытьСписокОшибок, ДействияНаФормеВопросаКЭП.ОткрытьСписокОшибок);
	КнопкиВопроса.Добавить(ДействияНаФормеВопросаКЭП.Закрыть			, ДействияНаФормеВопросаКЭП.Закрыть);
	
	ТекстВопроса = 
	"Для работы с электронными документами в Диадоке требуется выпустить квалифицированный сертификат (КЭП).
	|
	|- Чтобы узнать о возможных причинах ошибки и посмотреть инструкции, нажмите на кнопку ""Подробнее"".
	|- Чтобы выполнить действие для доступных документов, нажмите на кнопку ""Продолжить""."; 
	
	ОбработчикЗакрытияВопроса = НовыйОписаниеОповещения("ОбработатьРезультатВыбора_НеДляВсехДокументовМожноВыполнитьДействиеКЭП", ЭтаФорма, ОписаниеГрупповойОперации);
	
	ПоказатьВопросПереопределенная(ОбработчикЗакрытияВопроса, ТекстВопроса, КнопкиВопроса, , ДействияНаФормеВопросаКЭП.Закрыть , "Не для всех документов в списке можно выполнить действие");
	
КонецПроцедуры

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

// Показывает пользователям форму с визуализацией ошибок проверки КЭП для Пакета
//
// Параметры:
//  СписокОшибокКЭП - Массив - см. КЭП_ПолучитьОшибкиПоСтрокеКонтекста()
//  ДополнительныеПараметры - Структура - произвольные параметры
//
Процедура ПоказатьВопрос_ДляДокументаНевозможноВыполнитьДействиеКЭП(СписокОшибокКЭП) Экспорт
		
	ДействияНаФормеВопросаКЭП = ДействияНаФормеВопросаКЭП();
	
	КнопкиВопроса = Новый СписокЗначений;
	КнопкиВопроса.Добавить(ДействияНаФормеВопросаКЭП.ОткрытьСписокОшибок, ДействияНаФормеВопросаКЭП.ОткрытьСписокОшибок);
	КнопкиВопроса.Добавить(ДействияНаФормеВопросаКЭП.Закрыть			, ДействияНаФормеВопросаКЭП.Закрыть);
	
	ТекстВопроса = 
	"Для работы с электронными документами в Диадоке требуется выпустить квалифицированный сертификат (КЭП).
	|
	|Чтобы узнать о возможных причинах ошибки и посмотреть инструкции, нажмите на кнопку ""Подробнее""."; 
	
	ОбработчикЗакрытияВопроса = НовыйОписаниеОповещения("ОбработатьРезультатВыбора_ДляДокументаНевозможноВыполнитьДействиеКЭП", ЭтаФорма, СписокОшибокКЭП);
	
	ПоказатьВопросПереопределенная(ОбработчикЗакрытияВопроса, ТекстВопроса, КнопкиВопроса, , ДействияНаФормеВопросаКЭП.Закрыть , "Сертификат не является квалифицированным");
	
КонецПроцедуры

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

Процедура Метрика_СписокОшибокКЭП(СписокОшибокКЭП)

	КатегорияМетрики	 = Метрика_НазваниеКатегории().НеквалифицированныйСертификат;
	ДействиеМетрики		 = Метрика_НазваниеДействий().Подробнее;
	ЛейблМетрики		 = "";
	ПредставлениеМетрики = "";
	НазваниеФормыДляМетрики = "Неквалифицированный сертификат";
	
	Модуль_Ядро			 = Модуль_Ядро();
	TraceId				 = Модуль_Ядро.TraceId();
	
	Модуль_Ядро.Метрика_ДобавитьПоведение_НажатиеКнопки(НазваниеФормыДляМетрики, КатегорияМетрики, ДействиеМетрики, ЛейблМетрики, ПредставлениеМетрики, TraceId);
	
	Для каждого ОписаниеОшибкиКЭП Из СписокОшибокКЭП Цикл
	
		Модуль_Ядро.Метрика_ДобавитьСтатистику_ДляОрганизации(ОписаниеОшибкиКЭП.BoxID, КатегорияМетрики, ДействиеМетрики, ЛейблМетрики, , ПредставлениеМетрики, TraceId);
	
	КонецЦикла;
	
КонецПроцедуры

// }	КЭП


//{		АВТООБНОВЛЕНИЕ МОДУЛЯ

Процедура ПодготовитьДанныеДляОбновленияМодуля()
	
	Ядро = Модуль_Ядро();
	
	МоментНачалаЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();
	
	ДанныеДляОбновленияМодуля = Ядро.ДанныеДляОбновленияМодуля();
	
	Ядро.Метрика_ДобавитьЗамер_СборДанныхДляОбновленияМодуля(МоментНачалаЗамера, "НаСервере");
		
КонецПроцедуры

Процедура ДополнитьДанныеДляОбновленияМодуля()
	
	Ядро = Модуль_Ядро();
	
	МоментНачалаЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();
	
	Ядро.ДополнитьДанныеДляОбновленияМодуля(ДанныеДляОбновленияМодуля);
	
	ЕстьНоваяВерсияМодуля = ДанныеДляОбновленияМодуля.ОписаниеОбновленияМодуля.ЕстьНоваяВерсия; 
	
	Ядро.Метрика_ДобавитьЗамер_СборДанныхДляОбновленияМодуля(МоментНачалаЗамера, "НаКлиенте");
	
КонецПроцедуры

Процедура ОбновитьМодульАвтоматически(Отказ)
	
	РезультатОбновления = Модуль_Ядро().ОбновитьМодульАвтоматически(ДанныеДляОбновленияМодуля);

	Если РезультатОбновления = "Success" Тогда
		
		ПослеУспешногоОбновленияМодуля();
	
		Отказ = Истина;	
		
	КонецЕсли;
	
КонецПроцедуры

Процедура ПослеУспешногоОбновленияМодуля()

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

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

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

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

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

Функция СоздатьОбработкуМодуляИзФайла(ПутьКФайлу)
	
	ДвоичныеДанные	 = Новый ДвоичныеДанные(ПутьКФайлу);
	Результат = ВнешниеОбработки_СоздатьБезПредупреждений(ДвоичныеДанные);
	
	Возврат Результат;
	
КонецФункции

Функция СоздатьОбработкуМодуляИзСправочника(ВнешняяОбработка)
	
	ДвоичныеДанные	 = ДвоичныеДанныеВнешнейОбработки(ВнешняяОбработка);
	Результат = ВнешниеОбработки_СоздатьБезПредупреждений(ДвоичныеДанные);
	
	Возврат Результат;
	
КонецФункции

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

Процедура УведомитьПользователяОбУспешномАвтообновлении()
	
	мОткрытьФорму("УведомлениеОбУспешномАвтообновлении");
	
КонецПроцедуры

// Плагины 

//&НаКлиенте
Процедура ДлительныеОперации_ЗапуститьМиграциюПлагиновV3V4()

	Модуль_Платформа().ДлительныеОперации_ВыполнитьВФоне("МиграцияПлагиновV3V4");
	
КонецПроцедуры

//&НаКлиенте
Процедура ДлительныеОперации_ЗапуститьЗаданиеОбновлениеПлагинов(Отказ)

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

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

//}		АВТООБНОВЛЕНИЕ МОДУЛЯ

//{		ОБЕРТКИ

//&НаКлиенте
Функция Общее_СоединитьСтроку(Строки, Разделитель = "")
	
	Результат = Модуль_Ядро().СоединитьСтроку(Строки, Разделитель);
	
	Возврат Результат;
	
КонецФункции

Процедура _ОбработатьОшибку(Знач ВидОперации, Знач Ошибка, Знач Пояснение = "")
	
	ДопИнформация = Неопределено;
	
	Ядро = Модуль_Ядро();
	Ядро.Ошибка_Обработать(
		ВидОперации,
		Ошибка,
		ДопИнформация,
		Пояснение
	);
	
КонецПроцедуры

//}		ОБЕРТКИ

//{		ПОДКЛЮЧАЕМЫЙ МОДУЛЬ

//&НаКлиенте
Процедура УправлениеПМ_ВыгрузитьВСервис()

	Ядро = Модуль_Ядро();
	Ядро.УправлениеПМ_ПроверитьВерсииФайловИВыгрузитьВСервис();

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

//}		ПОДКЛЮЧАЕМЫЙ МОДУЛЬ

//{		СПРАВКА

Процедура Справка_ПоказатьПриПервомЗапуске()
	
	Если ЭтоПервыйЗапуск Тогда
		Справка_ОткрытьРаздел("НемногоОМодулеШаг1");
	КонецЕсли;
	
КонецПроцедуры

Процедура Справка_ОткрытьРаздел(РазделСправки)

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

//}		СПРАВКА


//{		ОЦЕНКА РАБОТЫ МОДУЛЯ

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

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

//&НаКлиенте
Процедура ПоказатьПлашкуОтзываПоРаботеСПоискомДокументовНаОтправку()
	
	Ядро = Модуль_Ядро();
	
	СценарииМодуля = Ядро.Перечисление_СценарииМодуляДляОтзывов();
	// BSLLS:UnusedLocalVariable-off
	СценарийМодуляДляОтзыва = СценарииМодуля.ПоискДокументовНаОтправку;
	// BSLLS:UnusedLocalVariable-on
	
	ТребуетсяОценка = ТребуетсяПоказатьПлашкуОтзываПоРаботе();
	
	УстановитьВидимостьКнопокОбратнойСвязи(ТребуетсяОценка);
	УстановитьЗаголовокОценкиРаботыСМодулем();
	
КонецПроцедуры

//&НаКлиенте
Процедура ПоказатьПлашкуОтзываПоРаботеСЛентойКонтрагентов()
	
	Ядро = Модуль_Ядро();
	
	СценарииМодуля = Ядро.Перечисление_СценарииМодуляДляОтзывов();
	// BSLLS:UnusedLocalVariable-off
	СценарийМодуляДляОтзыва = СценарииМодуля.СобытияЛентыКонтрагентов;
	// BSLLS:UnusedLocalVariable-on
	
	ТребуетсяОценка = ТребуетсяПоказатьПлашкуОтзываПоРаботе();
	
	УстановитьВидимостьКнопокОбратнойСвязи(ТребуетсяОценка);
	УстановитьЗаголовокОценкиРаботыСМодулем();
	
КонецПроцедуры

//&НаКлиенте
Процедура ПоказатьПлашкуОтзываПоРаботеСАвторизацией()
	
	Ядро = Модуль_Ядро();
	
	СценарииМодуля = Ядро.Перечисление_СценарииМодуляДляОтзывов();
	// BSLLS:UnusedLocalVariable-off
	СценарийМодуляДляОтзыва = СценарииМодуля.Авторизация;
	// BSLLS:UnusedLocalVariable-on
	
	НоваяФорма = Модуль_Платформа().ИмяФормыАвторизации() = "АвторизацияНовая";
	ТребуетсяОценка = НоваяФорма И ТребуетсяПоказатьПлашкуОтзываПоРаботе();
	
	УстановитьВидимостьКнопокОбратнойСвязи(ТребуетсяОценка);
	УстановитьЗаголовокОценкиРаботыСМодулем();
	
КонецПроцедуры

Функция ТребуетсяПоказатьПлашкуОтзываПоРаботе()
	
	Результат = ОтзывПоРаботеСМодулем_ТребуетсяОценка(СценарийМодуляДляОтзыва);
	
	Возврат Результат;
	
КонецФункции

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

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

//&НаКлиенте
Процедура ОценкаРаботыСМодулемДа(Элемент)
	
	Метрики_ПриНажатии_ОценкаРаботыСМодулемДа();
	ПоказатьФормуОценкиРаботыСМодулем();
	
КонецПроцедуры

//&НаКлиенте
Процедура ОценкаРаботыСМодулемНет(Элемент)
	
	УстановитьВидимостьКнопокОбратнойСвязи(Ложь);
	Метрики_ПриНажатии_ОценкаРаботыСМодулемНет();
	ЗаписатьДатуОценкиРаботыСМодулем(СценарийМодуляДляОтзыва);
	
КонецПроцедуры

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

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

//&НаКлиенте
Процедура Метрики_ПриНажатии_ОценкаРаботыСМодулемДа()
	
	Категория = Метрики_КатегорияТрудностиСРаботойСМодулем();
	Действие = Метрики_ДействиеНегативныйОтзывОРаботеСМодулем();
	
	Метрика_ЗаписатьНажатиеКнопки(Категория, Действие);
	
КонецПроцедуры

//&НаКлиенте
Процедура Метрики_ПриНажатии_ОценкаРаботыСМодулемНет()
	
	Категория = Метрики_КатегорияТрудностиСРаботойСМодулем();
	Действие = Метрики_ДействиеПозитивныйОтзывОРаботеСМодулем();
	
	Метрика_ЗаписатьНажатиеКнопки(Категория, Действие);
	Метрики_ЗаписатьОС_НетТрудностейВРаботеСМодулем();
	
КонецПроцедуры

//&НаКлиенте
Процедура Метрики_ЗаписатьОС_ЕстьТрудностиВРаботеСМодулем(Отзыв)
	
	Трассировка = Метрики_ИдентификаторТрассировки();
	Категория = Метрики_КатегорияТрудностиСРаботойСМодулем();
	Действие = Метрики_ДействиеНегативныйОтзывОРаботеСМодулем();
	КоллекцияBoxId = Новый Массив;
	ИдентификаторыПользователей = Новый Массив;
	
	Ядро = Модуль_Ядро();
	
	СценарииМодуля = Ядро.Перечисление_СценарииМодуляДляОтзывов();
	
	ЕстьПроблемыСОплатой = (СценарийМодуляДляОтзыва = СценарииМодуля.ОплатаСервиса);
	
	СтрокиКонтекста = Ядро.КонтекстСеанса_СтрокиКонтекста(ЕстьПроблемыСОплатой);
	
	Для Каждого СтрокаКонтекста Из СтрокиКонтекста Цикл
		
		ЗначениеКонтекста = СтрокаКонтекста.Значение;
		
		ИдентификаторЯщика = ЗначениеКонтекста.Ящик.Идентификатор;
		ИдентификаторПользователя = ЗначениеКонтекста.Сессия.Пользователь.Идентификатор;
		
		КоллекцияBoxId.Добавить(ИдентификаторЯщика);
		
		Если ИдентификаторыПользователей.Найти(ИдентификаторПользователя) = Неопределено Тогда
			ИдентификаторыПользователей.Добавить(ИдентификаторПользователя);
		КонецЕсли;
		
	КонецЦикла;
	
	ИдентификаторБазы1С = Ядро.ОбщийКонтекст_Прочитать("ИдентификаторБазы1С");
	
	Переменные = Новый Структура;
	Переменные.Вставить("BoxId", КоллекцияBoxId);
	Переменные.Вставить("BaseID", ИдентификаторБазы1С);
	Переменные.Вставить("UserID", ИдентификаторыПользователей);
	Переменные.Вставить("Комментарий", Отзыв);
	
	Ядро.Метрика_ЗаписатьОбратнуюСвязь(
		Категория,
		Действие,
		Переменные,
		Трассировка);
	
КонецПроцедуры

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

//&НаКлиенте
Функция Метрики_ИдентификаторТрассировки()
	
	Ядро = Модуль_Ядро();
	Результат = Ядро.TraceId();
	
	Возврат Результат;
	
КонецФункции

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

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

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

//}		ОЦЕНКА РАБОТЫ МОДУЛЯ

// {	ПОДПИСКИ И ОПЛАТЫ

Процедура ОбработатьНаличиеПредложенийДляПокупки()
	
	МодульЯдро = Модуль_Ядро();
	
	ПредложенияДляВсехЛицевыхСчетов = МодульЯдро.ПредложенияДляПокупки_ПредложенияДляВсехЛицевыхСчетов();
	МодульЯдро.Метрика_ДобавитьСтатистику_ПредложенияДляПокупки(ПредложенияДляВсехЛицевыхСчетов);
	
	СводноеОписаниеПредложений = МодульЯдро.ЛичныйКабинет_ДоступныеТипыПредложений(ПредложенияДляВсехЛицевыхСчетов);
	
	ПанельБаннера = ЭлементыФормы.ПанельОкончанияОплаченногоПериода;
	
	// BSLLS:MagicNumber-off
	ЦветФонаБаннераКрасный = Новый Цвет(255, 230, 230);
	ЦветФонаБаннераЖелтый = Новый Цвет(251, 237, 158);
	ЦветФонаБаннераЗеленый = Новый Цвет(199, 233, 199);
	// BSLLS:MagicNumber-on
	
	ПанельБаннера.ТекущаяСтраница = ПанельБаннера.Страницы.СтраницаПустая;
	
	Если СводноеОписаниеПредложений.ПодпискаНаМодульЗакончилась Тогда
		
		ПанельБаннера.ТекущаяСтраница = ПанельБаннера.Страницы.СтраницаВосстановитьДоступ;
		ПанельБаннера.ЦветФона = ЦветФонаБаннераКрасный;
		
	ИначеЕсли СводноеОписаниеПредложений.ПодпискаНаМодульЗаканчивается Тогда
		
		ПанельБаннера.ТекущаяСтраница = ПанельБаннера.Страницы.СтраницаПодпискаНаМодульЗаканчивается;
		ПанельБаннера.ЦветФона = ЦветФонаБаннераЖелтый;
		
	ИначеЕсли СводноеОписаниеПредложений.ПакетЗакончился Тогда
		
		ПанельБаннера.ТекущаяСтраница = ПанельБаннера.Страницы.СтраницаПакетЗакончился;
		ПанельБаннера.ЦветФона = ЦветФонаБаннераЖелтый;
		
	ИначеЕсли СводноеОписаниеПредложений.ПакетЗаканчивается Тогда
		
		ПанельБаннера.ТекущаяСтраница = ПанельБаннера.Страницы.СтраницаПакетЗаканчивается;
		ПанельБаннера.ЦветФона = ЦветФонаБаннераЖелтый;
		
	ИначеЕсли СводноеОписаниеПредложений.МаршрутЗакончился Тогда
	
		ПанельБаннера.ТекущаяСтраница = ПанельБаннера.Страницы.СтраницаМаршрутЗакончился;
		ПанельБаннера.ЦветФона = ЦветФонаБаннераЖелтый;
	
	ИначеЕсли СводноеОписаниеПредложений.МаршрутЗаканчивается Тогда
	
		ПанельБаннера.ТекущаяСтраница = ПанельБаннера.Страницы.СтраницаМаршрутЗаканчивается;
		ПанельБаннера.ЦветФона = ЦветФонаБаннераЖелтый;
	
	ИначеЕсли СводноеОписаниеПредложений.ЛицензияНаКоннекторы Тогда
	
		ПанельБаннера.ТекущаяСтраница = ПанельБаннера.Страницы.СтраницаЛицензияНаКоннекторы;
		ПанельБаннера.ЦветФона = ЦветФонаБаннераЖелтый;
	
	ИначеЕсли СводноеОписаниеПредложений.ЛицензияНаAPI Тогда
	
		ПанельБаннера.ТекущаяСтраница = ПанельБаннера.Страницы.СтраницаЛицензияНаAPI;
		ПанельБаннера.ЦветФона = ЦветФонаБаннераЖелтый;
	
	ИначеЕсли СводноеОписаниеПредложений.СертификатЗакончился Тогда
	
		ПанельБаннера.ТекущаяСтраница = ПанельБаннера.Страницы.СтраницаСертификатЗакончился;
		ПанельБаннера.ЦветФона = ЦветФонаБаннераЖелтый;
	
	ИначеЕсли СводноеОписаниеПредложений.СертификатЗаканчивается Тогда
	
		ПанельБаннера.ТекущаяСтраница = ПанельБаннера.Страницы.СтраницаСертификатЗаканчивается;
		ПанельБаннера.ЦветФона = ЦветФонаБаннераЖелтый;
		
	ИначеЕсли СводноеОписаниеПредложений.ПромоМодуля Тогда
		
		ПанельБаннера.ТекущаяСтраница = ПанельБаннера.Страницы.СтраницаПромо;
		ПанельБаннера.ЦветФона = ЦветФонаБаннераЗеленый;
		
	ИначеЕсли СводноеОписаниеПредложений.РекомендацияПлагинов Тогда
		
		ПоказатьБаннерРекомендацииПокупкиПлагинов();
		
	ИначеЕсли СводноеОписаниеПредложений.РекомендацияПакетов Тогда
		
		ПоказатьБаннерРекомендацииПокупкиПакетов();
	
	Иначе
		
		ПанельБаннера.ТекущаяСтраница = ПанельБаннера.Страницы.СтраницаПустая;
		
	КонецЕсли;
	
	НужноПоказатьПанель = (ПанельБаннера.ТекущаяСтраница <> ПанельБаннера.Страницы.СтраницаПустая);
	
	Если НужноПоказатьПанель Тогда
		НоваяСвертка = РежимСверткиЭлементаУправления.Нет;
	Иначе
		НоваяСвертка = РежимСверткиЭлементаУправления.Верх;
	КонецЕсли;
	
	ЭлементыФормы.ПанельОкончанияОплаченногоПериода.Свертка = НоваяСвертка;
	
КонецПроцедуры

Процедура ПоказатьБаннерРекомендацииПокупкиПакетов()
	
	ТребуетсяПоказатьБаннер = ПредложенияДляПокупки_ТребуетсяПоказатьРекомендациюПокупкиПакетаДокументов();
	
	Если ТребуетсяПоказатьБаннер Тогда
		
		// BSLLS:MagicNumber-off
		ЦветФонаБаннераЗеленый = Новый Цвет(199, 233, 199);
		// BSLLS:MagicNumber-on
		
		ПанельБаннера = ЭлементыФормы.ПанельОкончанияОплаченногоПериода;
		ПанельБаннера.ТекущаяСтраница = ПанельБаннера.Страницы.СтраницаРекомендацияПакетов;
		ПанельБаннера.ЦветФона = ЦветФонаБаннераЗеленый;
		
	КонецЕсли;
	
КонецПроцедуры

Процедура ПоказатьБаннерРекомендацииПокупкиПлагинов()
	
	ТребуетсяПоказатьБаннер = ПредложенияДляПокупки_ТребуетсяПоказатьРекомендациюПокупкиПлагинов();
	
	Если ТребуетсяПоказатьБаннер Тогда
		
		// BSLLS:MagicNumber-off
		ЦветФонаБаннераЗеленый = Новый Цвет(199, 233, 199);
		// BSLLS:MagicNumber-on
		
		ПанельБаннера = ЭлементыФормы.ПанельОкончанияОплаченногоПериода;
		ПанельБаннера.ТекущаяСтраница = ПанельБаннера.Страницы.СтраницаРекомендацияПлагинов;
		ПанельБаннера.ЦветФона = ЦветФонаБаннераЗеленый;
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

Функция ОткрытБаннерСертификата()
	
	ПанельБаннера = ЭлементыФормы.ПанельОкончанияОплаченногоПериода;
	
	Результат = (ПанельБаннера.ТекущаяСтраница = ПанельБаннера.Страницы.СтраницаСертификатЗакончился
				ИЛИ ПанельБаннера.ТекущаяСтраница = ПанельБаннера.Страницы.СтраницаСертификатЗаканчивается);
	
	Возврат Результат;
	
КонецФункции

Функция ОткрытБаннерРекомендацииПокупкиПлагинов()
	
	ПанельБаннера = ЭлементыФормы.ПанельОкончанияОплаченногоПериода;
	
	Результат = (ПанельБаннера.ТекущаяСтраница = ПанельБаннера.Страницы.СтраницаРекомендацияПлагинов);
	
	Возврат Результат;
	
КонецФункции

Функция ОткрытБаннерРекомендацииПокупкиПакетов()
	
	ПанельБаннера = ЭлементыФормы.ПанельОкончанияОплаченногоПериода;
	
	Результат = (ПанельБаннера.ТекущаяСтраница = ПанельБаннера.Страницы.СтраницаРекомендацияПакетов);
	
	Возврат Результат;
	
КонецФункции

// }	ПОДПИСКИ И ОПЛАТЫ

// {	ЛОГИСТИКА

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

//&НаКлиенте
Процедура БаннерУстановкаЛогистикиТекстГиперссылкаНажатие(Элемент)
	
	ОткрытьМастерУстановкиЛогистики(Истина);
	
КонецПроцедуры

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

Процедура ОткрытьМастерУстановкиЛогистики(ПереходИзБаннера)
	
	Метрика_ПриОткрытииМастераУстановкиЛогистики(ПереходИзБаннера);
	
	ОбработкаМастераУстановкиЛогистики = ПодключитьМастерУстановкиЛогистики();
	
	Если ОбработкаМастераУстановкиЛогистики <> Неопределено Тогда
		
		// BSLLS:GetFormMethod-off
		ФормаМастераУстановкиЛогистики = ОбработкаМастераУстановкиЛогистики.ПолучитьФорму("ФормаОсновная", ЭтаФорма);
		// BSLLS:GetFormMethod-on
		ФормаМастераУстановкиЛогистики.ОткрытьМодально();
		
	КонецЕсли;
	
КонецПроцедуры

Функция ПодключитьМастерУстановкиЛогистики()
	
	Ядро = Модуль_Ядро();
	
	Результат = Ядро.КонтурЛогистика_ПодключитьМастерУстановки();
	
	Возврат Результат;
	
КонецФункции

Процедура КартинкаБаннераЛогистикиЗакрытьНажатие(Элемент)
	
	ЭлементыФормы.ПанельБаннерЛогистики.Свертка = РежимСверткиЭлементаУправления.Верх;
	
КонецПроцедуры

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

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

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

	Метрика_ДобавитьСтатистику_ПоКонтексту(КатегорияМетрики, ДействиеМетрики);
	
КонецПроцедуры

//&НаКлиенте
Функция Метрика_КатегорияИнтеграцияСЛогистикой()
	
	КатегорииМетрик = Метрика_НазваниеКатегории();
	
	Результат = КатегорииМетрик.ИнтеграцияСЛогистикой;
	
	Возврат Результат;
	
КонецФункции

//&НаКлиенте
Функция Метрика_ДействиеПереходаВСвязанныеДокументы()
	
	ДействияМетрик = Метрика_НазваниеДействий();
	
	Результат = ДействияМетрик.ПереходВСвязанныеДокументы;
	
	Возврат Результат;
	
КонецФункции

// }	ЛОГИСТИКА

// {	ПЕРЕВОЗОЧНЫЕ ДОКУМЕНТЫ

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

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

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

Процедура ПеревозочныеДокументы_ПослеВопросаПерейтиВДиадок(Ответ, ДополнительныеПараметрыОповещения) Экспорт
	
	ДействиеМетрики = Метрика_НазваниеДействий().ОткрытьДокументВДиадоке;
	ВыбраннаяСтрока = ДополнительныеПараметрыОповещения.ВыбраннаяСтрока;
	
	Если Ответ = КодВозвратаДиалога.ОК Тогда
		
		Ядро = Модуль_Ядро();
		
		СтруктураСтроки = Новый_СтруктураДанныхСтрокиСписка(ВыбраннаяСтрока);
		ТекущийДокумент = ДокументИзДанныхСтрокиТЧ(СтруктураСтроки);
		
		ГиперссылкаНаДокумент = Ядро.Документы_СсылкаВБраузере(ТекущийДокумент);
		
		Если ЗначениеЗаполнено(ГиперссылкаНаДокумент) Тогда
			// BSLLS:UsingSynchronousCalls-off
			ЗапуститьПриложение(ГиперссылкаНаДокумент);
			// BSLLS:UsingSynchronousCalls-on
		КонецЕсли;
		
	Иначе
		
		ДействиеМетрики = ДействиеМетрики + "_отказ";
		
	КонецЕсли;
	
	ДопПеременные = Новый Соответствие;
	ДопПеременные.Вставить("LetterId", ВыбраннаяСтрока.LetterId);
	ДопПеременные.Вставить("DocumentId", ВыбраннаяСтрока.DocumentId);
	ДопПеременные.Вставить("Status", ВыбраннаяСтрока.Статус);
	
	Метрика_ПеревозочныеДокументыПерейтиВДиадок(ДействиеМетрики, ДопПеременные);
	
КонецПроцедуры

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

Процедура ПеревозочныеДокументы_ДобавитьЭПД(Кнопка)

	Ядро = Модуль_Ядро();
	Модуль_Платформа = Модуль_Платформа();
		
	НаименованиеФормы = Метрика_НазваниеФормы();
	КатегорияМетрики = Метрика_НазваниеКатегории().Перевозочные;
	ДействиеМетрики = Метрика_НазваниеДействий().ДобавитьЭПД;
	
	Ядро.Метрика_ДобавитьПоведение_НажатиеКнопки(
		НаименованиеФормы,
		КатегорияМетрики,
		ДействиеМетрики
	);
	Ядро.Метрика_ДобавитьСтатистику_ПоКонтексту(КатегорияМетрики, ДействиеМетрики);

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

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

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

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

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

// }	ПЕРЕВОЗОЧНЫЕ ДОКУМЕНТЫ

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

//&НаКлиенте
Процедура Метрика_ЗаписатьВернутьсяКВыборуОрганизаций()
	
	Модуль_Ядро = Модуль_Ядро();
	
	НаименованиеФормы = Метрика_НазваниеФормы();
	КатегорияМетрики = Метрика_КонфигурацияНеДоступна();
	ДействиеМетрики = Метрика_ВернутьсяКВыборуОрганизаций();
	
	Модуль_Ядро.Метрика_ДобавитьПоведение_НажатиеКнопки(
		НаименованиеФормы,
		КатегорияМетрики,
		ДействиеМетрики);
	
	Модуль_Ядро.Метрика_ДобавитьСтатистику(
		КатегорияМетрики,
		ДействиеМетрики);
	
КонецПроцедуры

//&НаКлиенте
Функция Метрика_ОткрытиеФормы()
	
	Возврат "ОткрытиеФормы";

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

//&НаКлиенте
Функция Метрика_КонфигурацияНеДоступна()
	
	Возврат "КонфигурацияНедоступна";
	
КонецФункции

//&НаКлиенте
Функция Метрика_УзнатьПодробнее()
	
	Возврат "УзнатьПодробнее";
	
КонецФункции

//&НаКлиенте
Функция Метрика_ВернутьсяКВыборуОрганизаций()
	
	Возврат "ВернутьсяКВыборуОрганизаций";
	
КонецФункции

//{		НАЙТИ НУЖНЫЙ ДОКУМЕНТ

//&НаКлиенте
Процедура ОткрытьПомощникПоискаДокумента(Команда)
	
	Метрики_ЗаписатьНажатие_НайтиНужныйДокумент();
	Метрики_ЗаписатьСтатистику_НайтиНужныйДокумент();
	
	ОбработчикОткрытияФормыПоискаДокумента();
	
КонецПроцедуры

//&НаКлиенте
Процедура Метрики_ЗаписатьНажатие_НайтиНужныйДокумент()
	
	КатегорияМетрики = Метрика_КатегорияНайтиНужныйДокумент();
	ДействиеМетрики = Метрика_ДействиеОткрытиеПомощника();
	
	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	
КонецПроцедуры

//&НаКлиенте
Процедура Метрики_ЗаписатьСтатистику_НайтиНужныйДокумент()
	
	КатегорияМетрики = Метрика_КатегорияНайтиНужныйДокумент();
	ДействиеМетрики = Метрика_ДействиеОткрытиеПомощника();
	
	Ядро = Модуль_Ядро();
	Ядро.Метрика_ДобавитьСтатистику_СУчетомЗаполненияКонтекста(КатегорияМетрики, ДействиеМетрики);
	
КонецПроцедуры

//&НаКлиенте
Процедура ОбработчикОткрытияФормыПоискаДокумента()
	
	ОбработчикЗакрытия = НовыйОписаниеОповещения(
		"ОбработчикЗакрытияФормыПоискаДокумента",
		ЭтаФорма
	);
	
	Платформа = Модуль_Платформа();
	Платформа.ПоказатьПомощникПоискаДокумента(ОбработчикЗакрытия);
	
КонецПроцедуры

//&НаКлиенте
Процедура ОбработчикЗакрытияФормыПоискаДокумента(РезультатЗакрытия, ДополнительныеПараметры) Экспорт
	
	ПоказатьПлашкуОтзываПоРаботеСПоискомДокументовНаОтправку();
	
	ОбновитьКэшСопоставленныхКонтрагентов();
	
КонецПроцедуры

//}		НАЙТИ НУЖНЫЙ ДОКУМЕНТ

// { Лента контрагентов

Процедура УстановитьТекстПоляСобытияЛентыКонтрагентовНаСервере()
	
	МодульЯдро = Модуль_Ядро();
	// BSLLS:UnusedLocalVariable-off
	HTMLЛентаКонтрагентов = МодульЯдро.HTML_СобытияЛентыКонтрагентов(
			ЛентаКонтрагентовОрганизация);
	// BSLLS:UnusedLocalVariable-on
	ЭлементыФормы.HTMLЛентаКонтрагентов.УстановитьТекст(HTMLЛентаКонтрагентов);
	
КонецПроцедуры

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

Процедура ПроверитьСобытияЛентыКонтрагентов()
	
	Если НЕ УведомлятьОНовыхСобытиях Тогда
		Возврат;
	КонецЕсли;
	
	Ядро = Модуль_Ядро();
	
	ЭлементыФормы.СписокСобытий.ЦветФонаКнопки = Новый Цвет();
	
	БиблиотекаКартинокЯдра = Ядро.БиблиотекаКартинок();
	ОформлениеКругОранжевый16 = БиблиотекаКартинокЯдра.ОформлениеКругОранжевый16;
	ОформлениеПустое16 = БиблиотекаКартинокЯдра.ОформлениеПустое16;

	ЛентаКонтрагентовОрганизация = Неопределено; 
	
	СписокДляОтбора = Элементы.ЛентаКонтрагентовОрганизация.СписокВыбора;
	СписокДляОтбора.Очистить();
	
	СписокДляОтбораОрганизации = Ядро.Организации_СписокОрганизацийДляВыбора(Ложь);
	
	Для Каждого ТекОрганизация Из СписокДляОтбораОрганизации Цикл
		
		НовыйЭлемент = СписокДляОтбора.Добавить();
		НовыйЭлемент.Значение = ТекОрганизация.Значение;
		НовыйЭлемент.Представление = ТекОрганизация.Представление;
		
		ЕстьНовыеСобытия = Ядро.ЛентаКонтрагентов_ЕстьНовыеСобытияДляПользователя(
				ТекОрганизация.Значение);
		
		Если ЕстьНовыеСобытия Тогда
			
			ЛентаКонтрагентовОрганизация = ТекОрганизация.Значение;
			// BSLLS:MagicNumber-off
			ЭлементыФормы.СписокСобытий.ЦветФонаКнопки = Новый Цвет(255, 237, 166);
			// BSLLS:MagicNumber-on
			НовыйЭлемент.Картинка = ОформлениеКругОранжевый16;
			
		Иначе
			
			НовыйЭлемент.Картинка = ОформлениеПустое16;

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

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

Функция СписокСобытийСвернут()
	
	Возврат (ЭлементыФормы.ПанельСобытийКонтрагентов.Свертка
		<> РежимСверткиЭлементаУправления.Нет);
	
	КонецФункции
	
Процедура РазвернутьСписокСобытий()
	
	ДействиеФормыПоказатьСкрытьПанель(
		Истина,
		ЭлементыФормы.ПанельСобытийКонтрагентов,
		РежимСверткиЭлементаУправления.Право,
		ЭлементыФормы.РазделительСобытий);
	
КонецПроцедуры

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

Процедура СвернутьСписокСобытий()
	
	ДействиеФормыПоказатьСкрытьПанель(
		Ложь,
		ЭлементыФормы.ПанельСобытийКонтрагентов,
		РежимСверткиЭлементаУправления.Право,
		ЭлементыФормы.РазделительСобытий);
	
КонецПроцедуры

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

Процедура HTMLЛентаКонтрагентовПриНажатии(Элемент, ДанныеСобытия)
	
	// По какой-то неведомой причине иногда прилетают события с типом отличающимся от "click",
	// и из-за этого код выполняется несколько раз
	Если НЕ ЭтоНажатиеНаТекстHTML(ДанныеСобытия) Тогда
		Возврат;
	КонецЕсли;
	
	АдресСсылки = Неопределено;
	ДополнительныеПараметры = Неопределено;

	// BSLLS:MissingCodeTryCatchEx-off
	Попытка
		
		Если ВРег(ДанныеСобытия.srcElement.tagName = "IMG")
			ИЛИ ВРег(ДанныеСобытия.srcElement.tagName = "DIV") Тогда
			АдресСсылки = ДанныеСобытия.srcElement.parentElement.href;
		Иначе
			АдресСсылки = ДанныеСобытия.srcElement.href;
		КонецЕсли;
		
	Исключение КонецПопытки;
	// BSLLS:MissingCodeTryCatchEx-on
	
	Если ЗначениеЗаполнено(АдресСсылки) Тогда
		// BSLLS:UnusedLocalVariable-off
		СтандартнаяОбработка = Ложь;
		// BSLLS:UnusedLocalVariable-on
		
		// BSLLS:MissingCodeTryCatchEx-off
		Попытка
			ДанныеСобытия.returnValue = СтандартнаяОбработка;
		Исключение КонецПопытки;
		// BSLLS:MissingCodeTryCatchEx-on
		
		ОповеститьИлиПерейтиПоСсылке(
			АдресСсылки,
			ДополнительныеПараметры,
			ЭтаФорма);
			
		Метрика_ПерейтиПоСсылкеЛентыКонтрагентов(АдресСсылки);
		
	КонецЕсли;
	
КонецПроцедуры

Функция ЭтоНажатиеНаТекстHTML(ДанныеСобытия)
	
	Результат = Истина;
	
	Попытка
		Результат = НРег(ДанныеСобытия.type) = "click";
	Исключение
		ОписаниеОшибки = ИнформацияОбОшибке();
	КонецПопытки;
	
	Возврат Результат;
	
КонецФункции

//&НаКлиенте
Процедура Метрика_ПерейтиПоСсылкеЛентыКонтрагентов(АдресСсылки)
	
	КатегорияМетрики = "ЛентаКонтрагентов";
	// BSLLS:DeprecatedFind-off
	Если Найти(АдресСсылки, "ПосмотретьПриглашение") > 0 Тогда
		
		ДействиеМетрики = "ПосмотретьПриглашение";
		
	ИначеЕсли Найти(АдресСсылки, "ПосмотретьКомментарии") > 0 Тогда
		
		ДействиеМетрики = "ПосмотретьКомментарий";
		
	ИначеЕсли Найти(АдресСсылки, "ОткрытьСопоставлениеКонтрагента") > 0 Тогда
		
		ДействиеМетрики = "СопоставитьКонтрагента";
		
	Иначе
		
		ДействиеМетрики = "НеизвестнаяСсылка";
		
	КонецЕсли;
	// BSLLS:DeprecatedFind-on
	
	Метрика_ЗаписатьНажатиеКнопки(КатегорияМетрики, ДействиеМетрики);
	
КонецПроцедуры

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

	Модуль_Платформа = Модуль_Платформа();
	Модуль_Платформа.ОткрытьФормуПредупреждения(
		ТекстПредупреждения,
		Комментарий,
		ЗаголовокФормыПредупреждения);
	
КонецПроцедуры
	
//&НаСервере
Функция ДанныеКомментарияДляОповещения(Знач Base64Строка)
	
	Ядро = Модуль_Ядро();
	ЗначениеДанных = Base64Значение(Base64Строка);
	СтрокаДанных = Ядро.СтрокаИзДвоичныхДанных(ЗначениеДанных);
	Результат = Ядро.ПарсерJSON_Прочитать(СтрокаДанных);
	
	Возврат Результат;
	
КонецФункции
	
//&НаКлиенте
Процедура ОткрытьСопоставлениеКонтрагента(
		ИденификаторКонтрагента = Неопределено,
		ДополнительныеПараметры = Неопределено) Экспорт
	
	ДанныеОрганизации = ДанныеОрганизации(ЛентаКонтрагентовОрганизация);
	ДанныеКонтрагента = ДанныеКонтрагента(ЛентаКонтрагентовОрганизация, ИденификаторКонтрагента);
	
	ОткрытьФормуКонтрагента(ДанныеОрганизации, ДанныеКонтрагента);
	
КонецПроцедуры

//&НаСервере
// BSLLS:MissingReturnedValueDescription-off
// BSLLS:MissingParameterDescription-off
Функция ДанныеКонтрагента(Знач ИдентификаторОрганизации, Знач ИденификаторКонтрагента)
	// BSLLS:MissingReturnedValueDescription-on
	// BSLLS:MissingParameterDescription-on
	Модуль_Ядро = Модуль_Ядро();
	
	ИдентификаторыКонтрагента = Модуль_Ядро.Новый_ИдентификаторыСправочника(
			Неопределено,
			ИденификаторКонтрагента);
	
	ДанныеКонтрагента = Модуль_Ядро.Контрагенты_ЗаполненныеРеквизиты(
			ИдентификаторыКонтрагента);
	
	Если ИспользуетсяПодсистемаДиадок
		И НЕ ЗначениеЗаполнено(ДанныеКонтрагента.ID) Тогда
		
		ДанныеКонтрагента = Модуль_Ядро.Контрагенты_ДанныеКонтрагентаАПИ(
				ИдентификаторОрганизации,
				ИденификаторКонтрагента);
		
		Модуль_Ядро.Контрагенты_ОбновитьКонтрагентаЭДО(
			ДанныеКонтрагента,
			ИдентификаторОрганизации);
		
		ДанныеКонтрагента = Модуль_Ядро.Контрагенты_ЗаполненныеРеквизиты(
				ИдентификаторыКонтрагента);
		
	КонецЕсли;
	
	Возврат ДанныеКонтрагента;
	
КонецФункции

//&НаСервере
Функция ДанныеОрганизации(Знач ИдентификаторОрганизации)
	
	Модуль_Ядро = Модуль_Ядро();
	
	ИдентификаторыОрганизации = Модуль_Ядро.Новый_ИдентификаторыСправочника(
			Неопределено,
			ИдентификаторОрганизации);
	
	ДанныеОрганизации = Модуль_Ядро.Организации_ЗаполненныеРеквизиты(
			ИдентификаторыОрганизации);
	
	Возврат ДанныеОрганизации;
	
КонецФункции
	
//&НаКлиенте
Процедура ПосмотретьПриглашениеКонтрагента(
		ИденификаторКонтрагента = Неопределено,
		ДополнительныеПараметры = Неопределено) Экспорт
	
	ПоказатьФормуВыбранногоПриглашения(ИденификаторКонтрагента);
	
КонецПроцедуры
	
//&НаКлиенте
Процедура ПоказатьФормуВыбранногоПриглашения(ИденификаторКонтрагента)
	
	ДополнительныеПараметры = ПараметрыОткрытияФормыПриглашенияКонтрагента(
			ИденификаторКонтрагента);
	
	ПоказатьФормуПриглашения(ДополнительныеПараметры);
	
КонецПроцедуры

//&НаКлиенте
Процедура ПоказатьФормуПриглашения(ДополнительныеПараметры)
	
	ОписаниеЗакрытияФормы = НовыйОписаниеОповещения(
			"ЗакрытаФормаПриглашения",
			ЭтаФорма,
			ДополнительныеПараметры
		);
	
	ОткрытьФормуДиадокМодально(
		"ФормаПриглашения",
		ЭтаФорма,
		ДополнительныеПараметры,
		ОписаниеЗакрытияФормы
	);
	
КонецПроцедуры

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

//&НаКлиенте
Процедура ЗакрытаФормаПриглашения(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Команда = НРег(Результат.Команда);
	
	Если Команда = НРег("Отменить") Тогда
		Возврат;
	КонецЕсли;
	// BSLLS:IfElseIfEndsWithElse-off
	Если Команда = НРег("Отказать") Тогда
		
		ОтказатьВПриглашении(ДополнительныеПараметры);
		
	ИначеЕсли Команда = НРег("Принять") Тогда
		
		ПринятьКонтрагентов(ДополнительныеПараметры);
		
	КонецЕсли;
	// BSLLS:IfElseIfEndsWithElse-on
	НачатьУстановкуПоляСобытияКонтрагентов();
	
КонецПроцедуры

//&НаКлиенте
Процедура ОтказатьВПриглашении(ДополнительныеПараметры)
	
	ОписаниеЗакрытияФормы = НовыйОписаниеОповещения(
			"ОтказатьВПриглашенииЗавершение",
			ЭтаФорма,
			ДополнительныеПараметры
		);
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Режим", "ОтказатьВПриглашении");
	
	ОткрытьФормуДиадокМодально(
		"ФормаВводаV2",
		ЭтаФорма,
		ПараметрыФормы,
		ОписаниеЗакрытияФормы);
	
КонецПроцедуры

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

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

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

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

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

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

//&НаСервере
Процедура ПринятьКонтрагентовНаСервере(Знач ДополнительныеПараметры)
	
	Модуль_Ядро = Модуль_Ядро();
	
	Приглашения = Новый Соответствие;
	Приглашения.Вставить(
		ДополнительныеПараметры.ДанныеКонтрагента.ID,
		ДополнительныеПараметры.Приглашение);
	
	Модуль_Ядро.Контрагенты_ПринятьПриглашение(
		ДополнительныеПараметры.ДанныеОрганизации,
		Приглашения
	);
	
	НовыйСтатус = Статус_МойКонтрагент();
	
	ОбновитьДанныеКонтрагентаВКэше(
		ДополнительныеПараметры,
		НовыйСтатус);
	
КонецПроцедуры

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

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

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

//&НаКлиентеНаСервереБезКонтекста
Функция Статус_МойКонтрагент()
	
	Возврат "IsMyCounteragent";
	
КонецФункции

//&НаКлиентеНаСервереБезКонтекста
Функция Статус_ЗаблокированМной()
	
	Возврат "isRejectedByMe";
	
КонецФункции

//&НаКлиентеНаСервереБезКонтекста
Функция Статус_РаботаетВДиадок()
	
	Возврат "NotInCounteragentList";
	
КонецФункции

//&НаКлиентеНаСервереБезКонтекста
Функция Статус_ОжидаемОтветНаПриглашение()
	
	Возврат "IsInvitedByMe";
	
КонецФункции

// } Лента контрагентов

ИнициализироватьОбщийКонтекст();
УстановитьКонтекстФормы(ЭтаФорма, Неопределено);

ИмяФормы = Метаданные().Формы.Форма.ПолноеИмя();
Элементы = ЭлементыФормы;
ПредставлениеТиповДокументов = Новый Соответствие;