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

#Область СлужебныйПрограммныйИнтерфейс

Функция НастройкиПодсистемы() Экспорт
	
	Возврат МашиночитаемыеДоверенностиФНСПовтИсп.НастройкиПодсистемы();
	
КонецФункции

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

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

// Добавить информацию об МЧД в строку электронной подписи.
// 
// Параметры:
//  ЭлектроннаяПодписьФайла - Структура:
//    * РезультатПроверкиПодписиПоМЧД - Массив из см. НовыйРезультатПроверкиПодписиПоМЧД
// 
Процедура ДобавитьИнформациюМЧД(ЭлектроннаяПодписьФайла, УникальныйИдентификатор) Экспорт
	
	Если ТипЗнч(ЭлектроннаяПодписьФайла.РезультатПроверкиПодписиПоМЧД) = Тип("Структура") Тогда
		МассивРезультатов = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ЭлектроннаяПодписьФайла.РезультатПроверкиПодписиПоМЧД);
	Иначе
		МассивРезультатов = ЭлектроннаяПодписьФайла.РезультатПроверкиПодписиПоМЧД;
	КонецЕсли;
	
	Верна = Истина;
	Массив = Новый Массив;
	
	Для Каждого Результат Из МассивРезультатов Цикл // см. НовыйРезультатПроверкиПодписиПоМЧД
		
		Проверка = "";
		МашиночитаемыеДоверенностиФНССлужебныйКлиентСервер.ТекстПроверкиМЧД(Результат, Верна, Проверка);
		
		Массив.Добавить(СтроковыеФункции.ФорматированнаяСтрока(НСтр("ru = '%1 <a href=%2>%3</a>'"),
			Проверка,
			ПолучитьНавигационнуюСсылку(Результат.МашиночитаемаяДоверенность),
			Результат.Представление));
		Массив.Добавить(Символы.ПС);

	КонецЦикла;
	
	ЭлектроннаяПодписьФайла.Вставить("МашиночитаемаяДоверенность", Новый ФорматированнаяСтрока(Массив));
	ЭлектроннаяПодписьФайла.Вставить("МашиночитаемаяДоверенностьВерна", Верна);
	ЭлектроннаяПодписьФайла.Вставить("РезультатПроверкиПодписиПоМЧД", ПоместитьВоВременноеХранилище(
		ЭлектроннаяПодписьФайла.РезультатПроверкиПодписиПоМЧД, УникальныйИдентификатор));
	
КонецПроцедуры

// Заполнить протокол проверки.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  ГруппаПротоколПроверки - ГруппаФормы
//  РезультатПроверкиПодписиПоМЧД - Строка, Массив, Структура
//
Процедура ЗаполнитьПротоколПроверки(Форма, ГруппаПротоколПроверки, Знач РезультатПроверкиПодписиПоМЧД) Экспорт
	
	Если ТипЗнч(РезультатПроверкиПодписиПоМЧД) = Тип("Строка") Тогда
		РезультатПроверкиПодписиПоМЧД = ПолучитьИзВременногоХранилища(РезультатПроверкиПодписиПоМЧД);
	КонецЕсли;
	
	Если ТипЗнч(РезультатПроверкиПодписиПоМЧД) = Тип("Структура") Тогда
		МассивРезультатов = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(РезультатПроверкиПодписиПоМЧД);
	Иначе
		МассивРезультатов = РезультатПроверкиПодписиПоМЧД;
	КонецЕсли;
	
	ОчередностьВывода = Новый Массив;
	ОчередностьВывода.Добавить("ПроверкаДоверенности");
	ОчередностьВывода.Добавить("ПроверкаПодписанта");
	ОчередностьВывода.Добавить("ПроверкаДокумента");
	ОчередностьВывода.Добавить("ПроверкаПолномочий");
	
	Индекс = 0;
	Для Каждого Результат Из МассивРезультатов Цикл // см. НовыйРезультатПроверкиПодписиПоМЧД
		
		ПротоколПроверки = Результат.ПротоколПроверки;
		Если Не ЗначениеЗаполнено(ПротоколПроверки) Тогда
			Продолжить;
		КонецЕсли;
		
		Элемент = Форма.Элементы.Добавить("СсылкаНаМЧД" + Индекс, Тип("ДекорацияФормы"), ГруппаПротоколПроверки);
		Элемент.Заголовок = СтроковыеФункции.ФорматированнаяСтрока(НСтр("ru = '<a href=%1>%2</a>'"),
			ПолучитьНавигационнуюСсылку(Результат.МашиночитаемаяДоверенность),
			Результат.Представление);
		Элемент.АвтоМаксимальнаяШирина = Ложь;
		
		ГруппаАвтоматическиеПроверки = Форма.Элементы.Добавить("ГруппаАвтоматическиеПроверки" + Индекс, Тип("ГруппаФормы"), ГруппаПротоколПроверки);
		ГруппаАвтоматическиеПроверки.Вид           = ВидГруппыФормы.ОбычнаяГруппа;
		ГруппаАвтоматическиеПроверки.Группировка   = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
		ГруппаАвтоматическиеПроверки.ОтображатьЗаголовок = Ложь;
		
		ГруппаДругиеПроверки = Форма.Элементы.Добавить("ГруппаДругиеПроверки" + Индекс, Тип("ГруппаФормы"), ГруппаПротоколПроверки);
		ГруппаДругиеПроверки.Вид           = ВидГруппыФормы.ОбычнаяГруппа;
		ГруппаДругиеПроверки.Группировка   = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная;
		ГруппаДругиеПроверки.ОтображатьЗаголовок = Ложь;
		
		ГруппаДругиеПроверкиСписок = Форма.Элементы.Добавить("ГруппаДругиеПроверкиСписок" + Индекс, Тип("ГруппаФормы"), ГруппаДругиеПроверки);
		ГруппаДругиеПроверкиСписок.Вид           = ВидГруппыФормы.ОбычнаяГруппа;
		ГруппаДругиеПроверкиСписок.Группировка   = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
		ГруппаДругиеПроверкиСписок.ОтображатьЗаголовок = Ложь;
		
		ГруппаДругиеПроверкиКнопка = Форма.Элементы.Добавить("ГруппаДругиеПроверкиКнопка" + Индекс, Тип("ГруппаФормы"), ГруппаДругиеПроверки);
		ГруппаДругиеПроверкиКнопка.Вид           = ВидГруппыФормы.ОбычнаяГруппа;
		ГруппаДругиеПроверкиКнопка.Группировка   = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
		ГруппаДругиеПроверкиКнопка.ОтображатьЗаголовок = Ложь;
		
		Если Результат.ТребуетсяПроверка И Не Результат.СтатусВернаУстановленВручную Тогда
			
			НоваяКоманда = Форма.Команды.Добавить("Подключаемый_КомандаОтметитьВручную" + Индекс);
			НоваяКоманда.Действие = "Подключаемый_КомандаОтметитьВручную";
			НоваяКоманда.Подсказка = НСтр("ru = 'Отметить, что полномочия представителя по доверенности проверены и доверенность соответствует документу.'");
			
			Элемент = Форма.Элементы.Добавить("ОтметитьВручную" + Индекс, Тип("КнопкаФормы"), ГруппаДругиеПроверкиКнопка);
			Элемент.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
			Элемент.Заголовок = НСтр("ru = 'Проверена'");
			Элемент.ИмяКоманды = НоваяКоманда.Имя;
			Элемент.ОтображениеПодсказки = ОтображениеПодсказки.Кнопка;
		
		КонецЕсли;
		
		Для Каждого ПолеВывода Из ОчередностьВывода Цикл
		
			Проверка = ПротоколПроверки.Получить(ПолеВывода);
			Если Проверка = Неопределено Тогда
				Проверка = НовыйРезультатПроверкиПодписиПоМЧД(Результат.МашиночитаемаяДоверенность);
			КонецЕсли;
			
			Если ПолеВывода = "ПроверкаДоверенности" Или ПолеВывода = "ПроверкаПодписанта" Тогда
				ГруппаДляВывода = ГруппаАвтоматическиеПроверки;
			Иначе
				ГруппаДляВывода = ГруппаДругиеПроверкиСписок;
			КонецЕсли;
			
			ГруппаПроверка = Форма.Элементы.Добавить("ГруппаПроверка" + ПолеВывода + Индекс, Тип("ГруппаФормы"), ГруппаДляВывода);
			ГруппаПроверка.Вид           = ВидГруппыФормы.ОбычнаяГруппа;
			ГруппаПроверка.Группировка   = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
			ГруппаПроверка.ОтображатьЗаголовок = Ложь;
			
			ГруппаПроверкаЗаголовок = Форма.Элементы.Добавить("ГруппаПроверкаЗаголовок" + ПолеВывода + Индекс, Тип("ГруппаФормы"), ГруппаПроверка);
			ГруппаПроверкаЗаголовок.Вид           = ВидГруппыФормы.ОбычнаяГруппа;
			ГруппаПроверкаЗаголовок.Группировка   = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
			ГруппаПроверкаЗаголовок.ОтображатьЗаголовок = Ложь;
			
			Элемент = Форма.Элементы.Добавить("КартинкаПроверки" + ПолеВывода + Индекс, Тип("ДекорацияФормы"), ГруппаПроверкаЗаголовок);
			Элемент.Вид = ВидДекорацииФормы.Картинка;
			Элемент.Ширина = 2;
			Элемент.Высота = 1;
			
			Если Результат.СтатусВернаУстановленВручную Тогда
				Элемент.Картинка = БиблиотекаКартинок.ПроверкаСертификатаУспех;
			ИначеЕсли Проверка.Верна = Неопределено Тогда
				Элемент.Картинка = БиблиотекаКартинок.ПроверкаСертификатаНеВыполнялась;
			Иначе
				Элемент.Картинка = ?(Проверка.Верна, БиблиотекаКартинок.ПроверкаСертификатаУспех, БиблиотекаКартинок.ПроверкаСертификатаОшибка);
			КонецЕсли;
			
			Элемент = Форма.Элементы.Добавить("ЗаголовокПроверки" + ПолеВывода + Индекс, Тип("ДекорацияФормы"), ГруппаПроверкаЗаголовок);
			Элемент.Вид = ВидДекорацииФормы.Надпись;
			Элемент.АвтоМаксимальнаяШирина = Ложь;
			Элемент.МаксимальнаяШирина = 50;
			
			Если Проверка.Верна <> Истина И ЗначениеЗаполнено(Проверка.ТекстПроверки) И Не Результат.СтатусВернаУстановленВручную Тогда
				
				Элемент.УстановитьДействие("ОбработкаНавигационнойСсылки", "Подключаемый_ОбработкаНавигационнойСсылки");
				
				ИмяЭлементаНадписи = "ТекстПроверки" + ПолеВывода + Индекс;
				Элемент.Заголовок = СтроковыеФункции.ФорматированнаяСтрока("<a href = ""%1"">%2</a>", ИмяЭлементаНадписи, Проверка.ЗаголовокПроверки);
				
				Элемент = Форма.Элементы.Добавить(ИмяЭлементаНадписи, Тип("ДекорацияФормы"), ГруппаПроверка);
				Элемент.Вид = ВидДекорацииФормы.Надпись;
				Элемент.Заголовок = СтроковыеФункции.ФорматированнаяСтрока(Проверка.ТекстПроверки);
				Элемент.АвтоМаксимальнаяШирина = Ложь;
				Элемент.МаксимальнаяШирина = 60;
				
			Иначе
				Элемент.Заголовок = Проверка.ЗаголовокПроверки;
			КонецЕсли;
		
		КонецЦикла;
		
		Индекс = Индекс + 1;
		
	КонецЦикла;
	
КонецПроцедуры

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

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

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

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

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

// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов.
Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт
	
	ШаблоныЗаданий.Добавить(Метаданные.РегламентныеЗадания.ОбновлениеСтатусовМЧД.Имя);
	
КонецПроцедуры

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

Функция ИмяСобытияЖурналаРегистрации() Экспорт
	Возврат НСтр("ru = 'Машиночитаемые доверенности'", ОбщегоНазначения.КодОсновногоЯзыка());
КонецФункции

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

Функция ДатаОкончанияПериодаИстекающихДоверенностей(ДатаОтсчета) Экспорт
	Возврат ДатаОтсчета + 259200;
КонецФункции

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

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

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

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

// Только для ЭлектроннаяПодпись.ОбновитьПодпись
Процедура ДобавитьБлокировку(Блокировка, ПодписанныйОбъект) Экспорт
	ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ЭлектронныеПодписиМЧД");
	ЭлементБлокировки.УстановитьЗначение("ПодписанныйОбъект", ПодписанныйОбъект);
КонецПроцедуры

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

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

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

Процедура ПриДобавленииОписанияДополнительныхДанных(ДополнительныеДанные, ОписаниеФайлов, Сведения, Текст) Экспорт
	
	ДоверенностиМЧД = Новый Массив;

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

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

	Заголовок = Новый Массив;
	
	Если ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени("РегистрСведений.ЖурналМашиночитаемыхДоверенностей")
		<> Неопределено 
		И (Пользователи.ЭтоПолноправныйПользователь() Или ПравоДоступа("Просмотр",
			Метаданные.РегистрыСведений["ЖурналМашиночитаемыхДоверенностей"])) Тогда // АПК:1244 проверка прав на существующий объект
			Заголовок.Добавить(СтрШаблон("<a href = ""%1"">%2</a>", "РегистрСведений.ЖурналМашиночитаемыхДоверенностей.ФормаСписка",
				НСтр("ru='Для электронного документооборота (ЭДО)'")));
	КонецЕсли;
	
	Если ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени("Справочник.МашиночитаемыеДоверенностиФНС") <> Неопределено Тогда
		Если (Пользователи.ЭтоПолноправныйПользователь() Или ПравоДоступа("Просмотр",
			Метаданные.Справочники["МашиночитаемыеДоверенностиФНС"])) Тогда // АПК:1244 проверка прав на существующий объект
				
			Заголовок.Добавить(СтрШаблон("<a href = ""%1"">%2</a>", "Справочник.МашиночитаемыеДоверенностиФНС.ФормаСписка",
				НСтр("ru='Для ФНС'")));
			
		КонецЕсли;
	КонецЕсли;
	
	Если ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени("Справочник.МашиночитаемыеДоверенностиРаспределенныйРеестр") <> Неопределено Тогда
		Если (Пользователи.ЭтоПолноправныйПользователь() Или ПравоДоступа("Просмотр",
			Метаданные.Справочники["МашиночитаемыеДоверенностиРаспределенныйРеестр"])) Тогда // АПК:1244 проверка прав на существующий объект
				
			Заголовок.Добавить(СтрШаблон("<a href = ""%1"">%2</a>", "Справочник.МашиночитаемыеДоверенностиРаспределенныйРеестр.ФормаСписка",
				НСтр("ru='Для ФНС (распределенный реестр)'")));
			
		КонецЕсли;
	КонецЕсли;

	Если ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени("Справочник.МашиночитаемыеДоверенностиФСС") <> Неопределено Тогда
		Если (Пользователи.ЭтоПолноправныйПользователь() Или ПравоДоступа("Просмотр",
			Метаданные.Справочники["МашиночитаемыеДоверенностиФСС"])) Тогда // АПК:1244 проверка прав на существующий объект
				
			Заголовок.Добавить(СтрШаблон("<a href = ""%1"">%2</a>", "Справочник.МашиночитаемыеДоверенностиФСС.ФормаСписка",
				НСтр("ru='Для СФР (бывший ФСС)'")));
		КонецЕсли;
	КонецЕсли;
	
	ДобавитьНачалоЗаголовка = Истина;
	Если Форма.ИмяФормы = "ОбщаяФорма.НастройкиЭлектроннойПодписиИШифрования"
		И (Пользователи.ЭтоПолноправныйПользователь() Или ПравоДоступа("Просмотр",
		Метаданные.Справочники.МашиночитаемыеДоверенности)) Тогда
		
		Если Заголовок.Количество() > 0 Тогда
			
			Заголовок.Вставить(0, СтрШаблон("<a href = ""%1"">%2</a>", "Справочник.МашиночитаемыеДоверенности.ФормаСписка",
				НСтр("ru='Единого формата - для отчетности, кадрового ЭДО'")));
		Иначе
			ДобавитьНачалоЗаголовка = Ложь;
			Заголовок.Вставить(0, СтрШаблон("<a href = ""%1"">%2</a>", "Справочник.МашиночитаемыеДоверенности.ФормаСписка",
				Метаданные.Справочники.МашиночитаемыеДоверенности.Синоним));
		КонецЕсли;
	КонецЕсли;
	
	Если Заголовок.Количество() > 0 Тогда

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

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

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

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

	Верна = Истина;
	ТребуетсяПроверка = Ложь;
	Для Каждого КлючИЗначение Из ПротоколПроверки Цикл
		Если КлючИЗначение.Значение.Верна = Неопределено Тогда
			Верна = Ложь;
			ТребуетсяПроверка = Истина;
			Прервать;
		КонецЕсли;
		Если КлючИЗначение.Значение.Верна = Ложь Тогда
			Верна = Ложь;
			ТребуетсяПроверка = Ложь;
		КонецЕсли;
	КонецЦикла;
	
	Если ПротоколПроверки["ПроверкаДоверенности"].Верна <> Истина
		Или ПротоколПроверки["ПроверкаПодписанта"].Верна <> Истина Тогда
		ТребуетсяПроверка = Ложь;
	КонецЕсли;

	РезультатПроверкиПодписиПоМЧД.Верна = Верна;
	РезультатПроверкиПодписиПоМЧД.ТребуетсяПроверка = ТребуетсяПроверка;
	РезультатПроверкиПодписиПоМЧД.ПротоколПроверки = ПротоколПроверки;
	РезультатПроверкиПодписиПоМЧД.ДатаПроверки = ДатаПроверки;
	РезультатПроверкиПодписиПоМЧД.ПодписантСоответствуетПредставителю = ПодписантСоответствуетПредставителю;
	РезультатПроверкиПодписиПоМЧД.СовместныеПолномочия = ДанныеМЧД.СовместныеПолномочия;

	Возврат РезультатПроверкиПодписиПоМЧД;
	
КонецФункции

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

// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления.
Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
	
	РегистрыСведений.КлассификаторыМЧД.ПриДобавленииОбработчиковОбновления(Обработчики);
	
КонецПроцедуры

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

Функция ЭтоМашиночитаемаяДоверенность(Ссылка) Экспорт
	
	Возврат ТипЗнч(Ссылка) = Тип("СправочникСсылка.МашиночитаемыеДоверенности");
	 
КонецФункции

// Создает новые либо перезаполняет существующие элементы справочника МашиночитаемыеДоверенности данными из файлов.
//
// Параметры:
//  ЗагруженныеФайлы - Массив из Структура - файлы доверенностей и подписей, архивы zip:
//   * ИмяФайла - Строка - имя файла без пути к нему,
//   * Хранение - Строка - адрес двоичных данных файла во временном хранилище.
//                   - Структура - уже разобранные файлы доверенностей и подписей:
//   * ФайлыДоверенностей - Соответствие
//   * ПодписиФайлов      - Соответствие
//   
//  Замещать - Булево - при замещении выполняется перезаполнение элемента, все имеющиеся присоединенные файлы при этом
//   помечаются на удаление.
//
Функция ЗагрузитьДоверенностиВИнформационнуюБазу(ЗагруженныеФайлы, Замещать = Ложь) Экспорт
	
	Возврат Справочники.МашиночитаемыеДоверенности.ЗагрузитьДоверенностиВИнформационнуюБазу(ЗагруженныеФайлы, Замещать = Ложь);
	
КонецФункции

// Возвращает свойства или ссылку на существующие элементы справочника МашиночитаемыеДоверенности.
//
// Параметры:
//  ЗагруженныеФайлы - Массив из Структура - файлы доверенностей и подписей, архивы zip:
//   * ИмяФайла - Строка - имя файла без пути к нему,
//   * Хранение - Строка - адрес двоичных данных файла во временном хранилище.
//                   - Структура - уже разобранные файлы доверенностей и подписей:
//   * ФайлыДоверенностей - Соответствие
//   * ПодписиФайлов      - Соответствие
//
Функция СвойстваДоверенностейИзФайлов(ЗагруженныеФайлы, УникальныйИдентификатор) Экспорт

	Возврат Справочники.МашиночитаемыеДоверенности.СвойстваДоверенностейИзФайлов(ЗагруженныеФайлы,
		УникальныйИдентификатор);
	
КонецФункции

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

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

	Если Доверители.Количество() > 0 Тогда

		РеквизитыДоверителя = Доверители[0].ДоверительРеквизиты.Получить();
		ЭтоФизическоеЛицо = РеквизитыДоверителя.ЭтоФизическоеЛицо;
		Доверитель = Доверители[0].Доверитель;

		Если ЗначениеЗаполнено(Доверитель) Тогда
			
			Если ОписаниеТиповОрганизации().СодержитТип(ТипЗнч(Доверитель))
				И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Организации") Тогда

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

	Результат.ПредставлениеДоверенности = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '%1 действует с %2 по %3, выдана от %4'"), РеквизитыДоверенности.НомерДоверенности, Формат(
		РеквизитыДоверенности.ДатаВыдачи, "ДЛФ=D"), Формат(РеквизитыДоверенности.ДатаОкончания, "ДЛФ=D"), Доверитель);
		
	Возврат Результат;
			
КонецФункции

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

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

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

	Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(МетаданныеСсылки, "КПП") Тогда
		МассивРеквизитов.Добавить("КПП");
	КонецЕсли;

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

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

Функция СертификатВыданФНС(СвойстваИздателя)
	Возврат СвойстваИздателя.ОГРН = "1047707030513";
КонецФункции

Функция СертификатНотариуса(СвойстваИздателя, СвойстваСубъекта) Экспорт
	Возврат СертификатВыданФНС(СвойстваИздателя) И ЗначениеЗаполнено(СвойстваСубъекта.Должность)
		И Не ЗначениеЗаполнено(СвойстваСубъекта.ОГРНИП)
		И Не ЗначениеЗаполнено(СвойстваСубъекта.ИННЮЛ);
КонецФункции

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

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

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

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

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

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

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

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

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

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

Функция ДанныеДоверителей(Доверенность)
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	МашиночитаемыеДоверенностиПредставителиИДоверители.НаименованиеОрганизации КАК НаименованиеОрганизации,
	|	МашиночитаемыеДоверенностиПредставителиИДоверители.ФИО КАК ФИО,
	|	МашиночитаемыеДоверенностиПредставителиИДоверители.ИНН КАК ИНН,
	|	МашиночитаемыеДоверенностиПредставителиИДоверители.ИННФЛ КАК ИННФЛ,
	|	МашиночитаемыеДоверенностиПредставителиИДоверители.ОГРН КАК ОГРН,
	|	МашиночитаемыеДоверенностиПредставителиИДоверители.СНИЛС КАК СНИЛС,
	|	МашиночитаемыеДоверенностиПредставителиИДоверители.ТипУчастника,
	|	МашиночитаемыеДоверенностиСтатусы.Подписана КАК Подписана
	|ИЗ
	|	РегистрСведений.МашиночитаемыеДоверенностиПредставителиИДоверители КАК МашиночитаемыеДоверенностиПредставителиИДоверители
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МашиночитаемыеДоверенностиСтатусы КАК МашиночитаемыеДоверенностиСтатусы
	|		ПО МашиночитаемыеДоверенностиПредставителиИДоверители.МашиночитаемаяДоверенность = МашиночитаемыеДоверенностиСтатусы.МашиночитаемаяДоверенность
	|ГДЕ
	|	МашиночитаемыеДоверенностиПредставителиИДоверители.МашиночитаемаяДоверенность = &МашиночитаемаяДоверенность
	|	И МашиночитаемыеДоверенностиПредставителиИДоверители.ТипУчастника = ЗНАЧЕНИЕ(Перечисление.ТипыУчастниковМЧД.Доверитель)
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	МашиночитаемыеДоверенностиПредставителиИДоверители.НаименованиеОрганизации КАК НаименованиеОрганизации,
	|	МашиночитаемыеДоверенностиПредставителиИДоверители.ФИО КАК ФИО,
	|	МашиночитаемыеДоверенностиПредставителиИДоверители.ИНН КАК ИНН,
	|	МашиночитаемыеДоверенностиПредставителиИДоверители.ИННФЛ КАК ИННФЛ,
	|	МашиночитаемыеДоверенностиПредставителиИДоверители.ОГРН КАК ОГРН,
	|	МашиночитаемыеДоверенностиПредставителиИДоверители.СНИЛС КАК СНИЛС,
	|   МашиночитаемыеДоверенностиПредставителиИДоверители.ТипУчастника,
	|	МашиночитаемыеДоверенностиСтатусы.Подписана КАК Подписана
	|ИЗ
	|	РегистрСведений.МашиночитаемыеДоверенностиПредставителиИДоверители КАК МашиночитаемыеДоверенностиПредставителиИДоверители
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МашиночитаемыеДоверенностиСтатусы КАК МашиночитаемыеДоверенностиСтатусы
	|		ПО МашиночитаемыеДоверенностиПредставителиИДоверители.МашиночитаемаяДоверенность = МашиночитаемыеДоверенностиСтатусы.МашиночитаемаяДоверенность
	|ГДЕ
	|	МашиночитаемыеДоверенностиПредставителиИДоверители.МашиночитаемаяДоверенность = &МашиночитаемаяДоверенность
	|	И МашиночитаемыеДоверенностиПредставителиИДоверители.ТипУчастника = ЗНАЧЕНИЕ(Перечисление.ТипыУчастниковМЧД.Нотариус)";
	
	Запрос.УстановитьПараметр("МашиночитаемаяДоверенность", Доверенность);
	
	Возврат Запрос.Выполнить().Выгрузить();
	
КонецФункции

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

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

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

Функция КонтактнаяИнформацияВJSON(Значение, Тип)

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

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

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

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

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

Функция ОписаниеТиповОрганизации()
	
	Возврат Метаданные.ОпределяемыеТипы.Организация.Тип;
	
КонецФункции

Функция ОписаниеТиповКонтрагента()
	
	Возврат Метаданные.ОпределяемыеТипы.Контрагент.Тип;
	
КонецФункции

Функция ОписаниеТиповФизическогоЛица()
	
	Возврат Метаданные.ОпределяемыеТипы.ФизическоеЛицо.Тип;
	
КонецФункции

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

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

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

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

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

Функция СтруктураЗаголовкаДекорации(Назначение, Реквизиты, ТолькоОсновные, ПоказыватьПерсональныеДанные, ИмяЭлементаОрганизация, 
	ТолькоОбязательные = Ложь, ДляТаблицы = Ложь)
		
	Если Реквизиты.ЭтоФизическоеЛицо Тогда
		СписокРеквизитов = МашиночитаемыеДоверенностиФНССлужебныйКлиентСервер.РеквизитыФизическогоЛицаСписок(Назначение, Ложь,
			МашиночитаемыеДоверенностиФНССлужебныйКлиентСервер.ОпределитьВидУчастника(Реквизиты));
		СписокРеквизитов.НайтиПоЗначению("ДокументКодПодразделения").Пометка = Реквизиты.ДокументВид <> "21";
	Иначе
		СписокРеквизитов = МашиночитаемыеДоверенностиФНССлужебныйКлиентСервер.РеквизитыОрганизацииСписок(Назначение, Ложь,
			МашиночитаемыеДоверенностиФНССлужебныйКлиентСервер.ОпределитьВидУчастника(Реквизиты));
	КонецЕсли;
	
	ЗаголовокДекорации = Новый Массив;
	ЗаголовокДекорацииОсновныеРеквизиты = Новый Массив;
	ЗаголовокДекорацииНаименование    = Новый Массив;
	ЗаголовокДекорацииКНаименованию   = Новый Массив;
	ЗаголовокДекорацииПаспорт         = Новый Массив;
	ЗаголовокДекорацииАдрес           = Новый Массив;
	ЗаголовокДекорацииДругиеДанные    = Новый Массив;
	ЗаголовокДекорацииОшибки          = Новый Массив;
	НаименованиеДокумента             = "";
	
	Если Не ПоказыватьПерсональныеДанные Тогда
		ПерсональныеДанные = МашиночитаемыеДоверенностиФНССлужебныйКлиентСервер.ПерсональныеДанные();
	КонецЕсли;
	
	Для Каждого Реквизит Из Реквизиты Цикл
		
		Если Реквизит.Ключ = "ЭтоИндивидуальныйПредприниматель"
			Или Реквизит.Ключ = "ЭтоФизическоеЛицо"
			Или Реквизит.Ключ = "ЭтоКонтрагент"
			Или Реквизит.Ключ = "ЭтоИностраннаяОрганизация"
			Или Реквизит.Ключ = "ЭтоИндивидуальныйПредприниматель"
			Или Реквизит.Ключ = "ЭтоФилиал"
			Или Реквизит.Ключ = "ЭтоДолжностноеЛицо"
			Или Реквизит.Ключ = "ФактическийАдресЗначение"
			Или Реквизит.Ключ = "ТелефонЗначение"
			Или Реквизит.Ключ = "ЭлектроннаяПочтаЗначение"
			Или Реквизит.Ключ = "ЮридическийАдресЗначение"
			Или Реквизит.Ключ = "АдресРегистрацииЗначение"
			Или Реквизит.Ключ = "НаименованиеСокращенное"
			Или Реквизит.Ключ = "ЮридическийАдресВСтранеРегистрацииЗначение" Тогда
			Продолжить;
		КонецЕсли;
		
		Если Реквизиты.ЭтоФизическоеЛицо И Не ПоказыватьПерсональныеДанные И ПерсональныеДанные.Найти(Реквизит.Ключ) <> Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		Найдено = СписокРеквизитов.НайтиПоЗначению(Реквизит.Ключ);
		
		Если Найдено <> Неопределено Тогда
			Если Найдено.Пометка Тогда
				Если ТолькоОбязательные Тогда
					Продолжить;
				КонецЕсли;
				Если Не ЗначениеЗаполнено(Реквизит.Значение) Тогда
					Продолжить;
				КонецЕсли;
			КонецЕсли;
			
			Если Не ЗначениеЗаполнено(Реквизит.Значение) И Не ТолькоОсновные Тогда
				Ошибка = СтрШаблон("<a style=""color: ПоясняющийОшибкуТекст"" href=""%1:%2"">%3</a>", ИмяЭлементаОрганизация, Реквизит.Ключ, Найдено.Представление);
				ЗаголовокДекорацииОшибки.Добавить(Ошибка);
				Продолжить;
			КонецЕсли;
			
			Если Реквизит.Ключ = "Пол" Тогда
				Значение = ?(Реквизит.Значение = 1, "Мужской", "Женский");
				ЗаголовокДекорацииКНаименованию.Добавить(СтрШаблон("%1: %2", Найдено.Представление, Значение));
				Продолжить;
			ИначеЕсли Реквизит.Ключ = "ДокументВид" Тогда
				НаименованиеДокумента = ?(Реквизит.Значение = "21", НСтр("ru = 'Паспорт'"), НСтр("ru = 'Иной документ'"));
				Продолжить;
			ИначеЕсли ТипЗнч(Реквизит.Значение) = Тип("Дата") Тогда
				Значение = Формат(Реквизит.Значение, "ДЛФ=D");
			Иначе
				Значение = Реквизит.Значение;
			КонецЕсли;
			
			Если Реквизит.Ключ = "НаименованиеПолное" 
				Или Реквизит.Ключ = "ДолжностьЛицаДоверителя"
				Или Реквизит.Ключ = "Фамилия"
				Или Реквизит.Ключ = "Имя"
				Или Реквизит.Ключ = "Отчество" Тогда
				ЗаголовокДекорацииНаименование.Добавить(Значение);
			ИначеЕсли Реквизит.Ключ = "ИНН"
				Или Реквизит.Ключ = "КПП"
				Или Реквизит.Ключ = "ОГРН" Тогда
				ЗаголовокДекорацииОсновныеРеквизиты.Добавить(СтрШаблон("%1: %2", Найдено.Представление, Значение));
			ИначеЕсли Реквизит.Ключ = "Гражданство"
				Или Реквизит.Ключ = "МестоРождения"
				Или Реквизит.Ключ = "ДатаРождения" Тогда
				ЗаголовокДекорацииКНаименованию.Добавить(СтрШаблон("%1: %2", Найдено.Представление, Значение)); 
			ИначеЕсли Реквизит.Ключ = "ФактическийАдрес"
				Или Реквизит.Ключ = "ЮридическийАдрес"
				Или Реквизит.Ключ = "АдресРегистрации"
				Или Реквизит.Ключ = "ЮридическийАдресВСтранеРегистрации" Тогда
				ЗаголовокДекорацииАдрес.Добавить(СтрШаблон("%1: %2", Найдено.Представление, Значение)); 
			ИначеЕсли Реквизит.Ключ = "ДокументНомер"
				Или Реквизит.Ключ = "ДокументКемВыдан"
				Или Реквизит.Ключ = "ДокументДатаВыдачи"
				Или Реквизит.Ключ = "ДокументКодПодразделения"
				Или Реквизит.Ключ = "ДокументСрокДействия" Тогда
				ЗаголовокДекорацииПаспорт.Добавить(СтрШаблон("%1: %2", Найдено.Представление, Значение));
			Иначе
				ЗаголовокДекорацииДругиеДанные.Добавить(СтрШаблон("%1: %2", Найдено.Представление, Значение));
			КонецЕсли;
			
		КонецЕсли;
	КонецЦикла;
	
	Если (Не ТолькоОсновные Или ДляТаблицы) И ЗаголовокДекорацииНаименование.Количество() > 0 Тогда
		ЗаголовокДекорации.Добавить(СтрСоединить(ЗаголовокДекорацииНаименование, " "));
	КонецЕсли;
	Если ЗаголовокДекорацииОсновныеРеквизиты.Количество() > 0 Тогда
		ЗаголовокДекорации.Добавить(СтрСоединить(ЗаголовокДекорацииОсновныеРеквизиты, " "));
	КонецЕсли;
	Если Не ТолькоОсновные И ЗаголовокДекорацииКНаименованию.Количество() > 0 Тогда
		ЗаголовокДекорации.Добавить(СтрСоединить(ЗаголовокДекорацииКНаименованию, ", "));
	КонецЕсли;
	Если Не ТолькоОсновные И ЗаголовокДекорацииПаспорт.Количество() > 0 Тогда
		ЗаголовокДекорацииПаспорт = НаименованиеДокумента + " " + СтрСоединить(ЗаголовокДекорацииПаспорт, ", ");
		ЗаголовокДекорации.Добавить(ЗаголовокДекорацииПаспорт);
	КонецЕсли;
	Если Не ТолькоОсновные И ЗаголовокДекорацииДругиеДанные.Количество() > 0 Тогда
		ЗаголовокДекорации.Добавить(СтрСоединить(ЗаголовокДекорацииДругиеДанные, ", "));
	КонецЕсли;
	Если Не ТолькоОсновные И ЗаголовокДекорацииАдрес.Количество() > 0 Тогда
		ЗаголовокДекорации.Добавить(СтрСоединить(ЗаголовокДекорацииАдрес, Символы.ПС));
	КонецЕсли;
	
	Возврат Новый Структура("ЗаголовокДекорации, ЗаголовокДекорацииОшибки", ЗаголовокДекорации, ЗаголовокДекорацииОшибки);
	
КонецФункции

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

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

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

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

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

Функция ОшибкиПроверкиТелефона(Знач ТелефонЗначение)
	
	Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		Возврат "";
	КонецЕсли;
	
	МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
	
	ТекстСообщения = Новый Массив;
	ТелефонСтруктура = МодульУправлениеКонтактнойИнформацией.СведенияОТелефоне(ТелефонЗначение);
	
	// Проверка, что телефон российский.
	Если СтрЗаменить(ТелефонСтруктура.КодСтраны, "+", "") <> "7" Тогда
		ТекстСообщения.Добавить(НСтр("ru = 'Код страны не российский (должен быть ""7"")'"));
	КонецЕсли;
	
	НомерТелефонаБезКодаСтраны = ТелефонСтруктура.КодГорода + ТелефонСтруктура.НомерТелефона;
	
	Если Не ЗначениеЗаполнено(НомерТелефонаБезКодаСтраны) Тогда
		ТекстСообщения.Добавить(НСтр("ru = 'Не заполнен номер телефона'"));
		Возврат СтрСоединить(ТекстСообщения, Символы.ПС);
	КонецЕсли;
	
	КодГородаТолькоЦифры = ТолькоЦифры(ТелефонСтруктура.КодГорода);
	Если СтрДлина(КодГородаТолькоЦифры) < 3 Или СтрДлина(КодГородаТолькоЦифры) > 5 Тогда
		ТекстСообщения.Добавить(НСтр("ru = 'Код города должен состоять из 3-5 цифр'"));
	КонецЕсли;
	
	Если СтрДлина(ТолькоЦифры(НомерТелефонаБезКодаСтраны)) <> 10 Тогда
		ТекстСообщения.Добавить(НСтр("ru = 'Номер телефона с кодом города должен состоять из 10-и цифр'"));
	КонецЕсли;
	
	Если СтрДлина(ТелефонСтруктура.Добавочный) > 6 Тогда
		ТекстСообщения.Добавить(НСтр("ru = 'Добавочный номер телефона не может быть длиннее 6 символов.'"));
	КонецЕсли;
	
	Если ТекстСообщения.Количество() > 0 Тогда
		Возврат СтрСоединить(ТекстСообщения, Символы.ПС);
	КонецЕсли;
	
	Возврат "";
	
КонецФункции

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

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

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

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

Функция ТолькоЦифры(Строка)
	
	ДлинаСтроки = СтрДлина(Строка);
	
	ОбработаннаяСтрока = "";
	Для НомерСимвола = 1 По ДлинаСтроки Цикл
		
		Символ = Сред(Строка, НомерСимвола, 1);
		Если Символ >= "0" И Символ <= "9" Тогда
			ОбработаннаяСтрока = ОбработаннаяСтрока + Символ;
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат ОбработаннаяСтрока;
	
КонецФункции

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

Функция ТекстОшибкиПолеНеЗаполнено() Экспорт
	Возврат НСтр("ru = 'Поле не заполнено'");
КонецФункции

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

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

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

#Область ДанныеДляМоихДел

Функция КоличествоДоверенностейСИстекающимСрокомДействия()
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ МашиночитаемыеДоверенности.Ссылка) КАК Количество
	|ИЗ
	|	Справочник.МашиночитаемыеДоверенности КАК МашиночитаемыеДоверенности
	|ГДЕ
	|	КонецПериода(МашиночитаемыеДоверенности.ДатаОкончания, День) МЕЖДУ &ТекущаяДата И &ДатаОкончания
	|	И МашиночитаемыеДоверенности.Статус = &Статус";

	ТекущаяДатаСеанса = КонецДня(ТекущаяДатаСеанса());

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

	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();

	Если Выборка.Следующий() Тогда
		Возврат Выборка.Количество;
	Иначе
		Возврат 0;
	КонецЕсли;
КонецФункции

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

	ТекущаяДатаСеанса = ТекущаяДатаСеанса();

	Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса);
	Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыМЧД.Черновик);

	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();

	Если Выборка.Следующий() Тогда
		Возврат Выборка.Количество;
	Иначе
		Возврат 0;
	КонецЕсли;
КонецФункции

Функция КоличествоДоверенностейТребующихВнимания()
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ МашиночитаемыеДоверенности.Ссылка) КАК Количество
	|ИЗ
	|	Справочник.МашиночитаемыеДоверенности КАК МашиночитаемыеДоверенности
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МашиночитаемыеДоверенностиСтатусы КАК МашиночитаемыеДоверенностиСтатусы
	|		ПО (МашиночитаемыеДоверенностиСтатусы.МашиночитаемаяДоверенность = МашиночитаемыеДоверенности.Ссылка)
	|ГДЕ
	|	МашиночитаемыеДоверенности.НомерДоверенности <> """"
	|	И МашиночитаемыеДоверенностиСтатусы.ТехническийСтатус В (&Статусы)
	|	И МашиночитаемыеДоверенности.ДатаОкончания > &ТекущаяДата";

	ТекущаяДатаСеанса = ТекущаяДатаСеанса();

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

	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();

	Если Выборка.Следующий() Тогда
		Возврат Выборка.Количество;
	Иначе
		Возврат 0;
	КонецЕсли;
КонецФункции

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

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

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

Процедура ДобавитьОписаниеДоверенностиМЧД(ДоверенностьМЧД, ОписаниеФайлов, Сведения)
	
	ОписаниеФайла = Новый Структура;
	ОписаниеФайла.Вставить("Данные", ДоверенностьМЧД.Данные);
	ОписаниеФайла.Вставить("Имя",    ДоверенностьМЧД.Имя);
	
	Сведения = Сведения + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = '%1: ""%2""'"), ДоверенностьМЧД.ТипФайла, ДоверенностьМЧД.Имя) + Символы.ПС;
		
	ОписаниеФайлов.Добавить(ОписаниеФайла);
	
КонецПроцедуры

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

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

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

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

	ЧтениеZipФайла.Закрыть();
	ФайловаяСистема.УдалитьВременныйКаталог(ВременныйКаталог);
	
	Возврат Результат;
	
КонецФункции

Функция НомераДоверенностейИзФайлов(ЗагруженныеФайлы) Экспорт
	
	ИменаФайлов = Новый Массив;
	
	Для Каждого ЗагруженныйФайл Из ЗагруженныеФайлы Цикл
		Файл = Новый Файл(ЗагруженныйФайл.ИмяФайла);
		
		Если НРег(Файл.Расширение) = ".zip" Тогда
			ДвоичныеДанные = ПолучитьИзВременногоХранилища(ЗагруженныйФайл.Хранение);
			ИменаФайловВАрхиве = ИменаФайловВАрхиве(ДвоичныеДанные);
			
			Для Каждого ИмяФайлаВАрхиве Из ИменаФайловВАрхиве Цикл
				ИменаФайлов.Добавить(ИмяФайлаВАрхиве);
			КонецЦикла;
		Иначе
			ИменаФайлов.Добавить(ЗагруженныйФайл.ИмяФайла);
		КонецЕсли;
	КонецЦикла;
	
	НомераДоверенностейИзФайлов = Новый Массив;
	
	Для Каждого ИмяФайла Из ИменаФайлов Цикл
		Файл = Новый Файл(ИмяФайла);
		
		Если НРег(Файл.Расширение) = ".xml" 
			И (СтрНачинаетсяС(Файл.ИмяБезРасширения, "ON_EMCHD") Или СтрНачинаетсяС(Файл.ИмяБезРасширения, "ON_DOVEL")) Тогда
			ЧастиСтроки = СтрРазделить(Файл.ИмяБезРасширения, "_", Ложь);
			НомерДоверенности = ЧастиСтроки[ЧастиСтроки.ВГраница()];
			НомераДоверенностейИзФайлов.Добавить(НомерДоверенности);
		КонецЕсли;
	КонецЦикла;
	
	Возврат НомераДоверенностейИзФайлов;
	
КонецФункции

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

	ЧтениеZipФайла.Закрыть();
	Возврат Результат;
	
КонецФункции

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

Функция СвойстваСервераМЧДРР()
	
	Результат = НастройкиМЧД();
	
	Если ИспользуетсяРежимТестирования() Тогда
		СохраненныеНастройкиМЧД = ХранилищеОбщихНастроек.Загрузить("ДокументооборотСКонтролирующимиОрганами_НастройкиМЧД");
		Если СохраненныеНастройкиМЧД <> Неопределено Тогда
			ЗаполнитьЗначенияСвойств(Результат, СохраненныеНастройкиМЧД);
		КонецЕсли;
		Если Результат.ИспользоватьРасширенияAPI Тогда
			Результат.ЛогинОператора 	= "";
			Результат.ПарольОператора 	= "";
		КонецЕсли;
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Истина);
	URLСервера = Константы.АдресСервисаМЧДРР.Получить();
	УстановитьПривилегированныйРежим(Ложь);
	Если НЕ ЗначениеЗаполнено(URLСервера) Тогда
		URLСервера = "https://1cpoagate.1c.ru/applications/MChD/api/clientpoa";
	КонецЕсли;
	СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI(URLСервера);
	ЛогинПароль = ?(ЗначениеЗаполнено(СтруктураURI.Логин) ИЛИ ЗначениеЗаполнено(СтруктураURI.Пароль),
		СтруктураURI.Логин + ":" + СтруктураURI.Пароль + "@", "");
	
	Результат.Вставить("АдресСервера", 					СтруктураURI.Схема + "://" + ЛогинПароль + СтруктураURI.ИмяСервера);
	Результат.Вставить("АдресСервераБезАутентификации", СтруктураURI.Схема + "://" + СтруктураURI.ИмяСервера);
	Результат.Вставить("РесурсКорняAPI", 				"/" + СтруктураURI.ПутьНаСервере);
	
	Возврат Результат;
	
КонецФункции

Функция НастройкиМЧД()
	
	Результат = Новый Структура;
	Результат.Вставить("ЛогинОператора", 			"");
	Результат.Вставить("ПарольОператора", 			"");
	Результат.Вставить("ИспользоватьРасширенияAPI", Истина);
	Результат.Вставить("ТестовыйСервер", 			"test");
	
	Возврат Результат;
	
КонецФункции

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

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

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

Функция ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибки) Экспорт
	
	ЗаголовокОшибки = ПараметрыОшибки.ЗаголовокОшибки;
	ЗапросHTTP = ПараметрыОшибки.ЗапросHTTP;
	ПараметрыТекстаОшибки = ПараметрыОшибки.ПараметрыТекстаОшибки;
	ОтветHTTP = ПараметрыОшибки.ОтветHTTP;
	ТекстОшибки = ПараметрыОшибки.ТекстОшибки;
	СтруктураОтвета = ПараметрыОшибки.СтруктураОтвета;
	ДополнительныеФайлы = ПараметрыОшибки.ДополнительныеФайлы;
	
	Если ОтветHTTP <> Неопределено Тогда
		СтрокаОтвета = ПолучитьИдентификаторОтвета(ОтветHTTP, СтруктураОтвета);
	Иначе
		СтрокаОтвета = "";
	КонецЕсли;
	
	СтруктураЗначения = Новый Структура;
	
	ТекстОшибкиИзОтвета = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(СтруктураОтвета, "title", Неопределено);
	Если ТекстОшибкиИзОтвета <> Неопределено Тогда
		Детали = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(СтруктураОтвета, "detail", Неопределено);
		ТекстОшибкиИзОтвета = СтрСоединить(СтрРазделить(ТекстОшибкиИзОтвета, Символы.ПС + " ", Ложь), " ");
		Если СтрЗаканчиваетсяНа(ТекстОшибки, ".") Тогда
			ТекстОшибки = Лев(ТекстОшибки, СтрДлина(ТекстОшибки) - 1);
		КонецЕсли;
		Если ЗначениеЗаполнено(Детали) Тогда
			ТекстОшибки = СтрШаблон("%1 (%2. %3).", ТекстОшибки, ТекстОшибкиИзОтвета, Детали);
		Иначе
			ТекстОшибки = СтрШаблон("%1 (%2).", ТекстОшибки, ТекстОшибкиИзОтвета);
		КонецЕсли;
	КонецЕсли;
	
	Если ОтветHTTP <> Неопределено И Строка(ОтветHTTP.КодСостояния) = СтрокаОтвета Тогда 
		
		ОшибкаПоКлассификатору = Новый Структура("Причина, Решение, СпособУстранения, Ссылка");
		ОшибкаПоКлассификатору.Причина = ОписаниеОшибкиHTTP(ОтветHTTP.КодСостояния);
		
		СтруктураЗначения.Вставить("СтрокаПоискаОшибки", ОтветHTTP.КодСостояния);
		СтруктураЗначения.Вставить("ОшибкаПоКлассификаторуНайдена", Ложь);
		
		ОшибкаПоКлассификатору.Решение = СтроковыеФункции.ФорматированнаяСтрока(
			НСтр("ru='Повторите действие позднее или обратитесь в <a href=%1>службу поддержки ФНС России</a>.'"),
			"https://www.nalog.gov.ru/rn77/service/service_feedback/?service=101");
		
		МетодикиУстранения = Новый Массив;
		МетодикиУстранения.Добавить("ПовторнаяОтправка");
		МетодикиУстранения.Добавить("НеЗапрашиватьСтатусДоверенности");
		
		СпособУстранения = Новый Структура("МетодикиУстранения", МетодикиУстранения);
		ОшибкаПоКлассификатору.СпособУстранения = ОбщегоНазначения.ЗначениеВJSON(СпособУстранения);
		
	Иначе
		Если ЗапросHTTP <> Неопределено Тогда
			СтрокаЗапроса = ПолучитьИдентификаторЗапроса(ЗапросHTTP);
		Иначе
			СтрокаЗапроса = "";
		КонецЕсли;
		
		Если ЗначениеЗаполнено(СтрокаОтвета) Тогда
			СтрокаПоискаОшибки = СтрокаЗапроса + "|" + СтрокаОтвета;
			ОшибкаПоКлассификатору = ЭлектроннаяПодпись.ОшибкаПоКлассификатору(СтрокаПоискаОшибки, Истина);
		КонецЕсли;
		
		Если ОшибкаПоКлассификатору = Неопределено Тогда
			СтрокаПоискаОшибки = ТекстОшибки;
			ОшибкаПоКлассификатору = ЭлектроннаяПодпись.ОшибкаПоКлассификатору(СтрокаПоискаОшибки, Истина);
		КонецЕсли;

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

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

Функция ОписаниеОшибкиHTTP(КодСостояния)
	
	Если КодСостояния < 200 Или КодСостояния >= 300 И КодСостояния < 400 Тогда
		Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Неподдерживаемый ответ сервиса Распределенного реестра ФНС России (%1).'"), Формат(
		КодСостояния, "ЧДЦ=; ЧН=; ЧГ="));
	ИначеЕсли КодСостояния >= 400 И КодСостояния < 500 Тогда
		Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Сервис Распределенного реестра ФНС России не смог выполнить запрос (%1).'"), Формат(
		КодСостояния, "ЧДЦ=; ЧН=; ЧГ="));
	ИначеЕсли КодСостояния >= 300 Тогда
		Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр(
				"ru = 'Сервис Распределенного реестра ФНС России перегружен, недоступен или находится на обслуживании (%1).'"),
			Формат(
		КодСостояния, "ЧДЦ=; ЧН=; ЧГ="));
	Иначе
		Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Не удалось получить ответ сервиса Распределенного реестра ФНС России (%1).'"), Формат(
		КодСостояния, "ЧДЦ=; ЧН=; ЧГ="));
	КонецЕсли;
	
КонецФункции

// Устанавливает соединение с сервером Интернета по протоколу http(s).
//
// Параметры:
//  URL                 - Строка - url сервера в формате [Протокол://]<Сервер>/.
//  ПараметрыСоединения - Структура - дополнительные параметры для "тонкой" настройки:
//    * Таймаут - Число - определяет время ожидания осуществляемого соединения и операций, в секундах.
//
Функция СоединениеССерверомИнтернета(URL, ПараметрыСоединения = Неопределено) Экспорт
	
	ЭлектроннаяПодпись.РазрешенДоступКИнтернетСервисам(Истина);
	
	СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI(URL);
	Схема = ?(ЗначениеЗаполнено(СтруктураURI.Схема), СтруктураURI.Схема, "http");
	Прокси = ПолучениеФайловИзИнтернета.ПолучитьПрокси(Схема);
	
	Таймаут = 30;
	Если ТипЗнч(ПараметрыСоединения) = Тип("Структура") Тогда
		Если ПараметрыСоединения.Свойство("Таймаут") Тогда
			Таймаут = ПараметрыСоединения.Таймаут;
		КонецЕсли;
	КонецЕсли;
	
	Попытка
		Соединение = Новый HTTPСоединение(
			СтруктураURI.Хост,
			СтруктураURI.Порт,
			СтруктураURI.Логин,
			СтруктураURI.Пароль, 
			Прокси,
			Таймаут,
			?(НРег(Схема) = "http", Неопределено, ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение()));
	Исключение
		ИнформацияОбОшибке = ИнформацияОбОшибке();	
		ЗаписьЖурналаРегистрации(ИмяСобытияЖурналаРегистрации() +"."
			+ НСтр("ru = 'Установление соединения с сервером интернета'", ОбщегоНазначения.КодОсновногоЯзыка()),
			УровеньЖурналаРегистрации.Ошибка,,,
			ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
		ВызватьИсключение;
	КонецПопытки;
	
	Возврат Соединение;
	
КонецФункции

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

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

Функция ПолучитьИдентификаторЗапроса(ЗапросHTTP)
	
	Результат = "";
	Словарь = СтрРазделить("poar-webapp/integration/poa/generate-number/transactions/status/poaopen/public/poazip/zip/number/token", "/", Ложь);
	Синонимы = Новый Соответствие;
	Синонимы.Вставить("/vst-oauth2/oauth/token", "/token");
	Синонимы.Вставить("/poar-webapp/integration/poa/generate-number", "/number");
	Синонимы.Вставить("/poar-webapp/integration/poa", "/poa");
	Синонимы.Вставить("/poar-webapp/integration/poa/status", "/transactions");
	Синонимы.Вставить("/poar-webapp/integration/poa/public", "/poaopen");
	Синонимы.Вставить("/poar-webapp/integration/poa/zip", "/poazip");
	СловаЗапроса = СтрРазделить(ЗапросHTTP.АдресРесурса, "/?", Ложь);
	Для Каждого Слово Из СловаЗапроса Цикл
		Если Словарь.Найти(Слово) <> Неопределено Тогда
			Результат = Результат + "/" + Слово;
		КонецЕсли;
	КонецЦикла;
	Синоним = Синонимы[Результат];
	Возврат ?(Синоним = Неопределено, Результат, Синоним);
	
КонецФункции  

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

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

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

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

Функция RestПредставлениеЗапроса(Запрос, СоединениеHTTP)
	RestЗапрос = Новый Массив;
	RestЗапрос.Добавить("###");
	RestЗапрос.Добавить(Символы.ПС);
	АдресРесурса = ?(СоединениеHTTP.ЗащищенноеСоединение = Неопределено, "http://", "https://") + СоединениеHTTP.Сервер + "/" + Запрос.АдресРесурса;
	СтрокаЗапроса = ?(ЗначениеЗаполнено(Запрос.ПолучитьТелоКакСтроку()), "POST", "GET") + " " + АдресРесурса + " HTTP/1.1";
	RestЗапрос.Добавить(СтрокаЗапроса);
	Для Каждого Заголовок Из Запрос.Заголовки Цикл
		RestЗапрос.Добавить(Заголовок.Ключ+": "+Заголовок.Значение);
	КонецЦикла;
	
	RestЗапрос.Добавить(Символы.ПС);
	RestЗапрос.Добавить(Запрос.ПолучитьТелоКакСтроку()); 
	RestЗапрос.Добавить(Символы.ПС);
	RestЗапрос.Добавить("###");
	Возврат СтрСоединить(RestЗапрос, Символы.ПС);
КонецФункции

Процедура УбратьИнформациюОДоступе(Строка, Заголовки)
	Если Заголовки.Получить("username") <> Неопределено Тогда
		Заголовки.Вставить("username", "*");
	КонецЕсли;
	
	Если Заголовки.Получить("password") <> Неопределено Тогда
		Заголовки.Вставить("password", "*");
	КонецЕсли;
	
	Позиция = СтрНайти(Строка, "?login=");
	Если Позиция > 0 Тогда
		Строка = Лев(Строка, Позиция -1)+"?login=*&password=*";
	КонецЕсли;
	
КонецПроцедуры

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

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

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

#Область ТехническийСтатусДокумента

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

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

Функция ПрочитатьСостояниеМассиваМЧД(Доверенности)
	
	СостояниеДоверенностей = Новый Соответствие;
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
	               |	МашиночитаемыеДоверенностиСтатусы.МашиночитаемаяДоверенность КАК Доверенность,
	               |	МашиночитаемыеДоверенностиСтатусы.ИдентификаторТранзакции КАК ИдентификаторТранзакции,
	               |	МашиночитаемыеДоверенностиСтатусы.ТехническийСтатус КАК ТехническийСтатус,
	               |	МашиночитаемыеДоверенностиСтатусы.СтатусТранзакции КАК СтатусТранзакции,
	               |	МашиночитаемыеДоверенностиСтатусы.Подписана КАК Подписана,
	               |	МашиночитаемыеДоверенностиСтатусы.ТипТранзакции КАК ТипТранзакции,
	               |	МашиночитаемыеДоверенностиСтатусы.ДатаТранзакции КАК ДатаТранзакции,
	               |	МашиночитаемыеДоверенностиСтатусы.ДатаЗапросаСтатуса КАК ДатаЗапросаСтатуса,
	               |	МашиночитаемыеДоверенностиСтатусы.ДанныеОшибкиЗапросаСтатуса КАК ДанныеОшибкиЗапросаСтатуса,
	               |	МашиночитаемыеДоверенности.Статус КАК Статус,
	               |	ВЫБОР
	               |		КОГДА МашиночитаемыеДоверенностиСтатусы.ТехническийСтатус В (&СтатусыБезПодробностей)
	               |			ТОГДА ЛОЖЬ
	               |		ИНАЧЕ ИСТИНА
	               |	КОНЕЦ КАК ОтображатьСтатусВДокументе
	               |ИЗ
	               |	РегистрСведений.МашиночитаемыеДоверенностиСтатусы КАК МашиночитаемыеДоверенностиСтатусы
	               |		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.МашиночитаемыеДоверенности КАК МашиночитаемыеДоверенности
	               |		ПО МашиночитаемыеДоверенностиСтатусы.МашиночитаемаяДоверенность = МашиночитаемыеДоверенности.Ссылка
	               |ГДЕ
	               |	МашиночитаемыеДоверенностиСтатусы.МашиночитаемаяДоверенность В(&Доверенности)";
	Запрос.УстановитьПараметр("Доверенности", Доверенности);
	СтатусыБезПодробностей = Новый Массив;
	СтатусыБезПодробностей.Добавить(Перечисления.ТехническиеСтатусыМЧД.Создание);
	СтатусыБезПодробностей.Добавить(Перечисления.ТехническиеСтатусыМЧД.Подписание);
	СтатусыБезПодробностей.Добавить(Перечисления.ТехническиеСтатусыМЧД.Подписана);
	СтатусыБезПодробностей.Добавить(Перечисления.ТехническиеСтатусыМЧД.Просрочена);
	СтатусыБезПодробностей.Добавить(Перечисления.ТехническиеСтатусыМЧД.Отменена);
	
	Запрос.УстановитьПараметр("СтатусыБезПодробностей", СтатусыБезПодробностей);
	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();
	Пока Выборка.Следующий() Цикл
		СостояниеДоверенности = СостояниеДоверенности();
		ЗаполнитьЗначенияСвойств(СостояниеДоверенности, Выборка);
		
		Если Выборка.ДатаТранзакции <> Дата(1,1,1) Тогда
			ОписаниеСостояния = СтроковыеФункции.ФорматированнаяСтрока(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='<span style=""color: %1"">Запрос в реестр ФНС отправлен %2</span>'"), "ПоясняющийТекст", ОтформатироватьДату(Выборка.ДатаТранзакции)));
		ИначеЕсли ЗначениеЗаполнено(Выборка.ТехническийСтатус) Тогда
			ОписаниеСостояния = СтроковыеФункции.ФорматированнаяСтрока(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='<span style=""color: %1"">%2</span>'"), "ПоясняющийТекст", Выборка.ТехническийСтатус));
		Иначе
			ОписаниеСостояния = СтроковыеФункции.ФорматированнаяСтрока(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='<span style=""color: %1"">Запрос в реестр ФНС не направлялся</span>'"), "ПоясняющийТекст"));
		КонецЕсли;
		
		Если ЗначениеЗаполнено(Выборка.ДатаЗапросаСтатуса) И Выборка.ТехническийСтатус <> Перечисления.ТехническиеСтатусыМЧД.Активна Тогда
			ОписаниеСостояния = Новый ФорматированнаяСтрока(ОписаниеСостояния, Символы.ПС, 
				СтроковыеФункции.ФорматированнаяСтрока(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='<span style=""color: %1"">Состояние на %2</span>'"), "ПоясняющийТекст", ОтформатироватьДату(Выборка.ДатаЗапросаСтатуса))));	
		КонецЕсли;
		
		Если Выборка.СтатусТранзакции = Перечисления.СтатусыТранзакцииСРеестромМЧД.ОжидаетОбработки
			И Выборка.ТипТранзакции = Перечисления.ТипыТранзакцийСРеестромМЧД.Регистрация Тогда
			ОписаниеСобытия = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='<span style=""color: %1"">: Ожидает регистрации</span>'"), "ПоясняющийТекст");
		ИначеЕсли Выборка.СтатусТранзакции = Перечисления.СтатусыТранзакцииСРеестромМЧД.ОжидаетОбработки
			И Выборка.ТипТранзакции = Перечисления.ТипыТранзакцийСРеестромМЧД.Отмена Тогда
			ОписаниеСобытия = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='<span style=""color: %1"">: Ожидает отмены</span>'"), "ПоясняющийТекст");
		ИначеЕсли Выборка.СтатусТранзакции = Перечисления.СтатусыТранзакцииСРеестромМЧД.Успешно
			И Выборка.ТипТранзакции = Перечисления.ТипыТранзакцийСРеестромМЧД.Регистрация
			И Выборка.ТехническийСтатус = Перечисления.ТехническиеСтатусыМЧД.Регистрация Тогда
			ОписаниеСобытия = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='<span style=""color: %1"">: Ожидает регистрации в информационном ресурсе ""Доверенность"" ФНС России</span>'"), "ПоясняющийТекст");
		ИначеЕсли Выборка.СтатусТранзакции = Перечисления.СтатусыТранзакцииСРеестромМЧД.Успешно
			И Выборка.ТипТранзакции = Перечисления.ТипыТранзакцийСРеестромМЧД.Регистрация Тогда
			ОписаниеСобытия = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='<span style=""color: %1"">: Успешно зарегистрирована</span>'"), "ПоясняющийТекст");
		ИначеЕсли Выборка.СтатусТранзакции = Перечисления.СтатусыТранзакцииСРеестромМЧД.Успешно
			И Выборка.ТипТранзакции = Перечисления.ТипыТранзакцийСРеестромМЧД.Отмена Тогда
			ОписаниеСобытия = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='<span style=""color: %1"">: Успешно отменена</span>'"), "ПоясняющийТекст");
		ИначеЕсли Выборка.СтатусТранзакции = Перечисления.СтатусыТранзакцииСРеестромМЧД.Ошибка
			И Выборка.ТипТранзакции = Перечисления.ТипыТранзакцийСРеестромМЧД.Регистрация Тогда
			ОписаниеСобытия = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='<span style=""color: %1"">: <a href = ""%2"">Не удалось зарегистрировать</a>'"), "ПоясняющийТекст", "ПоказатьОшибку");
		ИначеЕсли Выборка.СтатусТранзакции = Перечисления.СтатусыТранзакцииСРеестромМЧД.Ошибка
			И Выборка.ТипТранзакции = Перечисления.ТипыТранзакцийСРеестромМЧД.Отмена Тогда
			ОписаниеСобытия = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='<span style=""color: %1"">: <a href = ""%2"">Не удалось отменить</a>'"), "ПоясняющийТекст", "ПоказатьОшибку");
			ИначеЕсли (ЗначениеЗаполнено(Выборка.ДатаТранзакции) Или Не ЗначениеЗаполнено(Выборка.ТипТранзакции))
				И Выборка.СтатусТранзакции = Перечисления.СтатусыТранзакцииСРеестромМЧД.Ошибка Тогда
			ОписаниеСобытия = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='<span style=""color: %1"">: <a href = ""%2"">Не удалось получить статус</a>'"), "ПоясняющийТекст", "ПоказатьОшибку");
		ИначеЕсли Выборка.ТехническийСтатус = Перечисления.ТехническиеСтатусыМЧД.Регистрация 
			И Выборка.СтатусТранзакции = Перечисления.СтатусыТранзакцииСРеестромМЧД.ПустаяСсылка() Тогда
			ОписаниеСобытия = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='<span style=""color: %1"">: <a href = ""%2"">Не удалось зарегистрировать</a>'"), "ПоясняющийТекст", "ПоказатьОшибку");
		КонецЕсли;
		
		ДанныеОшибкиЗапросаСтатуса = СостояниеДоверенности.ДанныеОшибкиЗапросаСтатуса.Получить();
		Если СодержитХронологическиеДанные(ДанныеОшибкиЗапросаСтатуса) Тогда
			СостояниеДоверенности.ДанныеОшибкиЗапросаСтатуса = ДанныеОшибкиЗапросаСтатуса.ДанныеОшибкиЗапросаСтатуса;
			СостояниеДоверенности.ХронологическиеДанные = ДанныеОшибкиЗапросаСтатуса.ХронологическиеДанные;
		Иначе
			СостояниеДоверенности.ДанныеОшибкиЗапросаСтатуса = ДанныеОшибкиЗапросаСтатуса;
		КонецЕсли;
		
		ОписаниеСостояния = Новый ФорматированнаяСтрока(ОписаниеСостояния, 
			СтроковыеФункции.ФорматированнаяСтрока(ОписаниеСобытия));
		СостояниеДоверенности.ОписаниеСостояния = ОписаниеСостояния;
		СостояниеДоверенностей.Вставить(Выборка.Доверенность, СостояниеДоверенности);
	КонецЦикла;
	Возврат СостояниеДоверенностей;
КонецФункции

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

Функция ОтформатироватьДату(Дата)
	Если НачалоДня(Дата) = НачалоДня(ТекущаяДатаСеанса()) Тогда
		ДатаТекстом = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'сегодня %1'"), Формат(Дата, НСтр("ru='ДФ=HH:mm'")));
	Иначе
		ДатаТекстом = Формат(Дата, НСтр("ru='ДФ=dd.MM.yyyy HH:mm'"));
	КонецЕсли;
	Возврат ДатаТекстом;
КонецФункции

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

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

		ЭтоВнешнийСтатус = ВнешниеСтатусы[Запись.ТехническийСтатус] = Истина;

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

		ЗаписатьСтатус = Ложь;
		Если Подписана <> Неопределено И Запись.Подписана <> Подписана Тогда
			Запись.Подписана = Подписана;
			ЗаписатьСтатус = Истина;
		КонецЕсли;

		Если Не ЭтоВнешнийСтатус Тогда
			Если Запись.Подписана Тогда
				Если РегистрироватьВРеестре Тогда
					ТехническийСтатус = Перечисления.ТехническиеСтатусыМЧД.Подписана;
				Иначе
					ТехническийСтатус = Перечисления.ТехническиеСтатусыМЧД.Активна;
				КонецЕсли;
			Иначе
				ТехническийСтатус = Перечисления.ТехническиеСтатусыМЧД.Создание;
			КонецЕсли;
			Если Запись.ТехническийСтатус <> ТехническийСтатус Тогда
				Запись.ТехническийСтатус = ТехническийСтатус;
				ЗаписатьСтатус = Истина;
			КонецЕсли;
		КонецЕсли;

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

		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;
	
	Возврат ТехническийСтатус;
	
КонецФункции

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

Функция ПолучитьЗначениеСтатуса(СтатусСтрокой) Экспорт
	ТехническийСтатус = Неопределено;
	СтатусДоверенности = СокрЛП(ВРег(СтатусСтрокой));
	
	Если СтатусДоверенности = "ACTIVE" Тогда
		ТехническийСтатус = Перечисления.ТехническиеСтатусыМЧД.Зарегистрирована;
	ИначеЕсли СтатусДоверенности = "REJECTED" Тогда
		ТехническийСтатус = Перечисления.ТехническиеСтатусыМЧД.ОшибкаРегистрации;
	ИначеЕсли СтатусДоверенности = "PROCESSING" Тогда
		ТехническийСтатус = Перечисления.ТехническиеСтатусыМЧД.Регистрация;
	ИначеЕсли СтатусДоверенности = "EXPIRED" Тогда
		ТехническийСтатус = Перечисления.ТехническиеСтатусыМЧД.Просрочена;
	ИначеЕсли СтатусДоверенности = "REVOKED" Тогда
		ТехническийСтатус = Перечисления.ТехническиеСтатусыМЧД.Отменена;
	ИначеЕсли СтатусДоверенности = "CREATED" Тогда
		ТехническийСтатус = Перечисления.ТехническиеСтатусыМЧД.ДатаНачалаДействияНеНаступила;
	КонецЕсли;
	
	Возврат ТехническийСтатус;
КонецФункции


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

#Область ИнтерфейсРаботаСРаспределеннымРеестром

Функция АвторизоватьсяНаСервереМЧДРР(ЦельАвторизации = "") Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	ПараметрыРезультатаАвторизации = ПараметрыСеанса.ПараметрыАвторизацииВРаспределенномРеестре;
	Если ПараметрыРезультатаАвторизации <> Неопределено И ПараметрыРезультатаАвторизации.ДатаСеанса <> Неопределено
		И ПараметрыРезультатаАвторизации.РезультатАвторизации <> Неопределено Тогда
		
		ДатаСеанса = ТекущаяДатаСеанса();
		Если ПараметрыРезультатаАвторизации.ДатаСеанса >= ДатаСеанса - 60 * 60
			И ПараметрыРезультатаАвторизации.ДатаСеанса <= ДатаСеанса Тогда
			
			Возврат Новый Структура(ПараметрыРезультатаАвторизации.РезультатАвторизации);
		КонецЕсли;
	КонецЕсли;
	
	СвойстваСервераМЧДРР = СвойстваСервераМЧДРР();
	
	Результат = Новый Структура;
	Результат.Вставить("АдресСервера", 			СвойстваСервераМЧДРР.АдресСервераБезАутентификации);
	Результат.Вставить("ТокенДоступа", 			"");
	Результат.Вставить("ТекстОтвета", 			"");
	Результат.Вставить("Ошибка");
	
	Если Не ЭлектроннаяПодпись.РазрешенДоступКИнтернетСервисам() Тогда
		ЗаголовокОшибки = ?(ЦельАвторизации = "", НСтр("ru='Не удается авторизоваться на сервере Распределенного реестра ФНС России'"), ЦельАвторизации);
		Результат.Ошибка = ОшибкаЗапретаДоступаКИнтернетСервисам(ЗаголовокОшибки);
		Возврат Результат;
	КонецЕсли;
	
	РесурсНаСервере = СвойстваСервераМЧДРР.РесурсКорняAPI + ?(СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI,
		"/token", "/vst-oauth2/oauth/token");
	ПараметрыРесурсаНаСервере = "";
	Если СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI Тогда
		ТикетАутентификацииИлиДанныеПользователя = ТикетАутентификацииИлиДанныеПользователяНаПорталеПоддержки();
		
		Если ТикетАутентификацииИлиДанныеПользователя = Неопределено Тогда
			ЗаголовокОшибки = ?(ЦельАвторизации = "", НСтр("ru='Не удается авторизоваться на сайте интернет-поддержки'"), ЦельАвторизации);
			ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, НСтр("ru='Не удается получить тикет аутентификации или данные пользователя.'"));
			Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
			Возврат Результат;
		КонецЕсли;
		
		Если ТикетАутентификацииИлиДанныеПользователя.Свойство("Тикет") Тогда
			ПараметрыРесурсаНаСервере = "?ticket=" + КодироватьСтроку(ТикетАутентификацииИлиДанныеПользователя.Тикет,
				СпособКодированияСтроки.КодировкаURL);
		Иначе
			ПараметрыРесурсаНаСервере = "?login=" + КодироватьСтроку(ТикетАутентификацииИлиДанныеПользователя.Логин,
				СпособКодированияСтроки.КодировкаURL)
				+ "&password=" + КодироватьСтроку(ТикетАутентификацииИлиДанныеПользователя.Пароль,
				СпособКодированияСтроки.КодировкаURL)
		КонецЕсли;
	КонецЕсли;
	
	ЗаголовкиHTTP = Новый Соответствие();
	ЗаголовкиHTTP.Вставить("Content-Type", "application/json");
	ЗаголовкиHTTP.Вставить("Proxy-Connection", "Keep-Alive");
	ЗаголовкиHTTP.Вставить("Pragma", "no-cache");
	Если СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI И ИспользуетсяРежимТестирования() Тогда
		ЗаголовкиHTTP.Вставить("poaservertype", СвойстваСервераМЧДРР.ТестовыйСервер);
	КонецЕсли;
	
	ЗапросHTTP = Новый HTTPЗапрос(РесурсНаСервере + ПараметрыРесурсаНаСервере, ЗаголовкиHTTP);
	Если НЕ СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI Тогда
		СтруктураЗапроса = Новый Структура;
		СтруктураЗапроса.Вставить("username", СвойстваСервераМЧДРР.ЛогинОператора);
		СтруктураЗапроса.Вставить("password", СвойстваСервераМЧДРР.ПарольОператора);
		СтруктураЗапроса.Вставить("grant_type", "password");
		
		ТелоЗапроса = ОбщегоНазначения.ЗначениеВJSON(СтруктураЗапроса);
		ЗапросHTTP.УстановитьТелоИзСтроки(ТелоЗапроса);
	КонецЕсли;
	
	ОтветHTTP = Неопределено;
	
	Попытка
		СоединениеHTTP = СоединениеССерверомИнтернета(СвойстваСервераМЧДРР.АдресСервера);
		
		Если СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI Тогда
			ОтветHTTP = СоединениеHTTP.Получить(ЗапросHTTP);
		Иначе
			ОтветHTTP = СоединениеHTTP.ВызватьHTTPМетод("POST", ЗапросHTTP);
		КонецЕсли;
	Исключение
		ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
		ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
		ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
		ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
		ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
		ЗаголовокОшибки = ?(ЦельАвторизации = "", НСтр("ru='Не удается авторизоваться на сервере Распределенного реестра ФНС России'"), ЦельАвторизации);
		
		ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, ПредставлениеОшибки);
		ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
		ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP;
		ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
		Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
		Возврат Результат;
	КонецПопытки;
	
	Попытка
		СтруктураОтвета = ПолучитьСтруктуруОтвета(ОтветHTTP);
		Результат.ТекстОтвета = ОтветHTTP.ПолучитьТелоКакСтроку();
		Результат.ТокенДоступа = ?(ТипЗнч(СтруктураОтвета) = Тип("Структура") И СтруктураОтвета.Свойство("access_token"),
			СтруктураОтвета.access_token, "");
	Исключение
		ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
		ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
		ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
		ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
		ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
		ЗаголовокОшибки = ?(ЦельАвторизации = "", НСтр("ru='Отказ при получении токена доступа на сервере Распределенного реестра ФНС России'"), ЦельАвторизации);
		ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, ПредставлениеОшибки);
		ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
		ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP;
		ПараметрыОшибкиМЧДРР.СтруктураОтвета = СтруктураОтвета;
		ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
		Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
		Возврат Результат;
	КонецПопытки;
	
	Если НЕ ЗначениеЗаполнено(Результат.ТокенДоступа) Тогда
		ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
		ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
		ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
		ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
		ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
		ЗаголовокОшибки = ?(ЦельАвторизации = "", НСтр("ru='Распределенный реестр ФНС России не предоставил токен для авторизации'"), ЦельАвторизации);
		ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, 
			НСтр("ru='Распределенный реестр ФНС России не предоставил токен для авторизации.'"));
		ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
		ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP;
		ПараметрыОшибкиМЧДРР.СтруктураОтвета = СтруктураОтвета;
		ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
		Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
		Возврат Результат;
	КонецЕсли;
	
	ПараметрыРезультатаАвторизации = ПараметрыРезультатаАвторизацииНаСервереМЧД();
	ПараметрыРезультатаАвторизации.ДатаСеанса 			= ТекущаяДатаСеанса();
	ПараметрыРезультатаАвторизации.РезультатАвторизации = Новый ФиксированнаяСтруктура(Результат);
	ПараметрыСеанса.ПараметрыАвторизацииВРаспределенномРеестре = Новый ФиксированнаяСтруктура(ПараметрыРезультатаАвторизации);
	
	Возврат Результат;
	
КонецФункции

Функция НомерМЧДРР(ТокенДоступа = "") Экспорт
	
	СвойстваСервераМЧДРР = СвойстваСервераМЧДРР();
	
	Результат = Новый Структура;
	Результат.Вставить("АдресСервера", 			СвойстваСервераМЧДРР.АдресСервераБезАутентификации);
	Результат.Вставить("НомерДоверенности", 	"");
	Результат.Вставить("ТекстОтвета", 			"");
	Результат.Вставить("Ошибка");
	
	ЗаголовокОшибки = НСтр("ru='Не удалось получить номер доверенности'");
	
	Если Не ЗначениеЗаполнено(ТокенДоступа) Тогда
		РезультатАвторизации = АвторизоватьсяНаСервереМЧДРР(ЗаголовокОшибки);
		Если РезультатАвторизации.Ошибка <> Неопределено Тогда
			Результат.Ошибка = РезультатАвторизации.Ошибка;
		КонецЕсли;
		
		Если Результат.Ошибка <> Неопределено Тогда
			Возврат Результат;
		КонецЕсли;
		
		ТокенДоступа = РезультатАвторизации.ТокенДоступа;
	КонецЕсли;
	
	РесурсНаСервере = СвойстваСервераМЧДРР.РесурсКорняAPI + ?(СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI,
		"/number", "/poar-webapp/integration/poa/generate-number");
	
	ЗаголовкиHTTP = Новый Соответствие();
	ЗаголовкиHTTP.Вставить("Proxy-Connection", "Keep-Alive");
	ЗаголовкиHTTP.Вставить("Pragma", "no-cache");
	Если СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI И ИспользуетсяРежимТестирования() Тогда
		ЗаголовкиHTTP.Вставить("poaservertype", СвойстваСервераМЧДРР.ТестовыйСервер);
	КонецЕсли;
	
	ЗаголовкиHTTP.Вставить(?(СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI, "authorizationtoken", "authorization"),
		"Bearer " + ТокенДоступа);
	
	ЗапросHTTP = Новый HTTPЗапрос(РесурсНаСервере, ЗаголовкиHTTP);
	
	ОтветHTTP = Неопределено;
	
	Попытка
		СоединениеHTTP = СоединениеССерверомИнтернета(
			СвойстваСервераМЧДРР.АдресСервераБезАутентификации);
		
		ОтветHTTP = СоединениеHTTP.Получить(ЗапросHTTP);
	Исключение
		ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
		ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
		ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
		ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
		ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
		ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, ПредставлениеОшибки);
		ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
		ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP;
		ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
		Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
		
		Возврат Результат;
	КонецПопытки;
	
	Попытка
		Результат.ТекстОтвета = ОтветHTTP.ПолучитьТелоКакСтроку();
		СтруктураОтвета = ПолучитьСтруктуруОтвета(ОтветHTTP);
		
		Результат.НомерДоверенности = ?(ТипЗнч(СтруктураОтвета) = Тип("Структура") И СтруктураОтвета.Свойство("poaNumber"),
			СтруктураОтвета.poaNumber, "");
	Исключение
		ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
		ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
		ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
		ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
		ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
		ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, ПредставлениеОшибки);
		ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
		ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP;
		ПараметрыОшибкиМЧДРР.СтруктураОтвета = СтруктураОтвета;
		ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
		Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
		Возврат Результат;
	КонецПопытки;
	
	Если НЕ ЗначениеЗаполнено(Результат.НомерДоверенности) Тогда
		ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
		ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
		ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
		ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
		ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
		ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, 
			НСтр("ru='Распределенный реестр ФНС России не выдал номер доверенности.'"));
		ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
		ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP;
		ПараметрыОшибкиМЧДРР.СтруктураОтвета = СтруктураОтвета;
		ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
		Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
		Возврат Результат;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

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

		ТокенДоступа = РезультатАвторизации.ТокенДоступа;
	КонецЕсли;
		
	РесурсНаСервере = СвойстваСервераМЧДРР.РесурсКорняAPI + ?(СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI,
		"/poa", "/poar-webapp/integration/poa");
	
	ЗаголовкиHTTP = Новый Соответствие();
	ЗаголовкиHTTP.Вставить("Content-Type", "multipart/form-data; boundary=My1cV8bNdr");
	ЗаголовкиHTTP.Вставить("Proxy-Connection", "Keep-Alive");
	ЗаголовкиHTTP.Вставить("Pragma", "no-cache");
	Если СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI И ИспользуетсяРежимТестирования() Тогда
		ЗаголовкиHTTP.Вставить("poaservertype", СвойстваСервераМЧДРР.ТестовыйСервер);
	КонецЕсли;
	ЗаголовкиHTTP.Вставить(?(СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI, "authorizationtoken", "authorization"),
		"Bearer " + ТокенДоступа);
	
	// запись передаваемых файлов
	
	МассивДвоичныхДанных = Новый Массив();
	
	ШаблонФайла = "--My1cV8bNdr
		|Content-Disposition: form-data; name=""poa""; filename=""%1""
		|Content-Type: text/xml
		|
		|";
	
	ШаблонФайла = СтрЗаменить(ШаблонФайла,  Символы.ПС, Символы.ВК + Символы.ПС);
	СодержимоеФайла = СтрШаблон(ШаблонФайла, ИмяФайлаВыгрузки);
	
	МассивДвоичныхДанных.Добавить(ПолучитьДвоичныеДанныеИзСтроки(СодержимоеФайла, "windows-1251"));	
	МассивДвоичныхДанных.Добавить(ДанныеВыгрузки);
	
	ШаблонФайла = "
		|--My1cV8bNdr
		|Content-Disposition: form-data; name=""signature""; filename=""%1.sig""
		|Content-Type: text/xml
		|
		|";
		
	ШаблонФайла = СтрЗаменить(ШаблонФайла,  Символы.ПС, Символы.ВК + Символы.ПС);
	СодержимоеФайла = СтрШаблон(ШаблонФайла, ИмяФайлаВыгрузки);
	
	МассивДвоичныхДанных.Добавить(ПолучитьДвоичныеДанныеИзСтроки(СодержимоеФайла, "windows-1251"));
	
	Подпись64 = Base64Строка(ДанныеПодписи);
	Подпись64 = СтрЗаменить(Подпись64, Символы.ВК, "");
	Подпись64 = СтрЗаменить(Подпись64, Символы.ПС, "");
	
	МассивДвоичныхДанных.Добавить(ПолучитьДвоичныеДанныеИзСтроки(Подпись64, "windows-1251"));
	
	ШаблонФайла = "
		|--My1cV8bNdr--";
	СодержимоеФайла = СтрЗаменить(ШаблонФайла,  Символы.ПС, Символы.ВК + Символы.ПС);
	
	МассивДвоичныхДанных.Добавить(ПолучитьДвоичныеДанныеИзСтроки(СодержимоеФайла, "windows-1251"));
	
	ПередаваемыеДанные = СоединитьДвоичныеДанные(МассивДвоичныхДанных);
	
	ЗапросHTTP = Новый HTTPЗапрос(РесурсНаСервере, ЗаголовкиHTTP);
	ЗапросHTTP.УстановитьТелоИзДвоичныхДанных(ПередаваемыеДанные);
		
	ОтветHTTP = Неопределено;
	
	Попытка
		СоединениеHTTP = СоединениеССерверомИнтернета(
			СвойстваСервераМЧДРР.АдресСервераБезАутентификации);
		
		ОтветHTTP = СоединениеHTTP.ВызватьHTTPМетод("POST", ЗапросHTTP);
	Исключение
		ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
		ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
		ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
		ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
		ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
		ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, ПредставлениеОшибки);
		ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
		ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP;
		ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
		Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
		Возврат Результат;
	КонецПопытки;
	
	Попытка
		СтруктураОтвета = ПолучитьСтруктуруОтвета(ОтветHTTP);
		Результат.ИдентификаторТранзакции = ?(ТипЗнч(СтруктураОтвета) = Тип("Структура") И СтруктураОтвета.Свойство("txId"),
			СтруктураОтвета.txId, "");
		Результат.НомерДоверенности = ?(ТипЗнч(СтруктураОтвета) = Тип("Структура") И СтруктураОтвета.Свойство("poaNumber"),
			СтруктураОтвета.poaNumber, "");
		Результат.ХешДоверенности = ?(ТипЗнч(СтруктураОтвета) = Тип("Структура") И СтруктураОтвета.Свойство("poaId"),
			СтруктураОтвета.poaId, "");
		Результат.ИННДоверителя = ?(ТипЗнч(СтруктураОтвета) = Тип("Структура") И СтруктураОтвета.Свойство("issuerInn"),
			СтруктураОтвета.issuerInn, "");
	Исключение
		ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
		ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
		ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
		ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
		ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
		ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, ПредставлениеОшибки);
		ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
		ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP;
		ПараметрыОшибкиМЧДРР.СтруктураОтвета = СтруктураОтвета;
		ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
		Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
		
		Возврат Результат;
	КонецПопытки;
	
	Если НЕ ЗначениеЗаполнено(Результат.ИдентификаторТранзакции) Тогда
		ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
		ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
		ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
		ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
		ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
		ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки,
			 НСтр("ru='Распределенный реестр ФНС России не предоставил идентификационные данные.'"));
		ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
		ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP;
		ПараметрыОшибкиМЧДРР.СтруктураОтвета = СтруктураОтвета;
		ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
		Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
		
		Возврат Результат;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

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

		ТокенДоступа = РезультатАвторизации.ТокенДоступа;
	КонецЕсли;
	
		РесурсНаСервере = СвойстваСервераМЧДРР.РесурсКорняAPI + ?(СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI,
		"/transactions?txId=" + ИдентификаторТранзакции,
		"/poar-webapp/integration/poa/" + ИдентификаторТранзакции + "/status");
	
	ЗаголовкиHTTP = Новый Соответствие();
	ЗаголовкиHTTP.Вставить("Proxy-Connection", "Keep-Alive");
	ЗаголовкиHTTP.Вставить("Pragma", "no-cache");
	Если СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI И ИспользуетсяРежимТестирования() Тогда
		ЗаголовкиHTTP.Вставить("poaservertype", СвойстваСервераМЧДРР.ТестовыйСервер);
	КонецЕсли;
	ЗаголовкиHTTP.Вставить(?(СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI, "authorizationtoken", "authorization"),
		"Bearer " + ТокенДоступа);
	
	ЗапросHTTP = Новый HTTPЗапрос(РесурсНаСервере, ЗаголовкиHTTP);
	
	ОтветHTTP = Неопределено;
	
	Попытка
		СоединениеHTTP = СоединениеССерверомИнтернета(
			СвойстваСервераМЧДРР.АдресСервераБезАутентификации);
		
		ОтветHTTP = СоединениеHTTP.Получить(ЗапросHTTP);
	Исключение
		ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
		ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
		ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
		ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
		ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
		ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, ПредставлениеОшибки);
		ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
		ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP;
		ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
		Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
		Возврат Результат;
	КонецПопытки;
	
	Попытка
		Результат.ТекстОтвета = ОтветHTTP.ПолучитьТелоКакСтроку();
		СтруктураОтвета = ПолучитьСтруктуруОтвета(ОтветHTTP);
		СтатусТранзакции = ?(ТипЗнч(СтруктураОтвета) = Тип("Структура") И СтруктураОтвета.Свойство("status"),
			СтруктураОтвета.status, "");
			
		Результат.СтатусТранзакции = СтатусТранзакцииПеречислением(СтатусТранзакции);
		Результат.ИдентификаторТранзакции = ?(ТипЗнч(СтруктураОтвета) = Тип("Структура") И СтруктураОтвета.Свойство("txId"),
			СтруктураОтвета.txId, "");
		Результат.ДатаВремяТранзакции = ?(ТипЗнч(СтруктураОтвета) = Тип("Структура") И СтруктураОтвета.Свойство("timestamp"),
			ДатаИзСтрокиРазныхФорматов(СтруктураОтвета.timestamp), Дата(1,1,1));
	Исключение
		ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
		ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
		ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
		ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
		ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
		ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, ПредставлениеОшибки);
		ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
		ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP;
		ПараметрыОшибкиМЧДРР.СтруктураОтвета = СтруктураОтвета;
		ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
		Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
		Возврат Результат;
	КонецПопытки;
	
	Если НЕ ЗначениеЗаполнено(Результат.ИдентификаторТранзакции) Тогда
		Результат.СтатусТранзакции = Перечисления.СтатусыМЧД.ПустаяСсылка();
		ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
		ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
		ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
		ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
		ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
		ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, 
			НСтр("ru='Распределенный реестр ФНС России не вернул данные о статусе транзакции.'"));
		ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
		ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP;
		ПараметрыОшибкиМЧДРР.СтруктураОтвета = СтруктураОтвета;
		ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
		Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
		Возврат Результат;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция ХронологическиеДанныеДоверенностиМЧДРР(Доверенность, ТокенДоступа = "", ЦельПолучения = "") Экспорт
	
	СвойстваСервераМЧДРР = СвойстваСервераМЧДРР();
	
	Результат = Новый Структура;
	Результат.Вставить("АдресСервера", СвойстваСервераМЧДРР.АдресСервераБезАутентификации);
	Результат.Вставить("Ошибка");
	Результат.Вставить("ХронологическиеДанные");
	
	ЗаголовокОшибки = ?(ЦельПолучения = "", НСтр("ru='Не удалось получить хронологические данные доверенности'"), ЦельПолучения);
	
	Если Не ЗначениеЗаполнено(ТокенДоступа) Тогда
		РезультатАвторизации = АвторизоватьсяНаСервереМЧДРР(ЗаголовокОшибки);
		Если РезультатАвторизации.Ошибка <> Неопределено Тогда
			Результат.Ошибка = РезультатАвторизации.Ошибка;
		КонецЕсли;
		
		Если Результат.Ошибка <> Неопределено Тогда
			Возврат Результат;
		КонецЕсли;
		
		ТокенДоступа = РезультатАвторизации.ТокенДоступа;
	КонецЕсли;
	
	ИННДоверителя = "";
	ИННПредставителя = "";
	НомерДоверенности = "";
	
	Если ТипЗнч(Доверенность) = Тип("Структура") Тогда
		ИННДоверителя = Доверенность.ИННДоверителя;
		ИННПредставителя = Доверенность.ИННПредставителя;
		НомерДоверенности = Доверенность.НомерДоверенности;
	Иначе
		Запрос = Новый Запрос;
		Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
		|	МашиночитаемыеДоверенностиПредставителиИДоверители.ИНН,
		|	МашиночитаемыеДоверенностиПредставителиИДоверители.ИННФЛ
		|ПОМЕСТИТЬ Представитель
		|ИЗ
		|	РегистрСведений.МашиночитаемыеДоверенностиПредставителиИДоверители КАК
		|		МашиночитаемыеДоверенностиПредставителиИДоверители
		|ГДЕ
		|	МашиночитаемыеДоверенностиПредставителиИДоверители.МашиночитаемаяДоверенность = &МашиночитаемаяДоверенность
		|	И
		|		МашиночитаемыеДоверенностиПредставителиИДоверители.ТипУчастника = ЗНАЧЕНИЕ(Перечисление.ТипыУчастниковМЧД.Представитель)
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ ПЕРВЫЕ 1
		|	МашиночитаемыеДоверенностиПредставителиИДоверители.ИНН,
		|	МашиночитаемыеДоверенностиПредставителиИДоверители.ИННФЛ
		|ПОМЕСТИТЬ Доверитель
		|ИЗ
		|	РегистрСведений.МашиночитаемыеДоверенностиПредставителиИДоверители КАК
		|		МашиночитаемыеДоверенностиПредставителиИДоверители
		|ГДЕ
		|	МашиночитаемыеДоверенностиПредставителиИДоверители.МашиночитаемаяДоверенность = &МашиночитаемаяДоверенность
		|	И
		|		МашиночитаемыеДоверенностиПредставителиИДоверители.ТипУчастника = ЗНАЧЕНИЕ(Перечисление.ТипыУчастниковМЧД.Доверитель)
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	МашиночитаемыеДоверенности.НомерДоверенности
		|ПОМЕСТИТЬ МашиночитаемаяДоверенность
		|ИЗ
		|	Справочник.МашиночитаемыеДоверенности КАК МашиночитаемыеДоверенности
		|ГДЕ
		|	МашиночитаемыеДоверенности.Ссылка = &МашиночитаемаяДоверенность
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	Доверитель.ИНН КАК ДоверительИНН,
		|	Доверитель.ИННФЛ КАК ДоверительИННФЛ,
		|	Представитель.ИНН КАК ПредставительИНН,
		|	Представитель.ИННФЛ КАК ПредставительИННФЛ,
		|	МашиночитаемаяДоверенность.НомерДоверенности КАК НомерДоверенности
		|ИЗ
		|	Доверитель КАК Доверитель,
		|	Представитель КАК Представитель,
		|	МашиночитаемаяДоверенность КАК МашиночитаемаяДоверенность";
		
		Запрос.УстановитьПараметр("МашиночитаемаяДоверенность", Доверенность);
		РезультатЗапроса = Запрос.Выполнить();
		Если РезультатЗапроса.Пустой() Тогда
			Возврат Результат;
		КонецЕсли;
		
		Выборка = РезультатЗапроса.Выбрать();
		Выборка.Следующий();
		ИННДоверителя = ?(ЗначениеЗаполнено(Выборка.ДоверительИНН), Выборка.ДоверительИНН, Выборка.ДоверительИННФЛ);
		ИННПредставителя = ?(ЗначениеЗаполнено(Выборка.ПредставительИНН), Выборка.ПредставительИНН, Выборка.ПредставительИННФЛ);
		НомерДоверенности = Выборка.НомерДоверенности;
	КонецЕсли;
	
	РесурсНаСервере = СвойстваСервераМЧДРР.РесурсКорняAPI + ?(СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI,
		"/poachron?poaNumber=" + НомерДоверенности + "&issuerInn=" + ИННДоверителя + "&representativeInn="
		+ ИННПредставителя, "/poar-webapp/integration/poa/chronology?poaNumber=" + НомерДоверенности + "&issuerInn="
		+ ИННДоверителя + "&representativeInn=" + ИННПредставителя);
	
	ЗаголовкиHTTP = Новый Соответствие;
	ЗаголовкиHTTP.Вставить("Proxy-Connection", "Keep-Alive");
	ЗаголовкиHTTP.Вставить("Pragma", "no-cache");
	Если СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI И ИспользуетсяРежимТестирования() Тогда
		ЗаголовкиHTTP.Вставить("poaservertype", СвойстваСервераМЧДРР.ТестовыйСервер);
	КонецЕсли;
	ЗаголовкиHTTP.Вставить(?(СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI, "authorizationtoken", "authorization"),
		"Bearer " + ТокенДоступа);

	ЗапросHTTP = Новый HTTPЗапрос(РесурсНаСервере, ЗаголовкиHTTP);

	ОтветHTTP = Неопределено;

	Попытка
		СоединениеHTTP = СоединениеССерверомИнтернета(
			СвойстваСервераМЧДРР.АдресСервераБезАутентификации);

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

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

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

		ХронологическиеДанные.ДатаВремяЗапроса = ?(СтруктураОтвета.Свойство("chronologyDateTime") И ЗначениеЗаполнено(
			СтруктураОтвета.chronologyDateTime), ДатаИзСтрокиРазныхФорматов(СтруктураОтвета.chronologyDateTime),
			Неопределено);
		ХронологическиеДанные.НомерДоверенности = ?(СтруктураОтвета.Свойство("number"), СтруктураОтвета.number, "");
		ХронологическиеДанные.ВерсияФормата = ?(СтруктураОтвета.Свойство("formatVersion"),
			СтруктураОтвета.formatVersion, "");

		УзелСоздателя = ?(СтруктураОтвета.Свойство("creator") И ТипЗнч(СтруктураОтвета.creator) = Тип("Структура"),
			СтруктураОтвета.creator, Неопределено);
		ХронологическиеДанные.ИдентификаторУзлаСоздателя = ?(УзелСоздателя <> Неопределено И УзелСоздателя.Свойство(
			"id"), Строка(УзелСоздателя.id), "");
		ХронологическиеДанные.НаименованиеУзлаСоздателя = ?(УзелСоздателя <> Неопределено И УзелСоздателя.Свойство(
			"name"), Строка(УзелСоздателя.name), "");
		ХронологическиеДанные.АдресУзлаСоздателя = ?(УзелСоздателя <> Неопределено И УзелСоздателя.Свойство("address"),
			Строка(УзелСоздателя.address), "");

		ТекущийСтатус = ?(СтруктураОтвета.Свойство("actualStatus") И ТипЗнч(СтруктураОтвета.actualStatus) = Тип(
			"Структура"), СтруктураОтвета.actualStatus, Неопределено);
		ХронологическиеДанные.КодТекущегоСтатуса = ?(ТекущийСтатус <> Неопределено И ТекущийСтатус.Свойство("code"),
			Строка(ТекущийСтатус.code), "");
		ХронологическиеДанные.ДатаВремяСменыТекущегоСтатуса = ?(ТекущийСтатус <> Неопределено И ТекущийСтатус.Свойство(
			"dateTime") И ЗначениеЗаполнено(ТекущийСтатус.dateTime), ДатаИзСтрокиРазныхФорматов(
			ТекущийСтатус.dateTime), Неопределено);
		ХронологическиеДанные.ИдентификаторТранзакцииТекущегоСтатуса = ?(ТекущийСтатус <> Неопределено
			И ТекущийСтатус.Свойство("txId"), Строка(ТекущийСтатус.txId), "");
		ХронологическиеДанные.ОписаниеТекущегоСтатуса = ?(ТекущийСтатус <> Неопределено И ТекущийСтатус.Свойство(
			"description"), Строка(ТекущийСтатус.description), "");

		ИсторияСтатусов = ?(ТипЗнч(СтруктураОтвета.statusHistory) = Тип("Массив"), СтруктураОтвета.statusHistory,
			Новый Массив);
		Для Каждого ЗаписьИсторииСтатусов Из ИсторияСтатусов Цикл

			Если ТипЗнч(ЗаписьИсторииСтатусов) <> Тип("Структура") Тогда
				Продолжить;
			КонецЕсли;

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

			СведенияОСтатусе.КодСтатуса = ?(ЗаписьИсторииСтатусов.Свойство("code"), Строка(ЗаписьИсторииСтатусов.code),
				"");
			СведенияОСтатусе.ДатаВремяСменыСтатуса = ?(ЗаписьИсторииСтатусов.Свойство("dateTime") И ЗначениеЗаполнено(
				ЗаписьИсторииСтатусов.dateTime), ДатаИзСтрокиРазныхФорматов(ЗаписьИсторииСтатусов.dateTime),
				Неопределено);
			СведенияОСтатусе.ИдентификаторТранзакцииСтатуса = ?(ЗаписьИсторииСтатусов.Свойство("txId"), Строка(
				ЗаписьИсторииСтатусов.txId), "");
			СведенияОСтатусе.ОписаниеСтатуса = ?(ЗаписьИсторииСтатусов.Свойство("description"), Строка(
				ЗаписьИсторииСтатусов.description), "");

			ХронологическиеДанные.ИсторияСтатусов.Добавить(СведенияОСтатусе);
		КонецЦикла;

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

			СведенияОСобытии.ИдентификаторТранзакцииСобытия = ?(ЗаписьИсторииСобытий.Свойство("id"), Строка(
				ЗаписьИсторииСобытий.id), "");
			СведенияОСобытии.ТипСобытия = ?(ЗаписьИсторииСобытий.Свойство("type"), Строка(ЗаписьИсторииСобытий.type),
				"");
			СведенияОСобытии.ОписаниеСобытия = ?(ЗаписьИсторииСобытий.Свойство("description"), Строка(
				ЗаписьИсторииСобытий.description), "");

			ТранзакцияИздателя = ?(ЗаписьИсторииСобытий.Свойство("tx") И ТипЗнч(ЗаписьИсторииСобытий.tx) = Тип(
				"Структура"), ЗаписьИсторииСобытий.tx, Неопределено);
			СведенияОСобытии.ИдентификаторТранзакцииИздателя = ?(ТранзакцияИздателя <> Неопределено
				И ТранзакцияИздателя.Свойство("id"), Строка(ТранзакцияИздателя.id), "");
			СведенияОСобытии.ДатаВремяИзданияТранзакции = ?(ТранзакцияИздателя <> Неопределено
				И ТранзакцияИздателя.Свойство("timestamp") И ЗначениеЗаполнено(ТранзакцияИздателя.timestamp),
				ДатаИзСтрокиРазныхФорматов(ТранзакцияИздателя.timestamp), Неопределено);

			УзелИздательТранзакции = ?(ТранзакцияИздателя <> Неопределено И ТранзакцияИздателя.Свойство("sender")
				И ТипЗнч(ТранзакцияИздателя.sender) = Тип("Структура"), ТранзакцияИздателя.sender, Неопределено);
			СведенияОСобытии.ИдентификаторУзлаИздателяТранзакции = ?(УзелИздательТранзакции <> Неопределено
				И УзелИздательТранзакции.Свойство("id"), Строка(УзелИздательТранзакции.id), "");
			СведенияОСобытии.НаименованиеУзлаИздателяТранзакции = ?(УзелИздательТранзакции <> Неопределено
				И УзелИздательТранзакции.Свойство("name"), Строка(УзелИздательТранзакции.name), "");
			СведенияОСобытии.АдресУзлаИздателяТранзакции = ?(УзелИздательТранзакции <> Неопределено
				И УзелИздательТранзакции.Свойство("address"), Строка(УзелИздательТранзакции.address), "");

			ПричинаОтказаВПриемеМЧД = ?(ЗаписьИсторииСобытий.Свойство("details"), Строка(
				ЗаписьИсторииСобытий.details), "");
			Если ЗначениеЗаполнено(ПричинаОтказаВПриемеМЧД) Тогда
				ХронологическиеДанные.ПричиныОтказаВПриемеМЧД.Добавить(ПричинаОтказаВПриемеМЧД);
			КонецЕсли;
			
			Атрибуты = ?(ЗаписьИсторииСобытий.Свойство("attributes") И ТипЗнч(ЗаписьИсторииСобытий.attributes)
				= Тип("Массив"), ЗаписьИсторииСобытий.attributes, Новый Массив);
			СведенияОСобытии.Атрибуты = Атрибуты;
			
			Если ВРег(СведенияОСобытии.ТипСобытия) = "POA_IRD_REJECTED" Тогда
				Для Каждого Атрибут Из Атрибуты Цикл
					Если ТипЗнч(Атрибут) <> Тип("Структура") Или Не Атрибут.Свойство("code") Или ВРег(Атрибут.code)
						<> "IRD_ERRORS" Тогда
						Продолжить;
					КонецЕсли;
					ОписаниеАтрибута = Новый Структура("Код, Описание, Значение");
					ОписаниеАтрибута.Код = Атрибут.code;
					ОписаниеАтрибута.Описание = ?(Атрибут.Свойство("description"), Атрибут.description, "");
					ОписаниеАтрибута.Значение = ?(Атрибут.Свойство("value"), Атрибут.value, "");
					Если ОписаниеАтрибута.Значение.Свойство("type") Тогда 
						Если ОписаниеАтрибута.Значение.type = "VALUES_GROUPS" Тогда
							ПричиныОтказаВПриемеМЧД = ОписаниеАтрибута.Значение.content;
						Иначе
							ПричиныОтказаВПриемеМЧД = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ОписаниеАтрибута.Значение.content);
						КонецЕсли;
					Иначе
						Продолжить;
					КонецЕсли;
					
					СтруктураОшибки = Новый Структура("Код, Наименование, Описание", "", "", "");
					Для Каждого Причина Из ПричиныОтказаВПриемеМЧД Цикл
						
						Для Каждого ЭлементПричины Из Причина Цикл
							Если Не ТипЗнч(ЭлементПричины) = Тип("Структура")
								Или Не ЭлементПричины.Свойство("code") Или Не ЭлементПричины.Свойство("value") Тогда
								Продолжить;
							КонецЕсли;
							
							Если ЭлементПричины.code = "DICTIONARY_CODE" Тогда
								СтруктураОшибки.Код = ЭлементПричины.value;
								Продолжить;
							КонецЕсли;
							Если ЭлементПричины.code = "IRD_KOFO_NAME" Тогда
								СтруктураОшибки.Наименование = ЭлементПричины.value;
								Продолжить;
							КонецЕсли;
							Если ЭлементПричины.code = "IRD_ERROR_NAME" Тогда
								СтруктураОшибки.Описание = ЭлементПричины.value;
								Продолжить;
							КонецЕсли;
						КонецЦикла;
						
						Если ЗначениеЗаполнено(СтруктураОшибки.Код) Или ЗначениеЗаполнено(СтруктураОшибки.Описание) Тогда
							ПричинаОтказаВПриемеМЧД = СтрШаблон("%1 (%2)", СтруктураОшибки.Описание, СтруктураОшибки.Код);
							ХронологическиеДанные.ПричиныОтказаВПриемеМЧД.Добавить(ПричинаОтказаВПриемеМЧД);
						КонецЕсли;
						
					КонецЦикла;
					
				КонецЦикла;
			КонецЕсли;
			
			ХронологическиеДанные.ИсторияСобытий.Добавить(СведенияОСобытии);
		КонецЦикла;

		Результат.ХронологическиеДанные = ХронологическиеДанные;
	КонецЕсли;

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

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

Функция ЧастичныеДанныеДоверенностиМЧДРР(НомерДоверенности, ТокенДоступа = "", ЦельПолучения = "") Экспорт
	
	СвойстваСервераМЧДРР = СвойстваСервераМЧДРР();
	
	Результат = Новый Структура;
	Результат.Вставить("АдресСервера", 			СвойстваСервераМЧДРР.АдресСервераБезАутентификации);
	Результат.Вставить("СтатусДоверенности", 	"");
	Результат.Вставить("ХешДоверенности", 		"");
	Результат.Вставить("НомерДоверенности", 	"");
	Результат.Вставить("ДатаВыдачи", 			Неопределено);
	Результат.Вставить("ДатаОкончания", 		Неопределено);
	Результат.Вставить("ДатаРегистрации", 		Неопределено);
	Результат.Вставить("ДатаИзмененияСтатуса", 	Неопределено);
	Результат.Вставить("ПубличныйКлюч", 		"");
	Результат.Вставить("ТекстОтвета", 			"");
	Результат.Вставить("Ошибка");
	
	ЗаголовокОшибки = ?(ЦельПолучения = "", НСтр("ru='Не удалось получить частичные данные доверенности'"), ЦельПолучения);
	
	Если Не ЗначениеЗаполнено(ТокенДоступа) Тогда
		РезультатАвторизации = АвторизоватьсяНаСервереМЧДРР(ЗаголовокОшибки);
		Если РезультатАвторизации.Ошибка <> Неопределено Тогда
			Результат.Ошибка = РезультатАвторизации.Ошибка;
		КонецЕсли;
		
		Если Результат.Ошибка <> Неопределено Тогда
			Возврат Результат;
		КонецЕсли;
		
		ТокенДоступа = РезультатАвторизации.ТокенДоступа;
	КонецЕсли;
	
	РесурсНаСервере = СвойстваСервераМЧДРР.РесурсКорняAPI + ?(СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI,
	"/poaopen?poaNumber=" + НомерДоверенности, "/poar-webapp/integration/poa/" + НомерДоверенности + "/public");
	
	ЗаголовкиHTTP = Новый Соответствие();
	ЗаголовкиHTTP.Вставить("Proxy-Connection", "Keep-Alive");
	ЗаголовкиHTTP.Вставить("Pragma", "no-cache");
	Если СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI И ИспользуетсяРежимТестирования() Тогда
		ЗаголовкиHTTP.Вставить("poaservertype", СвойстваСервераМЧДРР.ТестовыйСервер);
	КонецЕсли;
	ЗаголовкиHTTP.Вставить(?(СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI, "authorizationtoken", "authorization"),
	"Bearer " + ТокенДоступа);
	
	ЗапросHTTP = Новый HTTPЗапрос(РесурсНаСервере, ЗаголовкиHTTP);
	
	ОтветHTTP = Неопределено;
	
	Попытка
		СоединениеHTTP = СоединениеССерверомИнтернета(
		СвойстваСервераМЧДРР.АдресСервераБезАутентификации);
		
		ОтветHTTP = СоединениеHTTP.Получить(ЗапросHTTP);
	Исключение
		ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
		ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
		ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
		ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
		ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
		ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, ПредставлениеОшибки);
		ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
		ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP; 
		ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
		ПараметрыОшибкиМЧДРР.ПараметрыТекстаОшибки.Вставить("НомерДоверенности", НомерДоверенности);
		Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
		Возврат Результат;
	КонецПопытки;
	
	Попытка
		СтруктураОтвета = ПолучитьСтруктуруОтвета(ОтветHTTP);
		
		Результат.СтатусДоверенности = ?(ТипЗнч(СтруктураОтвета) = Тип("Структура") И СтруктураОтвета.Свойство("status"),
		СтруктураОтвета.status, "");
		Результат.ХешДоверенности = ?(ТипЗнч(СтруктураОтвета) = Тип("Структура") И СтруктураОтвета.Свойство("id"),
		СтруктураОтвета.id, "");
		Результат.НомерДоверенности = ?(ТипЗнч(СтруктураОтвета) = Тип("Структура") И СтруктураОтвета.Свойство("poaNumber"),
		СтруктураОтвета.poaNumber, "");
		Результат.ДатаВыдачи = ?(ТипЗнч(СтруктураОтвета) = Тип("Структура") И СтруктураОтвета.Свойство("startDate"),
		ДатаИзСтрокиРазныхФорматов(СтруктураОтвета.startDate), Неопределено);
		Результат.ДатаОкончания = ?(ТипЗнч(СтруктураОтвета) = Тип("Структура") И СтруктураОтвета.Свойство("endDate"),
		ДатаИзСтрокиРазныхФорматов(СтруктураОтвета.endDate), Неопределено);
		Результат.ДатаРегистрации = ?(ТипЗнч(СтруктураОтвета) = Тип("Структура") И СтруктураОтвета.Свойство("createdDate"),
		ДатаИзСтрокиРазныхФорматов(СтруктураОтвета.createdDate), Неопределено);
		Результат.ДатаИзмененияСтатуса = ?(ТипЗнч(СтруктураОтвета) = Тип("Структура") И СтруктураОтвета.Свойство("statusDate"),
		ДатаИзСтрокиРазныхФорматов(СтруктураОтвета.statusDate), Неопределено);
		Результат.ПубличныйКлюч = ?(ТипЗнч(СтруктураОтвета) = Тип("Структура") И СтруктураОтвета.Свойство("issuerPublicKey"),
		СтруктураОтвета.issuerPublicKey, "");
		Если ИспользуетсяРежимТестирования() Тогда
			ПараметрыМЧДФНС = ХранилищеОбщихНастроек.Загрузить("ДокументооборотСКонтролирующимиОрганами_ПараметрыМЧДФНС");
			Если ПараметрыМЧДФНС <> Неопределено Тогда
				ПараметрыДоверенности = ПараметрыМЧДФНС[Результат.НомерДоверенности];
				Если ПараметрыДоверенности <> Неопределено И ПараметрыДоверенности.Свойство("ВозвращаемыйСтатус") Тогда
					Результат.СтатусДоверенности = ПараметрыДоверенности.ВозвращаемыйСтатус;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	Исключение
		ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
		ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
		ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
		ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
		ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
		ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, ПредставлениеОшибки);
		ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
		ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP; 
		ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
		ПараметрыОшибкиМЧДРР.ПараметрыТекстаОшибки.Вставить("НомерДоверенности", НомерДоверенности);
		Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
		Возврат Результат;
	КонецПопытки;
	
	Если НЕ ЗначениеЗаполнено(Результат.ХешДоверенности) И НЕ ЗначениеЗаполнено(Результат.НомерДоверенности) Тогда
		Результат.СтатусДоверенности = "";
		ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
		ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
		ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
		ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
		ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
		ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, 
		НСтр("ru='Распределенный реестр ФНС России не предоставил частичных данных доверенности.'"));
		ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
		ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP;
		ПараметрыОшибкиМЧДРР.СтруктураОтвета = СтруктураОтвета;
		ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
		ПараметрыОшибкиМЧДРР.ПараметрыТекстаОшибки.Вставить("НомерДоверенности", НомерДоверенности);
		Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
		Возврат Результат;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция ПолныеДанныеДоверенностиМЧДРР(НомерДоверенности, ИННДоверителя, ИННПредставителя, ТокенДоступа = "", ЦельПолучения = "")
		
		СвойстваСервераМЧДРР = СвойстваСервераМЧДРР();
		
		Результат = Новый Структура;
		Результат.Вставить("АдресСервера", 					СвойстваСервераМЧДРР.АдресСервераБезАутентификации);
		Результат.Вставить("ДанныеВыгрузки", 				Неопределено);
		Результат.Вставить("ДанныеПодписи", 				Неопределено);
		Результат.Вставить("ДанныеЗаявленияНаОтзыв", 		Неопределено);
		Результат.Вставить("ДанныеПодписиЗаявленияНаОтзыв", Неопределено);
		Результат.Вставить("ДанныеАрхива", 					Неопределено);
		Результат.Вставить("СтатусПолучения", 				"");
		Результат.Вставить("ТекстОтвета", 					"");
		Результат.Вставить("Ошибка");
		
		ЗаголовокОшибки = ?(ЦельПолучения = "", НСтр("ru='Не удалось загрузить доверенность'"), ЦельПолучения);
		
		Если Не ЗначениеЗаполнено(ТокенДоступа) Тогда
			РезультатАвторизации = АвторизоватьсяНаСервереМЧДРР(ЗаголовокОшибки);
			Если РезультатАвторизации.Ошибка <> Неопределено Тогда
				Результат.Ошибка = РезультатАвторизации.Ошибка;
			КонецЕсли;
			
			Если Результат.Ошибка <> Неопределено Тогда
				Возврат Результат;
			КонецЕсли;
			
			ТокенДоступа = РезультатАвторизации.ТокенДоступа;
		КонецЕсли;
		
		Если СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI Тогда
			АдресРесурса = СвойстваСервераМЧДРР.РесурсКорняAPI + "/poazip";
			
			ПараметрыЗапроса = Новый Массив;
			ПараметрыЗапроса.Добавить("poaNumber=" + НомерДоверенности);
			
			Если ЗначениеЗаполнено(ИННДоверителя) Тогда
				ПараметрыЗапроса.Добавить("issuerInn=" + ИННДоверителя);
			КонецЕсли;
			
			Если ЗначениеЗаполнено(ИННПредставителя) Тогда 
				ПараметрыЗапроса.Добавить("representativeInn=" + ИННПредставителя);
			КонецЕсли;
			
			РесурсНаСервере = АдресРесурса + "?" + СтрСоединить(ПараметрыЗапроса, "&");
		Иначе
			АдресРесурса = СвойстваСервераМЧДРР.РесурсКорняAPI + "/poar-webapp/integration/poa/";
			
			ПараметрыЗапроса = Новый Массив;
			ПараметрыЗапроса.Добавить(НомерДоверенности);
			ПараметрыЗапроса.Добавить(ИННДоверителя);
			ПараметрыЗапроса.Добавить("/zip");
			
			РесурсНаСервере = АдресРесурса + СтрСоединить(ПараметрыЗапроса, "/");
		КонецЕсли;
		
		ЗаголовкиHTTP = Новый Соответствие();
		ЗаголовкиHTTP.Вставить("Proxy-Connection", "Keep-Alive");
	ЗаголовкиHTTP.Вставить("Pragma", "no-cache");
	Если СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI И ИспользуетсяРежимТестирования() Тогда
		ЗаголовкиHTTP.Вставить("poaservertype", СвойстваСервераМЧДРР.ТестовыйСервер);
	КонецЕсли;
	ЗаголовкиHTTP.Вставить(?(СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI, "authorizationtoken", "authorization"),
		"Bearer " + ТокенДоступа);
	
	ЗапросHTTP = Новый HTTPЗапрос(РесурсНаСервере, ЗаголовкиHTTP);
	
	ОтветHTTP = Неопределено;
	
	Попытка
		СоединениеHTTP = СоединениеССерверомИнтернета(СвойстваСервераМЧДРР.АдресСервераБезАутентификации);
		
		ОтветHTTP = СоединениеHTTP.Получить(ЗапросHTTP);
	Исключение
		ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
		ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
		ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
		ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
		ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
		ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, ПредставлениеОшибки);
		ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
		ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP;
		ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
		ПараметрыОшибкиМЧДРР.ПараметрыТекстаОшибки.Вставить("НомерДоверенности", НомерДоверенности);
		Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
		Возврат Результат;
	КонецПопытки;
	
	Заголовки = СтандартныеПодсистемыСервер.HTTPЗаголовкиВНижнийРегистр(ОтветHTTP.Заголовки);
	
	Если НРег(Заголовки["content-type"]) = "application/zip"
		ИЛИ НРег(Заголовки["content-type"]) = "multipart"
		ИЛИ НРег(Лев(Заголовки["content-disposition"], 10)) = "attachment" Тогда
		
		Попытка
			Результат.ДанныеАрхива = ОтветHTTP.ПолучитьТелоКакДвоичныеДанные();
		Исключение
			ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
			ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
			ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
			ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
			ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
			ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
			ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, ПредставлениеОшибки);
			ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
			ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP;
			ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
			ПараметрыОшибкиМЧДРР.ПараметрыТекстаОшибки.Вставить("НомерДоверенности", НомерДоверенности);
			Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
			Возврат Результат;
		КонецПопытки;
		
		Возврат Результат;
	КонецЕсли;
	
	Попытка
		Результат.ТекстОтвета = ОтветHTTP.ПолучитьТелоКакСтроку();
		СтруктураОтвета = ПолучитьСтруктуруОтвета(ОтветHTTP);
		
		Результат.СтатусПолучения = ?(ТипЗнч(СтруктураОтвета) = Тип("Структура") И СтруктураОтвета.Свойство("reqStatus"),
			СтруктураОтвета.reqStatus, "");
	Исключение
		ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
		ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
		ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
		ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
		ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
		ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, ПредставлениеОшибки);
		ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
		ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP;
		ПараметрыОшибкиМЧДРР.СтруктураОтвета = СтруктураОтвета;
		ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
		ПараметрыОшибкиМЧДРР.ПараметрыТекстаОшибки.Вставить("НомерДоверенности", НомерДоверенности);
		Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
		Возврат Результат;
	КонецПопытки;                        
	
	Если НЕ ЗначениеЗаполнено(Результат.СтатусПолучения) Тогда
		ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
		ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
		ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
		ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
		ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
		ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, 
			НСтр("ru='Распределенный реестр ФНС России не предоставил полных данных доверенности и не сообщил о статусе запроса данных.'"));
		ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
		ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP;
		ПараметрыОшибкиМЧДРР.СтруктураОтвета = СтруктураОтвета;
		ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
		ПараметрыОшибкиМЧДРР.ПараметрыТекстаОшибки.Вставить("НомерДоверенности", НомерДоверенности);
		Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
		Возврат Результат;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

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

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

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

	ДанныеВыгрузки = ?(ТипЗнч(ДанныеИлиАдресВыгрузки) = Тип("Строка")
		И ЭтоАдресВременногоХранилища(ДанныеИлиАдресВыгрузки), ПолучитьИзВременногоХранилища(ДанныеИлиАдресВыгрузки),
		ДанныеИлиАдресВыгрузки);
	ДанныеПодписи = ?(ТипЗнч(ДанныеИлиАдресПодписи) = Тип("Строка")
		И ЭтоАдресВременногоХранилища(ДанныеИлиАдресПодписи), ПолучитьИзВременногоХранилища(ДанныеИлиАдресПодписи),
		ДанныеИлиАдресПодписи);
	
	РесурсНаСервере = СвойстваСервераМЧДРР.РесурсКорняAPI + ?(СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI,
		"/poacancel", "/poar-webapp/integration/poa/revoke");
	
	ЗаголовкиHTTP = Новый Соответствие();
	ЗаголовкиHTTP.Вставить("Content-Type", "multipart/form-data; boundary=My1cV8bNdr");
	ЗаголовкиHTTP.Вставить("Proxy-Connection", "Keep-Alive");
	ЗаголовкиHTTP.Вставить("Pragma", "no-cache");
	Если СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI И ИспользуетсяРежимТестирования() Тогда
		ЗаголовкиHTTP.Вставить("poaservertype", СвойстваСервераМЧДРР.ТестовыйСервер);
	КонецЕсли;
	ЗаголовкиHTTP.Вставить(?(СвойстваСервераМЧДРР.ИспользоватьРасширенияAPI, "authorizationtoken", "authorization"),
		"Bearer " + ТокенДоступа);
	
	// Запись передаваемых данных
	МассивДвоичныхДанных = Новый Массив();
	
	ШаблонФайла = "--My1cV8bNdr
		|Content-Disposition: form-data; name=""poaRevoke""; filename=""%1""
		|Content-Type: text/xml
		|
		|";
	
	ШаблонФайла = СтрЗаменить(ШаблонФайла,  Символы.ПС, Символы.ВК + Символы.ПС);
	СодержимоеФайла = СтрШаблон(ШаблонФайла, ИмяФайлаВыгрузки);
	
	МассивДвоичныхДанных.Добавить(ПолучитьДвоичныеДанныеИзСтроки(СодержимоеФайла, "windows-1251"));	
	МассивДвоичныхДанных.Добавить(ДанныеВыгрузки);
	
	ШаблонФайла = "
		|--My1cV8bNdr
		|Content-Disposition: form-data; name=""signature""; filename=""%1""
		|Content-Type: application/octet-stream
		|
		|";
	
	ШаблонФайла = СтрЗаменить(ШаблонФайла,  Символы.ПС, Символы.ВК + Символы.ПС);
	СодержимоеФайла = СтрШаблон(ШаблонФайла, ИмяФайлаВыгрузки);
	
	МассивДвоичныхДанных.Добавить(ПолучитьДвоичныеДанныеИзСтроки(СодержимоеФайла, "windows-1251"));
	
	Подпись64 = Base64Строка(ДанныеПодписи);
	Подпись64 = СтрЗаменить(Подпись64, Символы.ВК, "");
	Подпись64 = СтрЗаменить(Подпись64, Символы.ПС, "");
	
	МассивДвоичныхДанных.Добавить(ПолучитьДвоичныеДанныеИзСтроки(Подпись64, "windows-1251"));
	
	ШаблонФайла = "
		|--My1cV8bNdr--";
	СодержимоеФайла = СтрЗаменить(ШаблонФайла,  Символы.ПС, Символы.ВК + Символы.ПС);
	
	МассивДвоичныхДанных.Добавить(ПолучитьДвоичныеДанныеИзСтроки(СодержимоеФайла, "windows-1251"));
	
	ПередаваемыеДанные = СоединитьДвоичныеДанные(МассивДвоичныхДанных);
	
	ЗапросHTTP = Новый HTTPЗапрос(РесурсНаСервере, ЗаголовкиHTTP);
	ЗапросHTTP.УстановитьТелоИзДвоичныхДанных(ПередаваемыеДанные);
	
	Попытка
		СоединениеHTTP = СоединениеССерверомИнтернета(
			СвойстваСервераМЧДРР.АдресСервераБезАутентификации);
		
		ОтветHTTP = СоединениеHTTP.ВызватьHTTPМетод("POST", ЗапросHTTP);
	Исключение
		ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
		ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
		ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
		ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
		ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
		ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, ПредставлениеОшибки);
		ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
		ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP;
		ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
		Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
		Возврат Результат;
	КонецПопытки;
	
	Попытка
		
		Результат.ТекстОтвета = ОтветHTTP.ПолучитьТелоКакСтроку();
		СтруктураОтвета	= ПолучитьСтруктуруОтвета(ОтветHTTP);
		
		Результат.ИдентификаторТранзакции = ?(ТипЗнч(СтруктураОтвета) = Тип("Структура") И СтруктураОтвета.Свойство("txId"),
			СтруктураОтвета.txId, "");
	Исключение
		ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
		ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
		ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
		ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
		ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
		ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, ПредставлениеОшибки);
		ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
		ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP;
		ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
		Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
		
		Возврат Результат;
	КонецПопытки;
	
	Если НЕ ЗначениеЗаполнено(Результат.ИдентификаторТранзакции) Тогда
		ПредставлениеОшибки = НСтр("ru='Сервер МЧД не вернул номер транзакции отмены'");
		ПараметрыФайловДляРасследования = ПараметрыФайловДляРасследования();
		ПараметрыФайловДляРасследования.Запрос = ЗапросHTTP;
		ПараметрыФайловДляРасследования.Ответ = ОтветHTTP;
		ПараметрыФайловДляРасследования.СоединениеHTTP = СоединениеHTTP;
		ДополнительныеФайлы = ФайлыДляРасследования(ПараметрыФайловДляРасследования);
		ПараметрыОшибкиМЧДРР = ПараметрыОшибкиМЧДРР(ЗаголовокОшибки, ПредставлениеОшибки);
		ПараметрыОшибкиМЧДРР.ЗапросHTTP = ЗапросHTTP;
		ПараметрыОшибкиМЧДРР.ОтветHTTP = ОтветHTTP;
		ПараметрыОшибкиМЧДРР.СтруктураОтвета = СтруктураОтвета;
		ПараметрыОшибкиМЧДРР.ДополнительныеФайлы = ДополнительныеФайлы;
		Результат.Ошибка = ПолучитьИЗаписатьОшибкуМЧДРР(ПараметрыОшибкиМЧДРР);
		Возврат Результат;
	КонецЕсли;    
	
	УстановитьСтатусРегистрации(Доверенность, Результат.ИдентификаторТранзакции, Истина);
	
	Возврат Результат;
	
КонецФункции

Функция ФайлОтменыДоверенности(Доверенность, ПричинаОтмены) Экспорт
	
	ФайлДоверенности = Доверенность.ФайлДоверенности;
	НомерДоверенности = Доверенность.НомерДоверенности;

	ДанныеФайла = РаботаСФайлами.ДанныеФайла(ФайлДоверенности);
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла);
	ДоверенностьXML = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные);

	ДанныеДоверенности = Справочники.МашиночитаемыеДоверенности.ДоверенностьXDTO(ДоверенностьXML);
	Если ДанныеДоверенности = Неопределено Тогда
		ВызватьИсключение НСтр("ru = 'Не удалось распознать двоичные данные доверенности'");
	КонецЕсли;
	
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку("windows-1251");
	ЗаписьXML.ЗаписатьОбъявлениеXML();
	
	ЗаписьXML.ЗаписатьНачалоЭлемента("Файл");
	ЗаписьXML.ЗаписатьАтрибут("ВерсФорм", "001");
	ЗаписьXML.ЗаписатьНачалоЭлемента("Документ");

	ЗаписьXML.ЗаписатьНачалоЭлемента("СвЗаяв");
	ЗаписьXML.ЗаписатьАтрибут("НомДовер", НомерДоверенности);
	ЗаписьXML.ЗаписатьАтрибут("ПричОтз", ПричинаОтмены);
	ЗаписьXML.ЗаписатьКонецЭлемента();
	
	ЗаписьXML.ЗаписатьНачалоЭлемента("СвЗаявит");
	ЗаписьXML.ЗаписатьНачалоЭлемента("СвДоверит");
	
	Если ДанныеДоверенности.Документ.Довер <> Неопределено Тогда
		Если ДанныеДоверенности.Документ.Довер.СвДоверит[0].ТипДоверит = "1" Тогда
			
			СведенияОДоверителе =
			ДанныеДоверенности.Документ.Довер.СвДоверит[0].Доверит.РосОргДовер.СвРосОрг;
			
			ЗаписьXML.ЗаписатьНачалоЭлемента("РосОргДовер");
			ЗаписьXML.ЗаписатьАтрибут("НаимОрг", СведенияОДоверителе.НаимОрг);
			ЗаписьXML.ЗаписатьАтрибут("ИННЮЛ", СведенияОДоверителе.ИННЮЛ);
			ЗаписьXML.ЗаписатьАтрибут("КПП", СведенияОДоверителе.КПП);
			ЗаписьXML.ЗаписатьАтрибут("ОГРН", СведенияОДоверителе.ОГРН);
			ЗаписьXML.ЗаписатьКонецЭлемента();
			
		ИначеЕсли ДанныеДоверенности.Документ.Довер.СвДоверит[0].ТипДоверит = "3" Тогда
			
			СведенияОДоверителе =
			ДанныеДоверенности.Документ.Довер.СвДоверит[0].Доверит.ИПДовер;
			
			ЗаписьXML.ЗаписатьНачалоЭлемента("ИПДовер");
			
			Если ЗначениеЗаполнено(СведенияОДоверителе.НаимИП) Тогда
				ЗаписьXML.ЗаписатьАтрибут("НаимИП", СведенияОДоверителе.НаимИП);
			КонецЕсли;
			
			ЗаписьXML.ЗаписатьАтрибут("ИННФЛ", СведенияОДоверителе.ИННФЛ);
			ЗаписьXML.ЗаписатьАтрибут("ОГРНИП", СведенияОДоверителе.ОГРНИП);
			ЗаписьXML.ЗаписатьКонецЭлемента();
			
		Иначе
			
			Если ДанныеДоверенности.Документ.Довер.СвДоверит[0].ТипДоверит = "4" Тогда
				ТекстОшибки = НСтр("ru = 'Невозможно отозвать доверенность физического лица.'");
			Иначе
				ТекстОшибки = НСтр("ru = 'Невозможно отозвать доверенность иностранной организации.'");
			КонецЕсли;
			
			ВызватьИсключение ТекстОшибки;
			
		КонецЕсли;
		
	ИначеЕсли ДанныеДоверенности.Документ.Передов <> Неопределено Тогда
		
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Отзыв передоверия не реализован в данной версии приложения. Отзовите передоверие на сайте Распределенного реестра ФНС %1.'"), 
			"https://m4d.nalog.gov.ru/emchd");
		
	Иначе
		
		ВызватьИсключение НСтр("ru = 'Не удалось определить доверителя по файлу доверенности.'");

	КонецЕсли;

	ЗаписьXML.ЗаписатьКонецЭлемента();
	ЗаписьXML.ЗаписатьКонецЭлемента();
	
	ЗаписьXML.ЗаписатьКонецЭлемента();
	ЗаписьXML.ЗаписатьКонецЭлемента();
	
	
	Если Доверенность.ДляНалоговыхОрганов Тогда
		
		Префикс = "ON_OFFDOVER";
		ДатаФормирования = Формат(ТекущаяДатаСеанса(), "ДФ=yyyyMMdd;");
		ИдентификационныйНомер = Доверенность.НомерДоверенности;
		
		Получатель = XMLСтрока(Доверенность.КодНалоговогоОрганаПредставления);
		КонечныйПолучатель = Получатель;
		Если Доверенность.НалоговыеОрганыДействия.Количество() = 1 Тогда
			КонечныйПолучатель = XMLСтрока(Доверенность.НалоговыеОрганыДействия[0].КодНалоговогоОргана);
		КонецЕсли;
		
		ОписанияДоверителей = Доверенность.Доверители.НайтиСтроки(Новый Структура("ИдентификаторРодителя", 
			Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")));
		
		Отправитель = "";
		Для Каждого ОписаниеДоверителя Из ОписанияДоверителей Цикл
			РеквизитыДоверителя = ОписаниеДоверителя.ДоверительРеквизиты.Получить();
			Отправитель = XMLСтрока(РеквизитыДоверителя.ИНН);
			Если Не РеквизитыДоверителя.ЭтоИндивидуальныйПредприниматель И Не РеквизитыДоверителя.ЭтоФизическоеЛицо Тогда
				Отправитель = Отправитель + XMLСтрока(РеквизитыДоверителя.КПП);
			КонецЕсли;
			Прервать;
		КонецЦикла;

		
		ИмяФайла = СтрШаблон("%1_%2_%3_%4_%5_%6.xml", Префикс, Получатель, КонечныйПолучатель, Отправитель, ДатаФормирования, ИдентификационныйНомер);
	Иначе
		ИмяФайла = "revoke.xml";
	КонецЕсли;
	
	Результат = Новый Структура;
	Результат.Вставить("Содержимое", ПоместитьВоВременноеХранилище(ПолучитьДвоичныеДанныеИзСтроки(ЗаписьXML.Закрыть(), "windows-1251"), Новый УникальныйИдентификатор));
	Результат.Вставить("ИмяФайла", ИмяФайла);
	Результат.Вставить("НомерДоверенности", НомерДоверенности);
	Результат.Вставить("Доверенность", Доверенность);
	Возврат Результат; 
	
КонецФункции

Функция ИспользуетсяРежимТестирования()
	
	Возврат Ложь;
	
КонецФункции

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

Функция ВладелецТикета()

	Возврат "1C-Reporting";

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

Функция ПолучитьСтруктуруОтвета(ОтветHTTP)
	
	ТелоОтвета = ОтветHTTP.ПолучитьТелоКакСтроку();
	
	Заголовки = СтандартныеПодсистемыСервер.HTTPЗаголовкиВНижнийРегистр(ОтветHTTP.Заголовки);
	
	Если СтрНачинаетсяС(НРег(Заголовки["content-type"]), "text/html") Тогда
		ФорматированныйДокумент = Новый ФорматированныйДокумент;
		ФорматированныйДокумент.УстановитьHTML(ТелоОтвета, Новый Структура);
		ФорматированнаяСтрока = ФорматированныйДокумент.ПолучитьФорматированнуюСтроку();
		СтруктураОтвета = Новый Структура("title", ФорматированнаяСтрока);
	ИначеЕсли Не ЗначениеЗаполнено(ТелоОтвета) Или НРег(Заголовки["content-type"]) = "application/xml;charset=UTF-8" Тогда
		СтруктураОтвета = Новый Структура("title", ТелоОтвета);
	Иначе
		СтруктураОтвета = ОбщегоНазначения.JSONВЗначение(ТелоОтвета,,Ложь)
	КонецЕсли;
	
	Возврат СтруктураОтвета;
КонецФункции

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

Процедура УстановитьСтатусРегистрации(Доверенность, ИдентификаторТранзакции = Неопределено, ЭтоОтмена = Ложь) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);

	Блокировка = Новый БлокировкаДанных;
	ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.МашиночитаемыеДоверенностиСтатусы");
	ЭлементБлокировки.УстановитьЗначение("МашиночитаемаяДоверенность", Доверенность);

	НачатьТранзакцию();
	Попытка

		Блокировка.Заблокировать();

		НаборЗаписей = РегистрыСведений.МашиночитаемыеДоверенностиСтатусы.СоздатьНаборЗаписей();
		НаборЗаписей.Отбор.МашиночитаемаяДоверенность.Установить(Доверенность);
		НаборЗаписей.Прочитать();

		Если НаборЗаписей.Количество() > 0 Тогда
			ЗаписьСтатуса = НаборЗаписей[0];
		Иначе
			ЗаписьСтатуса = НаборЗаписей.Добавить();
		КонецЕсли;

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

		НаборЗаписей.Записать();

		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;
	
КонецПроцедуры

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

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

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