Документооборот с контролирующими органами / Диагностика 1С-отчетности / Модуль формы

файл
#Область ГлобальныеПеременные

&НаКлиенте
Перем НастройкиДиагностики, РезультатыДиагностики, ОсновнаяУчетнаяЗапись, КонтекстЭДОКлиент, РезультатыПодключенияКК;

&НаКлиенте
Перем КонтекстЭДО Экспорт;

&НаКлиенте
Перем АвтонастройкаПриСтарте, ОбщиеКлиентскиеМетоды;

&НаКлиенте
Перем АвтонастройкаПриСтартеПричина;

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

#Область ИзменениеФормы

&НаСервере
Процедура ОчиститьНадписи()
	
	ДобавитьНадпись("", 0,, Истина);
	ДобавитьНадпись("", 1,, Истина);
	ДобавитьНадпись("", 2,, Истина);
	
КонецПроцедуры

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

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

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

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

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

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

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

&НаСервере
Функция ВерсияВерстальщика()
	
	//1С:Предприятие 8.3 ()
	//8.3.8.1784
	//10.10.10.1784
	МножительСтаршей = 100000000; 	//1-99
	МножительМладшей = 1000000;		//1-99
	МножительСубверсии = 10000;		//1-99
	МножительБилда = 1; //1-9999
	Версия = 0;
	Инфо = Новый СистемнаяИнформация;
	Если Метаданные.РежимСовместимости = Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда 
		Массив = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Инфо.ВерсияПриложения, ".", Ложь, Истина);
		Версия = Массив[0] * МножительСтаршей + Массив[1] * МножительМладшей + Массив[2] * МножительСубверсии + Массив[3] * МножительБилда;		
	ИначеЕсли Метаданные.РежимСовместимости = Метаданные.СвойстваОбъектов.РежимСовместимости.Версия8_3_6 Тогда 
		Версия = 8 * МножительСтаршей + 3 * МножительМладшей + 6 * МножительСубверсии + 0 * МножительБилда;
	ИначеЕсли Метаданные.РежимСовместимости = Метаданные.СвойстваОбъектов.РежимСовместимости.Версия8_3_7 Тогда 
		Версия = 8 * МножительСтаршей + 3 * МножительМладшей + 7 * МножительСубверсии + 0 * МножительБилда;
	КонецЕсли;
	Возврат Версия;
	
КонецФункции
	
&НаСервере
Функция ДобавитьНадпись(Знач Какую, 
	Знач Куда = 0, 
	Знач Отступ = Ложь, 
	Знач Очистить = Ложь, 
	Ссылка1 = Неопределено, 
	Ссылка2 = Неопределено, 
	Ссылка3 = Неопределено, 
	Рекомендация = Ложь)
	
	Перем ИменаСсылок;
	
	ШаблонДляТекстаРУ = "ru = '%1'";
	СообщениеРУ = СтрЗаменить(ШаблонДляТекстаРУ, "%1", Какую);
	Какую = НСтр(СообщениеРУ);
	
	ВключитьПодсветкуВерстки = Ложь;
	
	БезОберток = Ложь;
	Если Куда = 0 Тогда 
		Группа = ЭтаФорма.Элементы.ГруппаОшибки;
	ИначеЕсли Куда = 1 Тогда 
		Группа = ЭтаФорма.Элементы.ГруппаПредупреждения;
	ИначеЕсли Куда = 2 Тогда 
		Группа = ЭтаФорма.Элементы.ГруппаИнформация;
	Иначе
		БезОберток = Истина;
		Группа = ЭтаФорма.Элементы.Найти(Куда);
		Если Группа = Неопределено Тогда 
			Возврат "";
		КонецЕсли;
	КонецЕсли;
	
	Если Очистить Тогда 
		Группа.ОтображатьЗаголовок = Истина;
		Пока Группа.ПодчиненныеЭлементы.Количество() > 0 Цикл 
			Для Каждого Подчиненный из Группа.ПодчиненныеЭлементы Цикл 
				Элементы.Удалить(Подчиненный);
			КонецЦикла;
		КонецЦикла;		
		Возврат "";
	КонецЕсли;
	
	Если Какую = "" Тогда 
		Возврат "";
	КонецЕсли;
	
	Ид = Формат(ТекущаяУниверсальнаяДатаВМиллисекундах(), "ЧДЦ=; ЧН=; ЧГ=") + Формат(ЭтаФорма.Элементы.Количество(), "ЧДЦ=; ЧН=; ЧГ=");
	
	Если БезОберток Тогда 
		
		Для Каждого Эл Из Группа.ПодчиненныеЭлементы Цикл //В группе ошибки или группе предупреждения в подгруппе одиночной ошибки или предупреждения
			Если Найти(Эл.Имя, "ДГруппаСодержимое") > 0 Тогда 
				Группа = Эл;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		
		Если Рекомендация Тогда 
			Кому = ЭтаФорма.Элементы.Добавить("ДНадписьРекомендация" + Ид, Тип("ДекорацияФормы"), Группа);
		Иначе
			Кому = ЭтаФорма.Элементы.Добавить("ДНадписьОписание" + Ид, Тип("ДекорацияФормы"), Группа);
		КонецЕсли;
		
		ПрименитьСтиль(Кому);
		
		Если ВключитьПодсветкуВерстки Тогда 
			Кому.Рамка = Новый Рамка(ТипРамкиЭлементаУправления.Одинарная, 1);
			Кому.ЦветРамки = Новый Цвет(100, 100, 255);
		КонецЕсли;
		
		Если Ссылка1 = Неопределено И Ссылка2 = Неопределено И Ссылка3 = Неопределено Тогда 
			ФорматированныйЗаголовок = Новый Массив;
			ФорматированныйЗаголовок.Добавить(Какую);
			Кому.Заголовок = Новый ФорматированнаяСтрока(ФорматированныйЗаголовок);
		Иначе 	
			Кому.УстановитьДействие("ОбработкаНавигационнойСсылки", "ДинамическийЭлементОбработкаНавигационнойСсылки");
			Кому.Заголовок = ПолучитьФорматированнуюСтрокуСоСсылками(Какую, Ссылка1, Ссылка2, Ссылка3, Кому.Имя, ИменаСсылок);
		КонецЕсли;
	
	Иначе
						
		Кому = ЭтаФорма.Элементы.Добавить("ДГруппаКонтейнер"+Ид, Тип("ГруппаФормы"), Группа);
		ПрименитьСтиль(Кому);
										
		КолВоВложенных = Группа.ПодчиненныеЭлементы.Количество();
		КолВоВложенных = Формат(КолВоВложенных, "ЧДЦ=; ЧН=; ЧГ=");
							
		ОтступСлева = ЭтаФорма.Элементы.Добавить("ДГруппаОтступСлева" + Ид, Тип("ГруппаФормы"), Кому); //В ДГруппаКонтейнер
		ПрименитьСтиль(ОтступСлева);
						
		ГруппаСодержимое = ЭтаФорма.Элементы.Добавить("ДГруппаСодержимое" + Ид, Тип("ГруппаФормы"), Кому);//В ДГруппаКонтейнер
		ПрименитьСтиль(ГруппаСодержимое);
		
		Если ВерсияВерстальщика() > 803060000 Тогда // > 8.3.6
			Если Группа.ПодчиненныеЭлементы.Количество() <> 1 Тогда 
				ДобавитьОтступ(ОтступСлева, Ид, "ДОтступВерхнийСлева", 3, ВключитьПодсветкуВерстки); //Отступ перед блоком ошибки
				ДобавитьОтступ(ГруппаСодержимое, Ид, "ДОтступВерхнийСправа", 3, ВключитьПодсветкуВерстки); //Отступ перед блоком ошибки
			КонецЕсли;
		КонецЕсли;
		
		МаркерЗаголовка = ЭтаФорма.Элементы.Добавить("ДНадписьЗаголовкаНомер" + Ид, Тип("ДекорацияФормы"), ОтступСлева);
		ПрименитьСтиль(МаркерЗаголовка);
		МаркерЗаголовка.Заголовок = КолВоВложенных + ".";
		
		ТекстЗаголовка = ЭтаФорма.Элементы.Добавить("ДНадписьЗаголовкаТекст" + Ид, Тип("ДекорацияФормы"), ГруппаСодержимое);
		ПрименитьСтиль(ТекстЗаголовка);
		ТекстЗаголовка.Заголовок  = ПолучитьФорматированнуюСтрокуСоСсылками(Какую, Ссылка1, Ссылка2, Ссылка3, ТекстЗаголовка.Имя, ИменаСсылок);
						
		Если Ссылка1 = Неопределено И Ссылка2 = Неопределено И Ссылка3 = Неопределено Тогда 
		Иначе
			ТекстЗаголовка.УстановитьДействие("ОбработкаНавигационнойСсылки", "ДинамическийЭлементОбработкаНавигационнойСсылки");
		КонецЕсли;
		
		Если ВключитьПодсветкуВерстки Тогда 
			МаркерЗаголовка.Рамка = Новый Рамка(ТипРамкиЭлементаУправления.Одинарная, 1);
			ТекстЗаголовка.Рамка = Новый Рамка(ТипРамкиЭлементаУправления.Одинарная, 1);
		КонецЕсли;
		
	КонецЕсли;

	Возврат Кому.Имя;
		
КонецФункции

&НаСервере
Процедура ЗаполнитьСводку(РезультатыДиагностики, ВсегоОшибок, ВсегоПредупреждений)
	
	Перем Ссылка1, Ссылка2, Ссылка3;
	
	//КонтекстМодуля = РеквизитФормыВЗначение("Объект");
	КонтекстМодуля = ДокументооборотСКО.ПолучитьОбработкуЭДО();
	МакетПодсказки = КонтекстМодуля.ПолучитьМакет("ДиагностикаОтчетности_Подсказки");
	
	ОрганизацияКлиент = РезультатыДиагностики.Параметры.Организация;
	УчетнаяЗаписьОбменаКлиент = РезультатыДиагностики.Параметры.УчетнаяЗаписьОбмена;
			
	ЧастьОтчета = РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ЗаявленияАбонента;
	Если ЧастьОтчета.Документы.Количество() > 0 Тогда 
		ВсегоПредупреждений = ВсегоПредупреждений + 1;
		
		СводкаТекст = НайтиОписаниеПоКоду("645_0", МакетПодсказки,,, 
						КонтекстМодуля.ПростоеСклонение(ЧастьОтчета.Документы.Количество(), "о", "ы", "ы"), 
						КонтекстМодуля.ПростоеСклонение(ЧастьОтчета.Документы.Количество(), "ое", "ые", "ых"), 
						КонтекстМодуля.ПростоеСклонение(ЧастьОтчета.Документы.Количество(), "е", "я", "й"));
						
		СсылкаГруппы = ДобавитьНадпись(СводкаТекст, 1);
		
		ТекстПроверок = "";
		ВсегоПроверок = 0;
		Если ЧастьОтчета.ЕстьРеквизиты Тогда 
			ВсегоПроверок = ВсегоПроверок + 1;
		КонецЕсли;		
		Если ЧастьОтчета.ЕстьЛицензия Тогда 
			ВсегоПроверок = ВсегоПроверок + 1;
		КонецЕсли;
		Если ЧастьОтчета.ЕстьСертификат Тогда 
			ВсегоПроверок = ВсегоПроверок + 1;
		КонецЕсли;
		Если ЧастьОтчета.ЕстьНаправления Тогда 
			ВсегоПроверок = ВсегоПроверок + 1;
		КонецЕсли;
		
		ТекущаяПроверка = 0;
		Если ЧастьОтчета.ЕстьРеквизиты Тогда 
			ТекущаяПроверка = ТекущаяПроверка + 1;
			ТекстПроверок = ТекстПроверок + ?(ТекстПроверок="", "", ?(ТекущаяПроверка = ВсегоПроверок, " или ", ", ")) + "реквизитов подключения";
		КонецЕсли;		
		Если ЧастьОтчета.ЕстьЛицензия Тогда 
			ТекущаяПроверка = ТекущаяПроверка + 1;
			ТекстПроверок = ТекстПроверок + ?(ТекстПроверок="", "", ?(ТекущаяПроверка = ВсегоПроверок, " или ", ", ")) + "срока действия лицензии 1С-Отчетности";
		КонецЕсли;
		Если ЧастьОтчета.ЕстьСертификат Тогда 
			ТекущаяПроверка = ТекущаяПроверка + 1;
			ТекстПроверок = ТекстПроверок + ?(ТекстПроверок="", "", ?(ТекущаяПроверка = ВсегоПроверок, " или ", ", ")) + "срока действия и атрибутов личного сертификата";
		КонецЕсли;
		Если ЧастьОтчета.ЕстьНаправления Тогда 
			ТекущаяПроверка = ТекущаяПроверка + 1;
			ТекстПроверок = ТекстПроверок + ?(ТекстПроверок="", "", ?(ТекущаяПроверка = ВсегоПроверок, " или ", ", ")) + "доверенностей из списка подключенных направлений";
		КонецЕсли;
		Если ТекстПроверок = "" Тогда //Не удалось идентифицировать назначение заявления
			ТекстПроверок = "прочих атрибутов подключения к 1С-Отчетности";
		КонецЕсли;
		
		ПояснениеТекст = НайтиОписаниеПоКоду("645_1", МакетПодсказки,,, ТекстПроверок + ".");
		ДобавитьНадпись(ПояснениеТекст, СсылкаГруппы);
		
		ПояснениеТекст = НайтиОписаниеПоКоду("645_5", МакетПодсказки, Ссылка1);
		ДобавитьНадпись(ПояснениеТекст, СсылкаГруппы,,, Ссылка1);
		
	КонецЕсли;
	
	ЧастьОтчета = РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи;
	
	Если ЧастьОтчета.СрокГодностиЧислом <> 0 Тогда 
		СрокГодностиСобытие = ЧастьОтчета.СрокГодностиСобытие;
		
		ТекстЛицензии = "Лицензия ""%1"", действительна с %2 по %3";
		ТекстЛицензии = СтрЗаменить(ТекстЛицензии, "%1", ЧастьОтчета.ЛицензияНаименование);
		ТекстЛицензии = СтрЗаменить(ТекстЛицензии, "%2", Формат(ЧастьОтчета.ЛицензияДатаНачала, "ДЛФ=DD"));
		ТекстЛицензии = СтрЗаменить(ТекстЛицензии, "%3", Формат(ЧастьОтчета.ЛицензияДатаОкончания, "ДЛФ=DD"));
		
		СводкаТекст = НайтиОписаниеПоКоду("768_0", МакетПодсказки);
		
		Если ЧастьОтчета.СрокГодностиЧислом = 1 Тогда //Заканчивается
			ВсегоПредупреждений = ВсегоПредупреждений + 1;
			
			СводкаТекст = СтрЗаменить(СводкаТекст, "%1", "заканчивается");
			СводкаТекст = СтрЗаменить(СводкаТекст, "%2", КонтекстМодуля.ИнтервалСтрокой(
															РезультатыДиагностики.Параметры.ДатаКлиента, 
															ЧастьОтчета.ЛицензияДатаОкончания));
			
			СсылкаГруппы = ДобавитьНадпись(СводкаТекст, 1);
			
			СводкаТекст = ТекстЛицензии;
			ДобавитьНадпись(СводкаТекст, СсылкаГруппы);
			
		ИначеЕсли ЧастьОтчета.СрокГодностиЧислом = 2 Тогда //Закончилась
			ВсегоОшибок = ВсегоОшибок + 1;
			
			СводкаТекст = СтрЗаменить(СводкаТекст, "%1", "закончился");
			СводкаТекст = СтрЗаменить(СводкаТекст, "%2", КонтекстМодуля.ИнтервалСтрокой(
															РезультатыДиагностики.Параметры.ДатаКлиента, 
															ЧастьОтчета.ЛицензияДатаОкончания));
			
			СсылкаГруппы = ДобавитьНадпись(СводкаТекст, 0);
			
			СводкаТекст = ТекстЛицензии;
			ДобавитьНадпись(СводкаТекст, СсылкаГруппы);
			
		ИначеЕсли ЧастьОтчета.СрокГодностиЧислом = 3 Тогда //Не началась
			ВсегоПредупреждений = ВсегоПредупреждений + 1;
			
			СводкаТекст = СтрЗаменить(СводкаТекст, "%1", "еще не начался.");
			СводкаТекст = СтрЗаменить(СводкаТекст, "%2", "Начнется " + КонтекстМодуля.ИнтервалСтрокой(
																		РезультатыДиагностики.Параметры.ДатаКлиента, 
																		ЧастьОтчета.ЛицензияДатаНачала));
			
			СсылкаГруппы = ДобавитьНадпись(СводкаТекст, 1);
			
			СводкаТекст = ТекстЛицензии;
			ДобавитьНадпись(СводкаТекст, СсылкаГруппы);
		КонецЕсли;		

		Если ЧастьОтчета.СрокГодностиЧислом = 1 Тогда //Заканчивается
			Ссылка1 = Неопределено;
			Подсказка = НайтиОписаниеПоКоду(СрокГодностиСобытие.Код, МакетПодсказки, Ссылка1);
			Если Подсказка <> "" Тогда 
				ДобавитьНадпись(Подсказка, СсылкаГруппы,,, Ссылка1,,, Истина);
			КонецЕсли;
		ИначеЕсли ЧастьОтчета.СрокГодностиЧислом = 2 Тогда //Закончилась
			Ссылка1 = Неопределено;
			Подсказка = НайтиОписаниеПоКоду(СрокГодностиСобытие.Код, МакетПодсказки, Ссылка1);
			Если Подсказка <> "" Тогда 
				ДобавитьНадпись(Подсказка, СсылкаГруппы,,, Ссылка1,,, Истина);
			КонецЕсли;
		ИначеЕсли ЧастьОтчета.СрокГодностиЧислом = 3 Тогда //Не началась
			Подсказка = НайтиОписаниеПоКоду(СрокГодностиСобытие.Код, МакетПодсказки);
			Если Подсказка <> "" Тогда 
				ДобавитьНадпись(Подсказка, СсылкаГруппы,,,,,, Истина);
			КонецЕсли;
		КонецЕсли;	
		
	КонецЕсли;
	
	Если РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.РазличияРеквизитовСведений.Количество() > 0 Тогда 
		ВсегоРазличияРеквизитовСведений = РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.РазличияРеквизитовСведений.Количество();
		ИзНихВажных = 0;
		Для Каждого Запись из РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.РазличияРеквизитовСведений Цикл 
			Если Запись.Важно Тогда 
				ИзНихВажных = ИзНихВажных + 1;
			КонецЕсли;
		КонецЦикла;
		
		//776
		Ссылка = "%1 изменени%2";
		Ссылка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Ссылка, 
												ВсегоРазличияРеквизитовСведений, 
												КонтекстМодуля.ПростоеСклонение(ВсегоРазличияРеквизитовСведений, "е", "я", "ий"));												
		
		Сообщение = НайтиОписаниеПоКоду("776_0", МакетПодсказки, Ссылка1,, 
						КонтекстМодуля.ПростоеСклонение(ВсегоРазличияРеквизитовСведений, "о", "ы", "ы"), Ссылка);
						
		Ссылка1 = ПодготовитьСсылку(Сообщение, Ссылка);
		
		Если ВсегоРазличияРеквизитовСведений = ИзНихВажных Тогда //Все отличия важные
			СсылкаГруппы = ДобавитьНадпись(Сообщение, 0,,, Ссылка1);
			ВсегоОшибок = ВсегоОшибок + 1;
		ИначеЕсли ИзНихВажных = 0 Тогда //Все отличия неважные
			СсылкаГруппы = ДобавитьНадпись(Сообщение, 1,,, Ссылка1);
			ВсегоПредупреждений = ВсегоПредупреждений + 1;
		Иначе //Есть И те И другие
			СсылкаГруппы = ДобавитьНадпись(Сообщение, 0,,, Ссылка1);
			ВсегоОшибок = ВсегоОшибок + 1;						
		КонецЕсли;
		
		НоваяСводка = Новый Структура("Категория, Проверка, Ссылка", 0, 2, Ссылка1.Ссылка);
		РезультатыДиагностики.Отчет.Сводка.Добавить(НоваяСводка);
		
		Если ИзНихВажных > 0 Тогда 
			Рекомендация = НайтиОписаниеПоКоду("776_1", МакетПодсказки,  Ссылка1);			
			ДобавитьНадпись(Рекомендация, СсылкаГруппы,,, Ссылка1,,, Истина);
		Иначе
			Рекомендация = НайтиОписаниеПоКоду("776_2", МакетПодсказки,  Ссылка1);
			ДобавитьНадпись(Рекомендация, СсылкаГруппы,,, Ссылка1,,, Истина);
		КонецЕсли;

	КонецЕсли;
	
	ВладелецЭП = КонтекстМодуля.НормализованныеФИО(
					РезультатыДиагностики.Автонастройка.ВладелецЭП.Фамилия, 
					РезультатыДиагностики.Автонастройка.ВладелецЭП.Имя, 
					РезультатыДиагностики.Автонастройка.ВладелецЭП.Отчество);
					
	ВладелецЭПРп="";
	ВладелецЭПВп="";
	ВладелецЭПДп="";
	КонтекстМодуля.СклонятьВВп(ВладелецЭП, ВладелецЭПВп);
	КонтекстМодуля.СклонятьВРп(ВладелецЭП, ВладелецЭПРп);
	КонтекстМодуля.СклонятьВДп(ВладелецЭП, ВладелецЭПДп);
		
	ПроблемСДоверенностями = 0;
	Если РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ИнформацияДоверенности <> Неопределено И
		РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ИнформацияДоверенности.Количество() > 0 Тогда 
		
		НетДоверенности = Новый Массив;
		ДоверенностиСОшибкой = Новый Массив;
	
		Индекс = -1;
		Для Каждого Доверенность из РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ИнформацияДоверенности Цикл 
			Индекс = Индекс + 1;
			Если Доверенность.Проблемы.Количество() = 0 Тогда 
				Продолжить;
			КонецЕсли;
			
			ПроблемСДоверенностями = ПроблемСДоверенностями + 1;
			
			Если Доверенность.Доверенность = Неопределено Тогда 
				НетДоверенности.Добавить(Индекс);
			Иначе
				ДоверенностиСОшибкой.Добавить(Индекс);
			КонецЕсли;			
		КонецЦикла;
		
		ТекстИПОрг = ?(РезультатыДиагностики.Отчет.Абонент.ИП, "индивидуальным предпринимателем", "руководителем (законным представителем) организации");
		
		Если НетДоверенности.Количество() = 1 Тогда 
			
			ВсегоОшибок = ВсегоОшибок + 1;
			
			Доверенность = РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ИнформацияДоверенности[НетДоверенности[0]];
			ИдИФНС = Доверенность.Направление + " " + Доверенность.КодПолучателя
						+ ?(НЕ РезультатыДиагностики.Отчет.Абонент.ИП, ?(ЗначениеЗаполнено(Доверенность.КПП), " И КПП " + Доверенность.КПП, ""), "");
			
			СводкаТекст = НайтиОписаниеПоКоду("777_2", МакетПодсказки,,, ИдИФНС);
			
			ИмяГруппы = ДобавитьНадпись(СводкаТекст, 0);
			
			СводкаТекст = НайтиОписаниеПоКоду("777", МакетПодсказки,,, ВладелецЭПВп, ТекстИПОрг);
			ДобавитьНадпись(СводкаТекст, ИмяГруппы);
			
			Рекомендация = НайтиОписаниеПоКоду("778_1", МакетПодсказки, Ссылка1,, ВладелецЭПРп);
			Если Ссылка1 = Неопределено Тогда
				Ссылка1 = ПодготовитьСсылку("", "");
			КонецЕсли;
			Ссылка1.Ссылка = Формат(НетДоверенности[0], "ЧДЦ=; ЧН=; ЧГ=");
			ИмяСсылки = ДобавитьНадпись(Рекомендация, ИмяГруппы,,, Ссылка1,,, Истина);
				
		ИначеЕсли НетДоверенности.Количество() > 1 Тогда 
			
			ВсегоОшибок = ВсегоОшибок + 1;
			
			СводкаТекст = НайтиОписаниеПоКоду("777_3", МакетПодсказки,,, 
								КонтекстМодуля.ПростоеСклонение(НетДоверенности.Количество(), "ет", "ют", "ют"), 
								НетДоверенности.Количество(), 
								КонтекстМодуля.ПростоеСклонение(НетДоверенности.Количество(), "ь", "и", "ей"));
								
			ИмяГруппы = ДобавитьНадпись(СводкаТекст, 0);
			
			Рекомендация = НайтиОписаниеПоКоду("777_6", МакетПодсказки, Ссылка1);
			ИмяСсылки = ДобавитьНадпись(Рекомендация, ИмяГруппы,,, Ссылка1,,, Истина);
			
			НоваяСводка = Новый Структура("Категория, Проверка, Ссылка, Фильтр", 0, 4, Ссылка1.Ссылка, НетДоверенности);
			РезультатыДиагностики.Отчет.Сводка.Добавить(НоваяСводка);
		Иначе
			СводкаТекст = "";
		КонецЕсли;
		
		Если ДоверенностиСОшибкой.Количество() = 1 Тогда 
			
			ВсегоОшибок = ВсегоОшибок + 1;
			
			Доверенность = РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ИнформацияДоверенности[ДоверенностиСОшибкой[0]];
			ИдИФНС = Доверенность.Направление + " " + Доверенность.КодПолучателя 
						+ ?(НЕ РезультатыДиагностики.Отчет.Абонент.ИП, ?(ЗначениеЗаполнено(Доверенность.КПП), " И КПП " + Доверенность.КПП, ""), "");
			
			ОдиночнаяПроблемаПросрочка = Ложь;
			
			Если Доверенность.Проблемы.Количество() = 1 И Доверенность.Проблемы[0].Код = 779 Тогда 
				ОдиночнаяПроблемаПросрочка = Истина;
			КонецЕсли;
			
			Если ОдиночнаяПроблемаПросрочка Тогда 
				СводкаТекст = НайтиОписаниеПоКоду("777_7", МакетПодсказки, Ссылка1,, 
								ИдИФНС, 
								КонтекстМодуля.ИнтервалСтрокой(РезультатыДиагностики.Параметры.ДатаКлиента, Доверенность.Доверенность.ДатаОкончания));
								
				Если Ссылка1 = Неопределено Тогда
					Ссылка1 = ПодготовитьСсылку("", "");
				КонецЕсли;
				Ссылка1.Ссылка = Формат(ДоверенностиСОшибкой[0], "ЧДЦ=; ЧН=; ЧГ=");
				ИмяГруппы = ДобавитьНадпись(СводкаТекст, 0,,, Ссылка1);				
			Иначе
				СводкаТекст = НайтиОписаниеПоКоду("777_4", МакетПодсказки,,, ИдИФНС);
				ИмяГруппы = ДобавитьНадпись(СводкаТекст, 0);
				
				Ожидаемый = "";
				Фактический = "";
				ПроблемаСоСроком = Ложь;
				ВидПроблемы = 0;
				ПроблемаСПредставителем = Ложь;
				Для Каждого Проблема из Доверенность.Проблемы Цикл
					Если Проблема.Код = 779 Тогда //Срок годности истёк
						ПроблемаСоСроком = Истина;
						ВидПроблемы = 1;
					ИначеЕсли Проблема.Код = 780 Тогда //Срок годности ещё не начался
						ПроблемаСоСроком = Истина;
						ВидПроблемы = 2;
					ИначеЕсли Проблема.Код = 781 Тогда
						ПроблемаСПредставителем = Истина;
						Ожидаемый = Проблема.Представитель.Ожидаемый;
						Фактический = Проблема.Представитель.Фактический;
					КонецЕсли;
				КонецЦикла;
				
				Если ПроблемаСПредставителем Тогда 
					ФактическийРп = "";
					ОжидаемыйРп = "";
					КонтекстМодуля.СклонятьВРп(Фактический, ФактическийРп, Ожидаемый, ОжидаемыйРп);
					
					СводкаТекст = НайтиОписаниеПоКоду("777_0", МакетПодсказки,,, ФактическийРп, ОжидаемыйРп);
				КонецЕсли;
				
				Если ПроблемаСоСроком Тогда 
					Парам3 = ?(ВидПроблемы = 1, "закончился " 
									+ КонтекстМодуля.ИнтервалСтрокой(
											РезультатыДиагностики.Параметры.ДатаКлиента, 
											Доверенность.Доверенность.ДатаОкончания)
									, "ещё не начался, начнется " 
									+ КонтекстМодуля.ИнтервалСтрокой(
											РезультатыДиагностики.Параметры.ДатаКлиента, 
											Доверенность.Доверенность.ДатаВыдачи));
					
					Если ПроблемаСПредставителем Тогда 
						СводкаТекст = СводкаТекст + "Также п" + НайтиОписаниеПоКоду("777_1", МакетПодсказки,,,,, Парам3);
					Иначе
						СводкаТекст = "П" + НайтиОписаниеПоКоду("777_1", МакетПодсказки,,,,, Парам3);
					КонецЕсли;
				КонецЕсли;
				
				ДобавитьНадпись(СводкаТекст, ИмяГруппы);
				
				Если ПроблемаСПредставителем Тогда 
					Рекомендация = НайтиОписаниеПоКоду("781", МакетПодсказки, Ссылка1,, ВладелецЭПРп);
				ИначеЕсли ПроблемаСоСроком Тогда 
					Рекомендация = НайтиОписаниеПоКоду("780", МакетПодсказки, Ссылка1);
				КонецЕсли;
				
				Если Ссылка1 = Неопределено Тогда
					Ссылка1 = ПодготовитьСсылку("", "");
				КонецЕсли;
				Ссылка1.Ссылка = Формат(ДоверенностиСОшибкой[0], "ЧДЦ=; ЧН=; ЧГ=");
				ДобавитьНадпись(Рекомендация, ИмяГруппы,,, Ссылка1,,, Истина);
			КонецЕсли;
		
		ИначеЕсли ДоверенностиСОшибкой.Количество() > 1 Тогда 
			
			ВсегоОшибок = ВсегоОшибок + 1;
			
			СводкаТекст = НайтиОписаниеПоКоду("777_5", МакетПодсказки);
			ИмяГруппы = ДобавитьНадпись(СводкаТекст, 0);
			
			Рекомендация = НайтиОписаниеПоКоду("777_6", МакетПодсказки, Ссылка1);
			Если Ссылка1 = Неопределено Тогда
				Ссылка1 = ПодготовитьСсылку("", "");
			КонецЕсли;
			Ссылка1.Действие = "ДействиеПосмотретьОшибочныеДоверенности";
			ИмяСсылки = ДобавитьНадпись(Рекомендация, ИмяГруппы,,, Ссылка1,,, Истина);
			
			НоваяСводка = Новый Структура("Категория, Проверка, Ссылка, Фильтр", 0, 5, Ссылка1.Ссылка, ДоверенностиСОшибкой);
			РезультатыДиагностики.Отчет.Сводка.Добавить(НоваяСводка);
		Иначе
			СводкаТекст = "";
		КонецЕсли;
		
	КонецЕсли;
	
	НетПодключения = Ложь;
	НедоступенХостВипнет = Ложь;
	
	Если РезультатыДиагностики.Отчет.Проверки.Свойство("ПроверкаПодключений") Тогда 
		ОшибокПодключений = 0;
		ПредупрежденийПодключений = 0;
		
		ЧастьОтчета = РезультатыДиагностики.Отчет.Проверки.ПроверкаПодключений;
		
		Если ЧастьОтчета.Свойство("Предупреждения") Тогда 
			Для Каждого Операция из РезультатыДиагностики.Отчет.Проверки.ПроверкаПодключений.Предупреждения Цикл 
				ПредупрежденийПодключений = ПредупрежденийПодключений + 1;				
			КонецЦикла;
			
			Если ПредупрежденийПодключений > 0 Тогда
				
				ВсегоПредупреждений = ВсегоПредупреждений + 1;
				
				//1281
				Ссылка = "%1 замечани%2";
				Ссылка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
														Ссылка, 
														ПредупрежденийПодключений, 
														КонтекстМодуля.ПростоеСклонение(ПредупрежденийПодключений, "е", "я", "ий"));
														
				Сообщение = "Проверка подключений выявила " + Ссылка;
			
				ИмяСсылки = ДобавитьНадпись(Сообщение, 1);
			КонецЕсли;
		КонецЕсли;
		
		Для Каждого Операция из ЧастьОтчета.Ресурсы Цикл
			Если Операция.Результат Тогда 
				Продолжить;
			КонецЕсли;
			ОшибокПодключений = ОшибокПодключений + 1;			
		КонецЦикла;
						
		Если ОшибокПодключений > 0 Тогда 
			
			ВсегоОшибок = ВсегоОшибок + 1;
			
			Ссылка = "%1 сервис%2";
			Ссылка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
													Ссылка, 
													ОшибокПодключений, 
													КонтекстМодуля.ПростоеСклонение(ОшибокПодключений, "у", "ам", "ам"));
			
			Сообщение = НайтиОписаниеПоКоду("1281_0", МакетПодсказки, Ссылка1,, Ссылка);
			
			Ссылка1 = ПодготовитьСсылку(Сообщение, Ссылка);
			ИмяСсылки = ДобавитьНадпись(Сообщение, 0,,, Ссылка1);
			
			НоваяСводка = Новый Структура("Категория, Проверка, Ссылка", 1, 1, Ссылка1.Ссылка);
			РезультатыДиагностики.Отчет.Сводка.Добавить(НоваяСводка);
			
			ВсегоНедоступных = 0;
			СоСреднимКачеством = 0;
			СПлохимКачеством = 0;
			СХорошимКачеством = 0;
			ДоступныхЧерезШлюз = 0;
			НедоступныхПочты = 0;
			НедоступныхПрочих = 0;
			НедоступнаТолькоПочта = Ложь;
			Для Каждого Ресурс из ЧастьОтчета.Ресурсы Цикл
				Если Ресурс.Результат Тогда 
					Продолжить;
				КонецЕсли;
				
				ВсегоНедоступных = ВсегоНедоступных + 1;
				
				ПП = Ресурс.ПараметрыПодключения;
				
				Если ПП.Свойство("Адрес") Тогда 
					НедоступныхПрочих = НедоступныхПрочих + 1;
				Иначе 
					НедоступныхПочты = НедоступныхПочты + 1;
				КонецЕсли;
				
				Адрес = ПП.ПредставлениеХоста;
				
				Если Найти(Адрес, "infotecs.ru") > 0 Тогда 
					НедоступенХостВипнет = Истина;
				КонецЕсли;
				
				ДоступностьЗаЧас = 0;
				ТекстСостояния = "";
				
				Если Ресурс.СервисПроверки.Использовался <> Неопределено И Ресурс.СервисПроверки.Использовался Тогда 
					Если Ресурс.СервисПроверки.Доступен Тогда 
						ДоступныхЧерезШлюз = ДоступныхЧерезШлюз + 1;
					КонецЕсли;
					
					ДоступностьЗаЧас = Ресурс.СервисПроверки.ДоступностьЗаЧас;
					
					Если ДоступностьЗаЧас > 95 Тогда 
						СХорошимКачеством = СХорошимКачеством + 1;
					ИначеЕсли ДоступностьЗаЧас > 40 Тогда 
						СоСреднимКачеством = СоСреднимКачеством + 1;		
					ИначеЕсли ДоступностьЗаЧас > 0 Тогда 
						СПлохимКачеством = СПлохимКачеством + 1;
					ИначеЕсли ДоступностьЗаЧас <= 0 Тогда 
						СПлохимКачеством = СПлохимКачеством + 1;
					КонецЕсли;
				КонецЕсли;
			
			КонецЦикла;
			
			НедоступнаТолькоПочта = НедоступныхПочты > 0 И НедоступныхПрочих = 0;
			ТекстПрокси = ?(НедоступнаТолькоПочта, "", " либо задайте настройки прокси в программе");
			
			Если ЧастьОтчета.Ресурсы.Количество() = ВсегоНедоступных Тогда
				Подсказка = НайтиОписаниеПоКоду("1281_1", МакетПодсказки, Ссылка1,, ТекстПрокси);
				Если НедоступнаТолькоПочта Тогда 
					ДобавитьНадпись(Подсказка, ИмяСсылки,,,,,, Истина);
				Иначе
					ДобавитьНадпись(Подсказка, ИмяСсылки,,, Ссылка1,,, Истина);
				КонецЕсли;
				НетПодключения = Истина;
			ИначеЕсли ДоступныхЧерезШлюз > 0 Тогда
				Если СПлохимКачеством > 0 Тогда 
					Подсказка = НайтиОписаниеПоКоду("1281_4", МакетПодсказки, Ссылка1,, ТекстПрокси);
					Если НедоступнаТолькоПочта Тогда 
						ДобавитьНадпись(Подсказка, ИмяСсылки,,,,,, Истина);
					Иначе
						ДобавитьНадпись(Подсказка, ИмяСсылки,,, Ссылка1,,, Истина);
					КонецЕсли;
				ИначеЕсли СоСреднимКачеством > 0 Тогда 
					Подсказка = НайтиОписаниеПоКоду("1281_3", МакетПодсказки, Ссылка1,, ТекстПрокси);
					Если НедоступнаТолькоПочта Тогда 
						ДобавитьНадпись(Подсказка, ИмяСсылки,,,,,, Истина);
					Иначе				
						Если НедоступнаТолькоПочта Тогда 
							ДобавитьНадпись(Подсказка, ИмяСсылки,,,,,, Истина);
						Иначе
							ДобавитьНадпись(Подсказка, ИмяСсылки,,, Ссылка1,,, Истина);
						КонецЕсли;
					КонецЕсли;
				ИначеЕсли СХорошимКачеством > 0 Тогда 
					Подсказка = НайтиОписаниеПоКоду("1281_2", МакетПодсказки, Ссылка1,, ТекстПрокси);
					Если НедоступнаТолькоПочта Тогда 
						ДобавитьНадпись(Подсказка, ИмяСсылки,,,,,, Истина);
					Иначе				
						Если НедоступнаТолькоПочта Тогда 
							ДобавитьНадпись(Подсказка, ИмяСсылки,,,,,, Истина);
						Иначе
							ДобавитьНадпись(Подсказка, ИмяСсылки,,, Ссылка1,,, Истина);
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;
			Иначе
				//Параметры.Отчет.Проверки.СостояниеСервисаПроверки
				//0 работает без ошибок
				//1 вебклиент не умеет парсить ответ
				//2 ошибка сервиса проверки
				//3 ошибка чтения ответа сервиса проверки
				Если РезультатыДиагностики.Отчет.Проверки.СостояниеСервисаПроверки = 0 Тогда 
					Подсказка = НайтиОписаниеПоКоду("1281_5", МакетПодсказки,,, ТелефонСлужбыПоддержки);
				Иначе 
					Подсказка = "";
				КонецЕсли;
				
				ДобавитьНадпись(Подсказка, ИмяСсылки,,,,,, Истина);
			КонецЕсли;
		
		КонецЕсли;
	ИначеЕсли НЕ РезультатыДиагностики.Отчет.Проверки.Свойство("ПроверкаПодключений") Тогда 
		СсылкаГруппы = ДобавитьНадпись("Проверка подключений отключена", 1);
		ВсегоПредупреждений = ВсегоПредупреждений + 1;
		ДобавитьНадпись("Выключите тестовый режим", СсылкаГруппы,,,,,, Истина);
	КонецЕсли;
	
	Если РезультатыДиагностики.Отчет.Проверки.Свойство("ПроверкаКомпонентов") Тогда 
		
		ЧастьОтчета = РезультатыДиагностики.Отчет.Проверки.ПроверкаКомпонентов;
		ОшибокКомпонентов = 0;
		
		Если ЧастьОтчета.Криптокомпонент = Неопределено
			ИЛИ ЧастьОтчета.Криптопровайдеры = Неопределено
			ИЛИ ЧастьОтчета.РасширениеРаботыСФайлами = Неопределено Тогда 
				
			ДобавитьНадпись("Проверка компонентов отключена", 1);
		Иначе
			Если НЕ ЧастьОтчета.Криптокомпонент.Подключен Тогда 
				ОшибокКомпонентов = ОшибокКомпонентов + 1;
			КонецЕсли;
			
			Если НЕ ЧастьОтчета.Криптопровайдеры.Подключен Тогда 
				ОшибокКомпонентов = ОшибокКомпонентов + 1;
			КонецЕсли;
			
			Если НЕ ЧастьОтчета.РасширениеРаботыСФайлами.Подключен Тогда 
				ОшибокКомпонентов = ОшибокКомпонентов + 1;
			КонецЕсли;
		КонецЕсли;
		
		Если РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ИнформацияЛичногоСертификата.СрокГодности > 1 Тогда
			ОшибокКомпонентов = ОшибокКомпонентов + 1;
		КонецЕсли;

		Если ОшибокКомпонентов > 0 Тогда 
			ЧастьОтчета = РезультатыДиагностики.Отчет.Проверки.ПроверкаКомпонентов;
			ЧастьОтчета2 = РезультатыДиагностики.Отчет.Проверки.ПроверкаКриптоопераций;
	
			ТипКлиента = РезультатыДиагностики.Отчет.ДополнительнаяИнформация["ТипКлиентскогоПодключенияЧислом"];
			ЛичныйСертификат = РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ИнформацияЛичногоСертификата;
	
			СрокГодности = ЛичныйСертификат.СрокГодности;
			ТекстСертификата = "выдан %1, действителен с %2 по %3";
			ТекстСертификата = СтрЗаменить(ТекстСертификата, "%1", ВладелецЭПДп);
			ТекстСертификата = СтрЗаменить(ТекстСертификата, "%2", Формат(ЛичныйСертификат.Выдан, "ДЛФ=DD"));
			ТекстСертификата = СтрЗаменить(ТекстСертификата, "%3", Формат(ЛичныйСертификат.ДействуетПо, "ДЛФ=DD"));
			СводкаТекстШаблон = "Сертификат %1";
			
			Если СрокГодности <> -1 Тогда
				Интервал = КонтекстМодуля.ИнтервалСтрокой(РезультатыДиагностики.Параметры.ДатаКлиента, ЛичныйСертификат.ДействуетПо);
			КонецЕсли;
			
			Если СрокГодности = -1 Тогда //Не удалось получить информацию
				
			ИначеЕсли СрокГодности = 1 Тогда //Подходит к концу
				ВсегоПредупреждений = ВсегоПредупреждений + 1;
				
				Описание = НайтиОписаниеПоКоду("8448_8", МакетПодсказки,,, Интервал);
				СсылкаГруппы = ДобавитьНадпись(Описание, 1);
												
				СводкаТекст = СтрЗаменить(СводкаТекстШаблон, "%1", ТекстСертификата);
				ДобавитьНадпись(СводкаТекст, СсылкаГруппы);
				
				Рекомендация = НайтиОписаниеПоКоду("8448_5", МакетПодсказки, Ссылка1);
				ДобавитьНадпись(Рекомендация, СсылкаГруппы,,, Ссылка1,,, Истина);
				
			ИначеЕсли СрокГодности = 2 Тогда //Закончился
				ВсегоОшибок = ВсегоОшибок + 1;
				
				Описание = НайтиОписаниеПоКоду("8448_6", МакетПодсказки,,, Интервал);				
				СсылкаГруппы = ДобавитьНадпись(Описание);
				
				СводкаТекст = СтрЗаменить(СводкаТекстШаблон, "%1", ТекстСертификата);
				ДобавитьНадпись(СводкаТекст, СсылкаГруппы);
				
				Рекомендация = НайтиОписаниеПоКоду("8448_3", МакетПодсказки, Ссылка1);
				ДобавитьНадпись(Рекомендация, СсылкаГруппы,,, Ссылка1,,, Истина);
				
			ИначеЕсли СрокГодности = 3 Тогда //Ещё не начался
				ВсегоПредупреждений = ВсегоПредупреждений + 1;
				
				Интервал = КонтекстМодуля.ИнтервалСтрокой(ЛичныйСертификат.Выдан, РезультатыДиагностики.Параметры.ДатаКлиента);
				Описание = НайтиОписаниеПоКоду("8448_7", МакетПодсказки,,, Интервал);
				СсылкаГруппы = ДобавитьНадпись(Описание, 1);
				
				СводкаТекст = СтрЗаменить(СводкаТекстШаблон, "%1", ТекстСертификата);
				ДобавитьНадпись(СводкаТекст, СсылкаГруппы);
								
				Рекомендация = НайтиОписаниеПоКоду("8448_4", МакетПодсказки);
				ДобавитьНадпись(Рекомендация, СсылкаГруппы,,,,,, Истина);
			КонецЕсли;
			
			//* КК **********
			Если НЕ ЧастьОтчета.Криптокомпонент.Подключен Тогда 
				
				Если ЧастьОтчета.Криптокомпонент.КодОшибки = 0 Тогда
					
				ИначеЕсли ЧастьОтчета.Криптокомпонент.КодОшибки = 1 Тогда //Не удалось подключить криптокомпонент
					ОписаниеПроблемы = НайтиОписаниеПоКоду("2304_1", МакетПодсказки);	
				ИначеЕсли ЧастьОтчета.Криптокомпонент.КодОшибки = 2 Тогда //Не удалось инициализировать криптокомпонент
					ОписаниеПроблемы = НайтиОписаниеПоКоду("2304_3", МакетПодсказки);	
				КонецЕсли;
				
				
				СсылкаГруппы = ДобавитьНадпись(ОписаниеПроблемы, 0);
				
				ВсегоОшибок = ВсегоОшибок + 1;
				
				Если ЧастьОтчета.Криптокомпонент.КодОшибки = 1 Тогда
					
					Ссылка1 = Неопределено;
					
					Если ТипКлиента = 3 Тогда //ВебКлиент
						Рекомендация = НайтиОписаниеПоКоду("2304_n", МакетПодсказки, Ссылка1);
					Иначе
						Рекомендация = НайтиОписаниеПоКоду("2304_2", МакетПодсказки, Ссылка1);
					КонецЕсли;					
					Если Рекомендация <> "" Тогда 
						ДобавитьНадпись(Рекомендация, СсылкаГруппы,,, Ссылка1,,, Истина);
					КонецЕсли;
				ИначеЕсли ЧастьОтчета.Криптокомпонент.КодОшибки = 2 Тогда
					
					Перечисление_ТипыКриптоПровайдеров = ПолучитьЗначенияПеречисления("ТипыКриптоПровайдеров");
					
					ПредставленияКП = Новый Соответствие;
					ПредставленияКП.Вставить(0, "");
					ПредставленияКП.Вставить(Перечисление_ТипыКриптоПровайдеров.VipNet, "ViPNet CSP");
					ПредставленияКП.Вставить(Перечисление_ТипыКриптоПровайдеров.CryptoPro, "CryptoPro CSP");
					
					КП = ПолучитьКриптопровайдераОтчета(РезультатыДиагностики.Отчет, РезультатыДиагностики.Автонастройка);
					ПредставлениеКП = ПредставленияКП.Получить(?(КП = Неопределено, 0, КП));
					
					Рекомендация = НайтиОписаниеПоКоду("2304_4", МакетПодсказки,,, ПредставлениеКП);
					Если Рекомендация <> "" Тогда 
						ДобавитьНадпись(Рекомендация, СсылкаГруппы,,,,,, Истина);
					КонецЕсли;
									
					ТекстНетПодключения = НайтиОписаниеПоКоду("2304_i", МакетПодсказки);
					
					//Рекомендация = НайтиОписаниеПоКоду("2304_j", МакетПодсказки,,, ПредставлениеКП);
					//Если Рекомендация <> "" Тогда 
					//	ДобавитьНадпись(Рекомендация, СсылкаГруппы,,,,,, Истина);
					//КонецЕсли;
					
					Если КП = Неопределено Тогда 
						Рекомендация = НайтиОписаниеПоКоду("2304_m", МакетПодсказки, Ссылка1, Ссылка2);
						ДобавитьНадпись(Рекомендация, СсылкаГруппы,,, Ссылка1, Ссылка2,, Истина);
					ИначеЕсли КП = Перечисление_ТипыКриптоПровайдеров.VipNet Тогда 
						Рекомендация = НайтиОписаниеПоКоду("2304_k", МакетПодсказки, Ссылка1,, ?(НедоступенХостВипнет, ТекстНетПодключения, ""));
						ДобавитьНадпись(Рекомендация, СсылкаГруппы,,, Ссылка1,,, Истина);
					ИначеЕсли КП = Перечисление_ТипыКриптоПровайдеров.CryptoPro Тогда 
						Рекомендация = НайтиОписаниеПоКоду("2304_l", МакетПодсказки, Ссылка1);
						ДобавитьНадпись(Рекомендация, СсылкаГруппы,,, Ссылка1,,, Истина);
					КонецЕсли;
				КонецЕсли;					
			КонецЕсли;
			
			//* КП **********
			Если ЧастьОтчета.Криптокомпонент.Подключен И НЕ ЧастьОтчета.Криптопровайдеры.Подключен Тогда 
				
				Если ЧастьОтчета.Криптопровайдеры.Состояние = 2 Тогда //Нет КП
					ОписаниеПроблемы = НайтиОписаниеПоКоду("2304_7", МакетПодсказки);
					СсылкаГруппы = ДобавитьНадпись(ОписаниеПроблемы, 0);
					
					ВсегоОшибок = ВсегоОшибок + 1;
					
					КП = ПолучитьКриптопровайдераОтчета(РезультатыДиагностики.Отчет, РезультатыДиагностики.Автонастройка);
					Перечисление_ТипыКриптоПровайдеров = ПолучитьЗначенияПеречисления("ТипыКриптоПровайдеров");
					
					ТекстНетПодключения = НайтиОписаниеПоКоду("2304_i", МакетПодсказки);
					
					Если КП = Неопределено или КП = Перечисление_ТипыКриптоПровайдеров.VipNet Тогда 
						Рекомендация = НайтиОписаниеПоКоду("2304_8", МакетПодсказки, Ссылка1,, ?(НедоступенХостВипнет, ТекстНетПодключения, ""));
						ДобавитьНадпись(Рекомендация, СсылкаГруппы,,, Ссылка1,,, Истина);
					КонецЕсли;
					Если КП = Неопределено или КП = Перечисление_ТипыКриптоПровайдеров.CryptoPro Тогда 
						Рекомендация = НайтиОписаниеПоКоду("2304_9", МакетПодсказки, Ссылка1);
						ДобавитьНадпись(Рекомендация, СсылкаГруппы,,, Ссылка1,,, Истина);
					КонецЕсли;
					
				ИначеЕсли ЧастьОтчета.Криптопровайдеры.Состояние = 1 Тогда //Несколько конфликтующих КП
					ОписаниеПроблемы = НайтиОписаниеПоКоду("2304_6", МакетПодсказки);
					СсылкаГруппы = ДобавитьНадпись(ОписаниеПроблемы);
					
					ВсегоОшибок = ВсегоОшибок + 1;
					
					ПараметрыКП = Неопределено;
					КП_2 = ПолучитьКриптопровайдераОтчета(РезультатыДиагностики.Отчет, РезультатыДиагностики.Автонастройка, ПараметрыКП);
					
					СводкаТекст = НайтиОписаниеПоКоду("2304_a", МакетПодсказки);
					ДобавитьНадпись(СводкаТекст, СсылкаГруппы);
					
					Если КП_2 <> Неопределено Тогда
						ИзвестныеКриптопровайдеры = КриптографияЭДКОКлиентСервер.ИзвестныеКриптопровайдеры();
						ИндексКриптопровайдеров = Неопределено;
						КП_2 = ПараметрыКП.Представление;
						Для каждого Эл из РезультатыДиагностики.Отчет.Криптопровайдеры Цикл
							Если Эл.Представление = ПараметрыКП.Имя Тогда
								Продолжить;
							КонецЕсли;
							СвойстваКриптопровайдера = КриптографияЭДКОКлиентСервер.СвойстваКриптопровайдера(
								Эл.Представление,,
								ИзвестныеКриптопровайдеры,
								ИндексКриптопровайдеров);
							КП_1 = ?(СвойстваКриптопровайдера <> Неопределено, СвойстваКриптопровайдера.Представление, Эл.Представление);
						КонецЦикла;
						Рекомендация = НайтиОписаниеПоКоду("2304_e", МакетПодсказки,,, КП_1, КП_2);
						ИмяСсылки = ДобавитьНадпись(Рекомендация, СсылкаГруппы,,,,,, Истина);
						
						Рекомендация = НайтиОписаниеПоКоду("2304_f", МакетПодсказки, Ссылка1,, КП_1, КП_2);
						Если Ссылка1 = Неопределено Тогда
							Ссылка1 = ПодготовитьСсылку("", "");
						КонецЕсли;
						Ссылка1.Ссылка = "КПИзменить";
						ДобавитьНадпись(Рекомендация, СсылкаГруппы,,, Ссылка1,,, Истина);
						
						Рекомендация = НайтиОписаниеПоКоду("2304_g", МакетПодсказки, Ссылка1,, КП_1, КП_2);
						Если Ссылка1 = Неопределено Тогда
							Ссылка1 = ПодготовитьСсылку("", "");
						КонецЕсли;
						Ссылка1.Ссылка = "КПНастроить";
						ДобавитьНадпись(Рекомендация, СсылкаГруппы,,, Ссылка1,,, Истина);

					КонецЕсли;
				
				ИначеЕсли ЧастьОтчета.Криптопровайдеры.Состояние = 3 Тогда //Сбой КК
				КонецЕсли;
			КонецЕсли;
			
			//* РРФ **********
			Если НЕ ЧастьОтчета.РасширениеРаботыСФайлами.Подключен Тогда //Новый Структура("Подключен, КодОшибки, ОписаниеОшибки");
								
				ТекстОшибки = НайтиОписаниеПоКоду("2304_h", МакетПодсказки);
				СсылкаГруппы = ДобавитьНадпись(ТекстОшибки, 0,,,,,, Истина);
				
				ВсегоОшибок = ВсегоОшибок + 1;
				Ссылка1 = Неопределено;
				
				Если ТипКлиента = 3 Тогда //ВебКлиент
					Рекомендация = НайтиОписаниеПоКоду("2304_c", МакетПодсказки, Ссылка1);
				Иначе
					Рекомендация = НайтиОписаниеПоКоду("2304_b", МакетПодсказки);
				КонецЕсли;
				Если Рекомендация <> "" Тогда 
					ДобавитьНадпись(Рекомендация, СсылкаГруппы,,, Ссылка1,,, Истина);
				КонецЕсли;
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
	Если РезультатыДиагностики.Отчет.Проверки.Свойство("ПроверкаСертификатов") И 
		РезультатыДиагностики.Отчет.Проверки.Свойство("ПроверкаКомпонентов") И 
		РезультатыДиагностики.Отчет.Проверки.ПроверкаКомпонентов.Криптокомпонент.Подключен Тогда 
		ОшибокСертификатов = 0;
		
		Для Каждого Операция из РезультатыДиагностики.Отчет.Проверки.ПроверкаСертификатов Цикл
			Если Операция.Найден Тогда 
				Продолжить;
			КонецЕсли;
			ОшибокСертификатов = ОшибокСертификатов + 1;			
		КонецЦикла;
		
		Если ОшибокСертификатов > 0 Тогда 
			
			ВсегоОшибок = ВсегоОшибок + 1;
			
			//4353
			Ссылка = "%1 сертификат%2";
			Ссылка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Ссылка, 
													ОшибокСертификатов, 
													КонтекстМодуля.ПростоеСклонение(ОшибокСертификатов, "", "а", "ов"));
									
			Сообщение = НайтиОписаниеПоКоду("4353_0", МакетПодсказки, Ссылка1,, 
							КонтекстМодуля.ПростоеСклонение(ОшибокСертификатов, "", "ы", "ы"), 
							ОшибокСертификатов, 
							КонтекстМодуля.ПростоеСклонение(ОшибокСертификатов, "", "а", "ов"), 
							КонтекстМодуля.ПростоеСклонение(ОшибокСертификатов, "й", "е", "е"));
			
			Ссылка1 = ПодготовитьСсылку(Сообщение, Ссылка);
			ИмяСсылкиГруппы = ДобавитьНадпись(Сообщение, 0,,, Ссылка1);
			
			НоваяСводка = Новый Структура("Категория, Проверка, Ссылка", 3, 0, Ссылка1.Ссылка);
			РезультатыДиагностики.Отчет.Сводка.Добавить(НоваяСводка);
						
			Подсказка = НайтиОписаниеПоКоду("4353_1", МакетПодсказки, Ссылка1);
			ДобавитьНадпись(Подсказка, ИмяСсылкиГруппы,,, Ссылка1,,, Истина);
		КонецЕсли;
	КонецЕсли;
	
	Если РезультатыДиагностики.Отчет.Проверки.Свойство("ПроверкаКриптоопераций") 
			И РезультатыДиагностики.Отчет.Проверки.ПроверкаКомпонентов.Криптокомпонент.Подключен Тогда 
		
		ОперацияТекст = Неопределено;
		ОшибокКриптоопераций = 0;
		Для Каждого Операция из РезультатыДиагностики.Отчет.Проверки.ПроверкаКриптоопераций Цикл 
			Если Не Операция.Успешно Тогда 
				Если ОперацияТекст = Неопределено Тогда 
					ОперацияТекст = НРег(Операция.Операция);
				КонецЕсли;
				ОшибокКриптоопераций = ОшибокКриптоопераций + 1;
				
				Прервать;
			КонецЕсли;
		КонецЦикла;
		
		Если ОшибокКриптоопераций > 0 Тогда 
			
			ВсегоОшибок = ВсегоОшибок + 1;
			
			Сообщение = НайтиОписаниеПоКоду("8448_0", МакетПодсказки,,
				, КонтекстМодуля.ПростоеСклонение(ОшибокКриптоопераций, "а", "ы", "ы")
				, КонтекстМодуля.ПростоеСклонение(ОшибокКриптоопераций, "ая", "ые", "ых")
				, КонтекстМодуля.ПростоеСклонение(ОшибокКриптоопераций, "я", "и", "й")
				, ОперацияТекст);
			СсылкаГруппы = ДобавитьНадпись(Сообщение, 0);
						
			Для Каждого Криптооперация из РезультатыДиагностики.Отчет.Проверки.ПроверкаКриптоопераций Цикл //Новый Структура("Операция, Успешно, ОписаниеОшибки", "Расшифровка"
				Если Криптооперация.Успешно Тогда 
					Продолжить;
				КонецЕсли;
				
				Если Найти(Криптооперация.ОписаниеОшибки, "отменена пользователем") > 0 Тогда 
					Рекомендация = НайтиОписаниеПоКоду("8448_1", МакетПодсказки, Ссылка1);
					ДобавитьНадпись(Рекомендация, СсылкаГруппы,,, Ссылка1,,, Истина);
				ИначеЕсли Найти(Криптооперация.ОписаниеОшибки, "не найден") > 0 Тогда 
					Рекомендация = НайтиОписаниеПоКоду("8448_2", МакетПодсказки);
					ДобавитьНадпись(Рекомендация, СсылкаГруппы,,,,,, Истина);				
				КонецЕсли;
			КонецЦикла;
			
		КонецЕсли;
	ИначеЕсли НЕ РезультатыДиагностики.Отчет.Проверки.Свойство("ПроверкаКриптоопераций") Тогда
		Если КриптографияЭДКОКлиентСервер.ЭтоПодписьСервиса(РезультатыДиагностики.Параметры) Тогда
			СсылкаГруппы = ДобавитьНадпись("Проверка криптоопераций не производится при ключах в программе", 1);
			ВсегоПредупреждений = ВсегоПредупреждений + 1;
			Сообщение = НайтиОписаниеПоКоду("130_5", МакетПодсказки, Ссылка1,);
			ДобавитьНадпись(Сообщение, СсылкаГруппы,,, Ссылка1,,, Истина);
			
		Иначе
			СсылкаГруппы = ДобавитьНадпись("Проверка криптоопераций отключена", 1);
			ВсегоПредупреждений = ВсегоПредупреждений + 1;
			ДобавитьНадпись("Выключите тестовый режим", СсылкаГруппы,,,,,, Истина);
		КонецЕсли;
	КонецЕсли;
	
	Нерасшифрованные = РезультатыДиагностики.Отчет.ДополнительнаяИнформация["Нерасшифрованные"];
	Если Нерасшифрованные <> Неопределено И Нерасшифрованные.Количество() > 0 Тогда
		Безнадежных = 0;		
		Для Каждого Эл Из Нерасшифрованные Цикл 
			НечемРасшифровать = Истина;
			Если Эл.СодержимоеТранспортныхКонтейнеров <> Неопределено И Эл.СодержимоеТранспортныхКонтейнеров.Количество() > 0 Тогда
				Для Каждого Контейнер Из Эл.СодержимоеТранспортныхКонтейнеров Цикл
					Если Контейнер.Документы <> Неопределено И Контейнер.Документы.Количество() > 0 Тогда //Документы присутствуют только тогда когда есть что расшифровывать
						Для Каждого Док Из Контейнер.Документы Цикл
							Если Док.Сведения <> Неопределено И Док.Сведения.Количество() > 0 Тогда
								Для Каждого Подпись Из Док.Сведения Цикл
									Если Подпись.found Тогда 
										НечемРасшифровать = Ложь;
										Прервать;
									КонецЕсли;
								КонецЦикла;
							КонецЕсли;
						КонецЦикла;
					ИначеЕсли Контейнер.Документы <> Неопределено И Контейнер.Документы.Количество() = 0 Тогда
						НечемРасшифровать = Ложь;
						Прервать;
					КонецЕсли;
				КонецЦикла;
			КонецЕсли;
			Если НечемРасшифровать Тогда 
				Безнадежных = Безнадежных + 1;
			КонецЕсли;
		КонецЦикла;
		
		Если Безнадежных > 0 Тогда 			
			Сообщение = НайтиОписаниеПоКоду("130_0", МакетПодсказки,,
				, КонтекстМодуля.ПростоеСклонение(Безнадежных, "о", "ы", "ы")
				, Формат(Безнадежных, "ЧН=; ЧГ=")
				, КонтекстМодуля.ПростоеСклонение(Безнадежных, "е", "я", "й")
				, КонтекстМодуля.ПростоеСклонение(Безнадежных, "ое", "ые", "ые")
				);
				
			СсылкаГруппы = ДобавитьНадпись(Сообщение, 1);
			ВсегоПредупреждений = ВсегоПредупреждений + 1;
			
			Сообщение = НайтиОписаниеПоКоду("130_1", МакетПодсказки,Ссылка1,);
			ДобавитьНадпись(Сообщение, СсылкаГруппы,,,Ссылка1,,, Истина);
			
			Сообщение = НайтиОписаниеПоКоду("130_2", МакетПодсказки,,);
			ДобавитьНадпись(Сообщение, СсылкаГруппы,,,,,, Истина);
			
			Сообщение = НайтиОписаниеПоКоду("130_3", МакетПодсказки,,);
			ДобавитьНадпись(Сообщение, СсылкаГруппы,,,,,, Истина);
			
			Сообщение = НайтиОписаниеПоКоду("130_4", МакетПодсказки, Ссылка1,);
			ДобавитьНадпись(Сообщение, СсылкаГруппы,,, Ссылка1,,, Истина);

		КонецЕсли;
	КонецЕсли;
	
	//**** Формирование шапки итогов проверки *******	
	Если ВсегоОшибок > 0 Тогда 
		ДобавитьОтступ(0,, "ДинамическаяОберткаОтступГруппыНижний", 3, Ложь); //Отступ после блока ошибки
	КонецЕсли;
	
	Если ВсегоОшибок > 0 Тогда
		Элементы.ГруппаСобытия.ЦветТекстаЗаголовка = Новый Цвет(240, 0, 0);
		
		ЗаголовокГруппы = "Проверка завершена, обнаружен%1 %2 ошиб%3";
		ЗаголовокГруппы = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		ЗаголовокГруппы, 
		КонтекстМодуля.ПростоеСклонение(ВсегоОшибок, "а", "ы", "ы"), 
		ВсегоОшибок, 
		КонтекстМодуля.ПростоеСклонение(ВсегоОшибок, "ка", "ки", "ок"));
		
		Если ВсегоПредупреждений > 0 Тогда 
			ШаблонСообщения = " и %1 предупрежден%2";
			ЗаголовокГруппы = ЗаголовокГруппы + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			ШаблонСообщения, 
			ВсегоПредупреждений, 
			КонтекстМодуля.ПростоеСклонение(ВсегоПредупреждений, "ие", "ия", "ий"));
		Иначе
			ЗаголовокГруппы = ЗаголовокГруппы + ":";
		КонецЕсли;
		
		Элементы.ГруппаСобытия.Заголовок = ЗаголовокГруппы;
		Элементы.НадписьНетОшибок.Видимость = Ложь;
		Элементы.ГруппаСобытия.Видимость = Истина;
		Элементы.ДекорацияОтступ.Видимость = Истина;
		Элементы.ГруппаГоризонтальнаяСредняя.Видимость = Истина;
		
		Если ВсегоПредупреждений = 0 Тогда //Если только ошибки, тогда скроем заголовок "Ошибки:"
			Элементы.ГруппаОшибки.ОтображатьЗаголовок = Ложь;
		Иначе
			Элементы.ГруппаОшибки.ОтображатьЗаголовок = Истина;
		КонецЕсли;
		
	ИначеЕсли ВсегоОшибок = 0 И ВсегоПредупреждений > 0 Тогда 
		
		ЗаголовокГруппы = "Проверка завершена, обнаружен%1 %2 предупрежден%3";
		ЗаголовокГруппы = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ЗаголовокГруппы, 
		КонтекстМодуля.ПростоеСклонение(ВсегоПредупреждений, "о", "ы", "ы"), 
		ВсегоПредупреждений, 
		КонтекстМодуля.ПростоеСклонение(ВсегоПредупреждений, "ие", "ия", "ий"));
		
		Элементы.ГруппаСобытия.ЦветТекстаЗаголовка = Новый Цвет(240, 128, 0);
		Элементы.ГруппаСобытия.Заголовок = ЗаголовокГруппы;
		Элементы.ГруппаПредупреждения.ЦветТекстаЗаголовка = Элементы.ГруппаСобытия.ЦветТекстаЗаголовка;
		
		Элементы.НадписьНетОшибок.Видимость = Ложь;
		Элементы.ГруппаСобытия.Видимость = Истина;
		Элементы.ДекорацияОтступ.Видимость = Истина;
		Элементы.ГруппаГоризонтальнаяСредняя.Видимость = Истина;
		
	ИначеЕсли ВсегоОшибок = 0 И ВсегоПредупреждений = 0 Тогда 
		
		Элементы.ГруппаСобытия.Заголовок = "Проверка завершена, ошибок не обнаружено";		
		Элементы.ГруппаСобытия.ЦветТекстаЗаголовка = Новый Цвет(0, 128, 0);
		
		Элементы.ГруппаИнформация.ОтображатьЗаголовок = Ложь;
		Элементы.ГруппаИнформация.Отображение = ОтображениеОбычнойГруппы.Нет;
		Элементы.НадписьНетОшибок.Видимость = Истина;
		Элементы.ГруппаСобытия.Видимость = Истина;
		Элементы.ГруппаГоризонтальнаяСредняя.Видимость = Ложь;
		Элементы.ДекорацияОтступ.Видимость = Ложь;
		Элементы.ТелефонСлужбыПоддержки.Видимость = Истина;
		
	КонецЕсли;	
	
	Элементы.ВыполнитьПроверку.Доступность = Истина;
	
КонецПроцедуры

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

#Область СобытияФормы

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Перем ИспользуетсяОднаОрганизация, ОсновнаяОрганизация;
	
	//Константа из мастера
	КоличествоДнейЗаКотороеНужноПредупреждатьОбИстеченииСрока = 30;
	
	ЕстьРеквизитОрганизацииНаименованиеСокращенное =
		(Метаданные.Справочники.Организации.Реквизиты.Найти("НаименованиеСокращенное") <> Неопределено);
	
	Параметры.Тестирование = Ложь;
	Параметры.ХОХост = "reputils.1c.ru"; //https://reputils.1c.ru/static/online_stats.json
	
	ОчиститьФорму();
	Элементы.ВыполнитьПроверку.Доступность = Истина;
	
	Обработка = ДокументооборотСКО.ПолучитьОбработкуЭДО();
	ТипОбъекта = Обработка.ПутьКОбъекту;
	ПолучитьЗначенияНастроек(ИспользуетсяОднаОрганизация, ОсновнаяОрганизация);
		
	Если (НЕ ОсновнаяОрганизация.Пустая()) И (ИспользуетсяОднаОрганизация) Тогда 
		Учетка = ПолучитьУчетнуюЗапись(ОсновнаяОрганизация);
		Если Учетка <> Неопределено И Учетка.ОбменВУниверсальномФормате И СпецоператорСвязиПоддерживается(Учетка.СпецоператорСвязи) Тогда 
			Организация = ОсновнаяОрганизация;
			Элементы.Организация.СписокВыбора.Добавить(ОсновнаяОрганизация);
			Элементы.Организация.Видимость = Ложь;
			ОбновитьЭлементыПриИзмененииОрганизации();
			Возврат;
		КонецЕсли;		
	КонецЕсли;
	
	МассивДоступныхОрганизаций = ПолучитьДоступныеОрганизации();		
	Элементы.Организация.СписокВыбора.ЗагрузитьЗначения(МассивДоступныхОрганизаций);		
	Для Каждого Эл Из Элементы.Организация.СписокВыбора Цикл
		МестоХраненияКлюча = КриптографияЭДКОКлиентСервер.КонтекстМоделиХраненияКлюча(Эл.Значение.Ссылка);
		Если КриптографияЭДКОКлиентСервер.ЭтоПодписьСервиса(МестоХраненияКлюча) Тогда
			Эл.Представление = Строка(Эл.Значение) + ", 1С-Fresh";
		ИначеЕсли КриптографияЭДКОКлиентСервер.ЭтоОблачнаяПодпись(МестоХраненияКлюча) Тогда
			Эл.Представление = Строка(Эл.Значение) + ", 1С:DSS";
		КонецЕсли;
	КонецЦикла;
	
	Если МассивДоступныхОрганизаций.Количество() = 1 Тогда 
		Организация = МассивДоступныхОрганизаций[0];
		Элементы.Организация.ТолькоПросмотр = Истина;
		ОбновитьЭлементыПриИзмененииОрганизации();
	ИначеЕсли МассивДоступныхОрганизаций.Количество() > 1 Тогда 
		Если НЕ ОсновнаяОрганизация.Пустая() Тогда 
			Если МассивДоступныхОрганизаций.Найти(ОсновнаяОрганизация) <> Неопределено Тогда 
				Организация = ОсновнаяОрганизация;
				ОбновитьЭлементыПриИзмененииОрганизации();
				Возврат;
			КонецЕсли;			
		КонецЕсли;			
	ИначеЕсли МассивДоступныхОрганизаций.Количество() = 0 Тогда 
	КонецЕсли;
					    			
КонецПроцедуры

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

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

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

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

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

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

#Область ПодготовкаИЗапускВсехПроверок

&НаКлиенте
Функция ВыполнитьПроверку(Вид, КриптокомпонентГотов = Ложь, ПроверкаПодключенийЗавершена = Ложь)
			
	Если Вид = 0 Тогда
		ОбновитьПрогресс(15 * Вид);
		ПоместитьИнформациюОбУчетнойЗаписиВОтчет();
		ВыполнитьПроверкуУчетнойЗаписи();
	ИначеЕсли Вид = 1 И РезультатыДиагностики.НастройкиДиагностики[Вид].Пометка Тогда
		ОбновитьПрогресс(15 * Вид);
		ВыполнитьПроверкуПодключений();
	ИначеЕсли Вид = 2 И РезультатыДиагностики.НастройкиДиагностики[Вид].Пометка Тогда
		Если ПроверкаПодключенийЗавершена Тогда 
			ОбновитьПрогресс(15 * Вид);
			ВыполнитьПроверкуКомпонентов();
		КонецЕсли;
	ИначеЕсли Вид = 3 И РезультатыДиагностики.НастройкиДиагностики[Вид].Пометка Тогда
		Если КриптокомпонентГотов Тогда 
			ОбновитьПрогресс(15 * Вид);
			ВыполнитьПроверкуСертификатов();
		КонецЕсли;
	ИначеЕсли Вид = 4 И РезультатыДиагностики.НастройкиДиагностики[Вид].Пометка Тогда
		Если КриптокомпонентГотов Тогда 
			ОбновитьПрогресс(15 * Вид);
			ВыполнитьПроверкуКриптоопераций();
		КонецЕсли;
	КонецЕсли;
	
	Если Вид = 2 И НЕ РезультатыДиагностики.НастройкиДиагностики[Вид].Пометка Тогда
		Если ПроверкаПодключенийЗавершена Тогда
			ВсеПроверкиЗавершены(1, Неопределено);
		КонецЕсли;
	КонецЕсли;
	
КонецФункции

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

&НаКлиентеНаСервереБезКонтекста
Функция РежимРаботы()
	
	СС = СтрокаСоединенияИнформационнойБазы();
	Если Найти(НРег(СС), "srvr=""") > 0 И Найти(НРег(СС), "ref=""") > 0 Тогда 
		Возврат 0; //"Серверный";
	ИначеЕсли Найти(НРег(СС), "file=""") > 0 Тогда 
		Возврат 1; //"Файловый";
	ИначеЕсли Найти(НРег(СС), "ws=""") > 0 Тогда 
		Возврат 2; //"Веб-сервер";
	Иначе
		Возврат 9; //"Не удалось определить";
	КонецЕсли;
	
КонецФункции
	
&НаКлиенте
Функция ПоместитьИнформациюОбУчетнойЗаписиВОтчет()
	
	ОрганизацияКлиент = РезультатыДиагностики.Параметры.Организация;
	УчетнаяЗаписьОбменаКлиент = РезультатыДиагностики.Параметры.УчетнаяЗаписьОбмена;
	МестоХраненияКлюча = КриптографияЭДКОКлиентСервер.КонтекстМоделиХраненияКлюча(РезультатыДиагностики.Параметры);
	ДополнительныеРеквизитыУчетнойЗаписи = РезультатыДиагностики.Параметры.ДополнительныеРеквизитыУчетнойЗаписи;
	
	РегНомерПФР = "";
	
	Если ДополнительныеРеквизитыУчетнойЗаписи <> Неопределено Тогда
		РегНомерПФР = ДополнительныеРеквизитыУчетнойЗаписи.РегНомерПФР;
	КонецЕсли;
	
	РезультатыДиагностики.Отчет.ДополнительнаяИнформация.Вставить(
		"ПодключенныеНаправления", 
		РезультатыДиагностики.Параметры.ДополнительныеРеквизитыУчетнойЗаписиПолучатели);
	
	КодРежима = РежимРаботы();
	Если КодРежима = 0 Тогда 
		РежимИБ = "Серверный";
	ИначеЕсли КодРежима = 1 Тогда 
		РежимИБ = "Файловый";
	ИначеЕсли КодРежима = 2 Тогда 
		РежимИБ = "Веб-сервер";
	Иначе
		РежимИБ = "Не удалось определить";
	КонецЕсли;
	
	РезультатыДиагностики.Отчет.ДополнительнаяИнформация.Вставить("РежимИБ", РежимИБ);
	
	РезультатыДиагностики.Отчет.Абонент.Вставить("НазваниеАбонента", ?(ЕстьРеквизитОрганизацииНаименованиеСокращенное,
		ОрганизацияКлиент.НаименованиеСокращенное, ОрганизацияКлиент.Наименование));
	РезультатыДиагностики.Отчет.Абонент.Вставить("ИП", РезультатыДиагностики.Параметры.ОрганизацияЯвляетсяИП);
	РезультатыДиагностики.Отчет.Абонент.Вставить("ИНН", СокрП(ОрганизацияКлиент.ИНН));
	РезультатыДиагностики.Отчет.Абонент.Вставить("КПП", СокрП(ОрганизацияКлиент.КПП));
	РезультатыДиагностики.Отчет.Абонент.Вставить("ОКПО", ОрганизацияКлиент.КодПоОКПО);
	РезультатыДиагностики.Отчет.Абонент.Вставить("РегНомерПФР", РегНомерПФР);
	РезультатыДиагностики.Отчет.Абонент.Вставить("УчетнаяЗапись", Новый Структура);
	
	РезультатыДиагностики.Отчет.Абонент.УчетнаяЗапись.Вставить("ИдентификаторАбонента", УчетнаяЗаписьОбменаКлиент.ИдентификаторАбонента);
	РезультатыДиагностики.Отчет.Абонент.УчетнаяЗапись.Вставить("ЛицензияНаименование", УчетнаяЗаписьОбменаКлиент.ЛицензияНаименование);
	РезультатыДиагностики.Отчет.Абонент.УчетнаяЗапись.Вставить("НачалоДействияЛицензииДата", УчетнаяЗаписьОбменаКлиент.ЛицензияДатаНачала);
	РезультатыДиагностики.Отчет.Абонент.УчетнаяЗапись.Вставить("ОкончаниеДействияЛицензииДата", УчетнаяЗаписьОбменаКлиент.ЛицензияДатаОкончания);
	РезультатыДиагностики.Отчет.Абонент.УчетнаяЗапись.Вставить("Криптопровайдер", РезультатыДиагностики.Автонастройка.ВладелецЭП.Криптопровайдер);		
	РезультатыДиагностики.Отчет.Абонент.УчетнаяЗапись.Вставить("КриптопровайдерXML", РезультатыДиагностики.Автонастройка.ВладелецЭП.КриптопровайдерXML);
	РезультатыДиагностики.Отчет.Абонент.УчетнаяЗапись.Вставить("ЭПВоблаке", УчетнаяЗаписьОбменаКлиент.ЭлектроннаяПодписьВМоделиСервиса);
	РезультатыДиагностики.Отчет.Абонент.УчетнаяЗапись.Вставить("МодельХраненияЗакрытогоКлюча", КриптографияЭДКОКлиентСервер.МодельХраненияЗакрытогоКлюча(МестоХраненияКлюча));
	
КонецФункции

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

	Возврат ДанныеАвтонастройки;
	
КонецФункции

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

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

&НаСервере
Функция JSONParse(СтрокаJSON)
	
	ЧтениеJSON = Новый ЧтениеJSON;
	Попытка
		ЧтениеJSON.УстановитьСтроку(СтрокаJSON); 
		СвойстваПолучателей = ПрочитатьJSON(ЧтениеJSON, Ложь);
	Исключение
		Возврат Новый Массив;
	КонецПопытки;
	
	Возврат СвойстваПолучателей;	

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

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

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

&НаСервере
Процедура УдалитьИзВременногоХранилищаНесколько(Адрес1, Адрес2 = Неопределено, Адрес3 = Неопределено, Адрес4 = Неопределено, Адрес5 = Неопределено)
	
	УдалитьИзВременногоХранилища(Адрес1);
	Если Адрес2 <> Неопределено Тогда 
		УдалитьИзВременногоХранилища(Адрес2);
	КонецЕсли;
	Если Адрес3 <> Неопределено Тогда 
		УдалитьИзВременногоХранилища(Адрес3);
	КонецЕсли;
	Если Адрес4 <> Неопределено Тогда 
		УдалитьИзВременногоХранилища(Адрес4);
	КонецЕсли;
	Если Адрес5 <> Неопределено Тогда 
		УдалитьИзВременногоХранилища(Адрес5);
	КонецЕсли;
	
КонецПроцедуры
	
&НаКлиенте
Процедура НачатьВызовPKCS7ПолучитьСвойстваПолучателейЗавершение(Результат, ПараметрыВызова, ВхПараметры) Экспорт
	
	Если ТипЗнч(Результат) = Тип("Строка") Тогда
		РезультатПриведенный = СтрЗаменить(Результат, "\u0000", ""); // обход ошибки компоненты
		СвойстваПолучателей = JSONParse(РезультатПриведенный);
		
		Для i = 0 по СвойстваПолучателей.Количество()-1 Цикл 
			СвойстваПолучателей[i].Вставить("found", Истина);
		КонецЦикла;
		
		РезультатыДиагностики.Отчет.ДополнительнаяИнформация["Нерасшифрованные"][ВхПараметры.ТекущийПроверяемый.Сообщение]
			.СодержимоеТранспортныхКонтейнеров[ВхПараметры.ТекущийПроверяемый.Контейнер]
			.Документы[ВхПараметры.ТекущийПроверяемый.Документ].Сведения = СвойстваПолучателей;
		
		ДокументКонтейнера = РезультатыДиагностики.Отчет.ДополнительнаяИнформация["Нерасшифрованные"][ВхПараметры.ТекущийПроверяемый.Сообщение]
			.СодержимоеТранспортныхКонтейнеров[ВхПараметры.ТекущийПроверяемый.Контейнер]
			.Документы[ВхПараметры.ТекущийПроверяемый.Документ];
		
		УдалитьИзВременногоХранилищаНесколько(ДокументКонтейнера.СодержимоеWC, ДокументКонтейнера.Содержимое)
	КонецЕсли;
	
	Оповещение = Новый ОписаниеОповещения("Пустое", ЭтотОбъект, Неопределено);
	Для Каждого ВременныйФайл Из ПараметрыВызова Цикл 
		ЭтоLinuxИлиMacOS = ОбщегоНазначенияКлиент.ЭтоLinuxКлиент() ИЛИ ОбщегоНазначенияКлиент.ЭтоMacOSКлиент();
		#Если ВебКлиент Тогда
			ЭтоВеб = Истина;
		#Иначе
			ЭтоВеб = Ложь;
		#КонецЕсли
		
		Если НЕ ЭтоВеб И НЕ ЭтоLinuxИлиMacOS Тогда
			НачатьУдалениеФайлов(Оповещение, ВременныйФайл);
		КонецЕсли;
	КонецЦикла;
	
	Оповещение = Новый ОписаниеОповещения("ИзвлечьСведенияИзКонтейнеров", ЭтотОбъект, ВхПараметры.Проверяемые);
	ВыполнитьОбработкуОповещения(Оповещение, Истина);
	
КонецПроцедуры

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

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

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

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

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

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

	#Если НЕ ВебКлиент Тогда 
	РезультатыДиагностики.Отчет.ДополнительнаяИнформация.Вставить("ИмяКомпьютера", ИмяКомпьютера());
		
	РезультатыДиагностики.Отчет.ДополнительнаяИнформация.Вставить("АнтивирусноеПО", Новый Массив);
	ДобавитьИнформациюОбАнтивирусах(РезультатыДиагностики.Отчет.ДополнительнаяИнформация["АнтивирусноеПО"]);
	ДобавитьИнформациюОВерсияхКриптопровайдеров(РезультатыДиагностики.Отчет.ДополнительнаяИнформация);
			
	РезультатыДиагностики.Отчет.ДополнительнаяИнформация.Вставить("РазрядностьОС", ИнформацияОРазрядностиОС());
	#КонецЕсли	
		
	Экраны = ПолучитьИнформациюЭкрановКлиента();
	Всего = 0;
	Для Каждого Экран из Экраны Цикл 		
		Шаблон = "%1 x %2, %3 DPI";
		ОписаниеЭкрана = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, 
						Формат(Экран.Ширина, "ЧДЦ=; ЧГ="),
						Формат(Экран.Высота, "ЧДЦ=; ЧГ="),
						Экран.DPI);

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

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

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

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

&НаКлиенте
Функция ПолучитьНастройкуСлужбы(Знач Путь)
	
	WshShell = Неопределено;
	#Если НЕ МобильныйКлиент Тогда
		Попытка
			WshShell = Новый COMОбъект("WScript.Shell");
		Исключение
		КонецПопытки;
	#КонецЕсли
	
	Если WshShell = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ПолныйПуть = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\"+Путь;	
	ПолныйПуть = СтрЗаменить(ПолныйПуть, "HKEY_LOCAL_MACHINE", "HKLM");
		
	Настройка = Новый Структура("Start, ImagePath, DisplayName, Группа, Запущен",,,,, Ложь);
	
	Попытка
		Значение1 = WshShell.RegRead(ПолныйПуть + "\Start");
	Исключение
		Значение1 = -1;
	КонецПопытки;
		
	Попытка
		Значение2 = WshShell.RegRead(ПолныйПуть + "\ImagePath");
	Исключение
		Если Значение1 = -1 Тогда 
			Возврат Неопределено;
		КонецЕсли;
		Значение2 = "";
	КонецПопытки;
	
	Попытка
		Значение3 = WshShell.RegRead(ПолныйПуть + "\DisplayName");
	Исключение
		Значение3 = "";
	КонецПопытки;
	
	Если Лев(Значение3, 1) = "@" Тогда 
		Значение3 = Путь;
	КонецЕсли;
	
	Настройка.Start = Значение1;
	Настройка.ImagePath = Значение2;
	Настройка.DisplayName = Значение3;
	
	ЭтоLinuxИлиMacOS = ОбщегоНазначенияКлиент.ЭтоLinuxКлиент() ИЛИ ОбщегоНазначенияКлиент.ЭтоMacOSКлиент();
	#Если ВебКлиент Тогда
		ЭтоВеб = Истина;
	#Иначе
		ЭтоВеб = Ложь;
	#КонецЕсли
	
	Если ЭтоВеб ИЛИ ЭтоLinuxИлиMacOS Тогда
		Временный = "";
		Возврат Неопределено;
	Иначе
		// предотвращение ошибки автоматической проверки ПолучитьИмяВременногоФайла()
		#Если НЕ ВебКлиент Тогда
			Временный = ПолучитьИмяВременногоФайла(".q");
		#КонецЕсли
	КонецЕсли;
	
	WshShell.Run("cmd.exe /c sc.exe queryex " + Путь + " >""" + Временный+"""", 0 , true);
	
	Состояние = "";
	
	Текст = Новый ТекстовыйДокумент;
	Текст.Прочитать(Временный, "cp866");
	Для ш = 1 по Текст.КоличествоСтрок() Цикл 
		Стр = Текст.ПолучитьСтроку(ш-1);
		Если Найти(ВРег(Стр), " STATE") > 0 ИЛИ Найти(ВРег(Стр), " СОСТОЯНИЕ") > 0 Тогда 
			Состояние = СокрЛП(Сред(Стр, Найти(Стр, ":")+1));
			Прервать;
		КонецЕсли;
	КонецЦикла;
	УдалитьФайлы(Временный);
	
	Если Найти(Состояние, "RUNNING") > 0 ИЛИ Найти(ВРег(Состояние), "ЗАПУЩЕН") > 0 Тогда 
		Настройка.Запущен = Истина;
	КонецЕсли;

	Возврат Настройка;
	
КонецФункции

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

&НаКлиенте
Процедура ДобавитьИнформациюОбАнтивирусах(Куда)
			
	// Брандмауэр Windows 7
	Настройка = ПолучитьНастройкуСлужбы("MpsSvc");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Брандмауэр Windows");
	
	// Microsoft Security Essentials
	Настройка = ПолучитьНастройкуСлужбы("MsMpSvc");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Microsoft Security Essentials");
		
	// Общий доступ к подключению к Интернету (ICS)
	Настройка = ПолучитьНастройкуСлужбы("SharedAccess");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Общий доступ к подключению к Интернету (ICS)");
	
	// Защитник Windows 7
	Настройка = ПолучитьНастройкуСлужбы("WinDefend");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Защитник Windows");
	
	// Dr.Web	
	Настройка = ПолучитьНастройкуСлужбы("SPIDER");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Dr.Web");
	Настройка = ПолучитьНастройкуСлужбы("spidernt");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Dr.Web");
	Настройка = ПолучитьНастройкуСлужбы("drwebnet");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Dr.Web");
	Настройка = ПолучитьНастройкуСлужбы("DrWebAVService");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Dr.Web");
	Настройка = ПолучитьНастройкуСлужбы("DrWebFwSvc");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Dr.Web");
	Настройка = ПолучитьНастройкуСлужбы("DrWebNetFilter");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Dr.Web");
	Настройка = ПолучитьНастройкуСлужбы("DrWebEngine");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Dr.Web");
	Настройка = ПолучитьНастройкуСлужбы("DrWebLwf");	
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Dr.Web");
	
	// ESET NOD32
	Настройка = ПолучитьНастройкуСлужбы("ekrn");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "ESET NOD32");
	Настройка = ПолучитьНастройкуСлужбы("epfw");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "ESET NOD32");
	Настройка = ПолучитьНастройкуСлужбы("epfwtdi");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "ESET NOD32");
	Настройка = ПолучитьНастройкуСлужбы("eamon");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "ESET NOD32");
	Настройка = ПолучитьНастройкуСлужбы("easdrv");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "ESET NOD32");
	Настройка = ПолучитьНастройкуСлужбы("ERA_HTTP_SERVER");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "ESET NOD32");
	Настройка = ПолучитьНастройкуСлужбы("ERA_SERVER");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "ESET NOD32");
		
	//Avira		
	Настройка = ПолучитьНастройкуСлужбы("avfwot");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Avira");
	Настройка = ПолучитьНастройкуСлужбы("avnetflt");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Avira");
	Настройка = ПолучитьНастройкуСлужбы("AntiVirFirewallService");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Avira");
	Настройка = ПолучитьНастройкуСлужбы("AntiVirMailService");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Avira");
	Настройка = ПолучитьНастройкуСлужбы("AntiVirService");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Avira");
	Настройка = ПолучитьНастройкуСлужбы("AntiVirWebService");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Avira");
	
	//Avast!
	Настройка = ПолучитьНастройкуСлужбы("aswTdi");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Avast!");
	Настройка = ПолучитьНастройкуСлужбы("avast! Web Scanner");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Avast!");
	Настройка = ПолучитьНастройкуСлужбы("avast! Firewall");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Avast!");
	Настройка = ПолучитьНастройкуСлужбы("avast! Antivirus");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Avast!");
	
	// Kaspersky
	Настройка = ПолучитьНастройкуСлужбы("klif");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Kaspersky");
	Настройка = ПолучитьНастройкуСлужбы("klflt");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Kaspersky");
	Настройка = ПолучитьНастройкуСлужбы("kltdi");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Kaspersky");
	Настройка = ПолучитьНастройкуСлужбы("klmouflt");	
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Kaspersky");
	Настройка = ПолучитьНастройкуСлужбы("kavsvc");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Kaspersky");
	Настройка = ПолучитьНастройкуСлужбы("klfltdev");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Kaspersky");
	Настройка = ПолучитьНастройкуСлужбы("klkbdflt");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Kaspersky");
	Настройка = ПолучитьНастройкуСлужбы("AVP");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Kaspersky");
	
	// Symantec
	Настройка = ПолучитьНастройкуСлужбы("SYMTDI");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Symantec");
	Настройка = ПолучитьНастройкуСлужбы("Teefer2");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Symantec");
	Настройка = ПолучитьНастройкуСлужбы("NAVENG");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Symantec");
	Настройка = ПолучитьНастройкуСлужбы("NAVEX15");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Symantec");
	
	//Trend Micro
	Настройка = ПолучитьНастройкуСлужбы("TMCM");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Trend Micro");
	Настройка = ПолучитьНастройкуСлужбы("tmactmon");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Trend Micro");
	Настройка = ПолучитьНастройкуСлужбы("tmevtmgr");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Trend Micro");
	Настройка = ПолучитьНастройкуСлужбы("tmcomm");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Trend Micro");
	Настройка = ПолучитьНастройкуСлужбы("Amsp");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Trend Micro");
	Настройка = ПолучитьНастройкуСлужбы("ds_agent");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Trend Micro");
	
	//Panda
	Настройка = ПолучитьНастройкуСлужбы("PavProc");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Panda");
	Настройка = ПолучитьНастройкуСлужбы("PavPrSrv");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Panda");
	Настройка = ПолучитьНастройкуСлужбы("ShldDrv");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Panda");
	Настройка = ПолучитьНастройкуСлужбы("PAVSRV");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Panda");
	Настройка = ПолучитьНастройкуСлужбы("PAVDRV");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Panda");
	Настройка = ПолучитьНастройкуСлужбы("PavFnSvr");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Panda");
	
	//F-Prot
	Настройка = ПолучитьНастройкуСлужбы("FPA_RTP");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "F-Prot");
	
	//F-Secure
	Настройка = ПолучитьНастройкуСлужбы("F-Secure HIPS");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "F-Secure");
	Настройка = ПолучитьНастройкуСлужбы("fsvista");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "F-Secure");
	
	//Emsisoft Anti-Malware
	Настройка = ПолучитьНастройкуСлужбы("a2acc");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Emsisoft");
	Настройка = ПолучитьНастройкуСлужбы("A2DDA");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Emsisoft");
	Настройка = ПолучитьНастройкуСлужбы("epp32");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Emsisoft");
	Настройка = ПолучитьНастройкуСлужбы("epp");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Emsisoft");
	Настройка = ПолучитьНастройкуСлужбы("epp64");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Emsisoft");
	Настройка = ПолучитьНастройкуСлужбы("a2antimalware");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Emsisoft");
	
	//Bitdefender 
	Настройка = ПолучитьНастройкуСлужбы("bdss");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Bitdefender");
	Настройка = ПолучитьНастройкуСлужбы("FILESpy");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Bitdefender");
	Настройка = ПолучитьНастройкуСлужбы("LIVESRV");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Bitdefender");
	Настройка = ПолучитьНастройкуСлужбы("VSSERV");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Bitdefender");
	Настройка = ПолучитьНастройкуСлужбы("XCOMM");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Bitdefender");
	Настройка = ПолучитьНастройкуСлужбы("BDESRV");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Bitdefender");
	
	//McAfee
	Настройка = ПолучитьНастройкуСлужбы("McShield");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "McAfee");
	Настройка = ПолучитьНастройкуСлужбы("McTaskManager");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "McAfee");
	Настройка = ПолучитьНастройкуСлужбы("mfeapfk");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "McAfee");
	Настройка = ПолучитьНастройкуСлужбы("mfehidk");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "McAfee");
	Настройка = ПолучитьНастройкуСлужбы("mferkdet");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "McAfee");
	Настройка = ПолучитьНастройкуСлужбы("mfevtp");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "McAfee");
	
	//Comodo
	Настройка = ПолучитьНастройкуСлужбы("CmdAgent");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Comodo");
	Настройка = ПолучитьНастройкуСлужбы("cmdGuard");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Comodo");
	Настройка = ПолучитьНастройкуСлужбы("Inspect");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Comodo");
	
	//Webroot SecureAnywhere
	Настройка = ПолучитьНастройкуСлужбы("WRSVC");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Webroot");
	
	//G Data Internet Security
	Настройка = ПолучитьНастройкуСлужбы("AVKService");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "G Data");
	
	//K7 Computing
	Настройка = ПолучитьНастройкуСлужбы("K7CrvSvc");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "K7 Computing");
	Настройка = ПолучитьНастройкуСлужбы("K7EmlPxy");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "K7 Computing");
	Настройка = ПолучитьНастройкуСлужбы("K7FWSrvc");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "K7 Computing");
	Настройка = ПолучитьНастройкуСлужбы("K7RKScan");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "K7 Computing");
	Настройка = ПолучитьНастройкуСлужбы("K7Sentry");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "K7 Computing");
	
	//AVG
	Настройка = ПолучитьНастройкуСлужбы("Avg");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "AVG");
	Настройка = ПолучитьНастройкуСлужбы("avgfws8");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "AVG");
	Настройка = ПолучитьНастройкуСлужбы("avg8emc");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "AVG");
	Настройка = ПолучитьНастройкуСлужбы("AvgTdiA");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "AVG");
	Настройка = ПолучитьНастройкуСлужбы("avgfws9");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "AVG");
	Настройка = ПолучитьНастройкуСлужбы("avg9wd");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "AVG");
	Настройка = ПолучитьНастройкуСлужбы("AvgTdiX");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "AVG");
	Настройка = ПолучитьНастройкуСлужбы("AVGIDSFiltervtx");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "AVG");
	Настройка = ПолучитьНастройкуСлужбы("AVGIDSDrivervtx");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "AVG");
	Настройка = ПолучитьНастройкуСлужбы("AVGIDSFiltervta");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "AVG");
	Настройка = ПолучитьНастройкуСлужбы("AVGIDSDrivervta");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "AVG");
	Настройка = ПолучитьНастройкуСлужбы("AVGIDSFilterw7a");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "AVG");
	Настройка = ПолучитьНастройкуСлужбы("AVGIDSFilterw7x");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "AVG");
	
	//ClamAV
	Настройка = ПолучитьНастройкуСлужбы("clamantivirus");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "ClamAV");
	Настройка = ПолучитьНастройкуСлужбы("ClamD");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "ClamAV");
	
	//Malwarebytes
	Настройка = ПолучитьНастройкуСлужбы("MBAMProtector");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Malwarebytes");
	Настройка = ПолучитьНастройкуСлужбы("MBAMScheduler");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Malwarebytes");
	Настройка = ПолучитьНастройкуСлужбы("MBAMService");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Malwarebytes");
	
	//BullGuard
	Настройка = ПолучитьНастройкуСлужбы("FILESpy");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "BullGuard");
	Настройка = ПолучитьНастройкуСлужбы("FILESpy5");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "BullGuard");
	Настройка = ПолучитьНастройкуСлужбы("Wpm");	
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "BullGuard");
	Настройка = ПолучитьНастройкуСлужбы("BDFILESPY");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "BullGuard");
	
	//Quick Heal
	Настройка = ПолучитьНастройкуСлужбы("QuickHealCleanerSvc");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Quick Heal");
	Настройка = ПолучитьНастройкуСлужбы("Core Mail Protection");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Quick Heal");
	Настройка = ПолучитьНастройкуСлужбы("Core Scanning Server");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Quick Heal");
	
	//ThreatTrack / VIPRE
	Настройка = ПолучитьНастройкуСлужбы("SBAMSvc");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "ThreatTrack");
	Настройка = ПолучитьНастройкуСлужбы("SBAPIFS");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "ThreatTrack");
	Настройка = ПолучитьНастройкуСлужбы("SBEMI");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "ThreatTrack");
	Настройка = ПолучитьНастройкуСлужбы("SBFW");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "ThreatTrack");
	Настройка = ПолучитьНастройкуСлужбы("SBFWIMCL");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "ThreatTrack");
	Настройка = ПолучитьНастройкуСлужбы("SBFWIMCLMP");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "ThreatTrack");
	Настройка = ПолучитьНастройкуСлужбы("Gfiark");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "ThreatTrack");
	Настройка = ПолучитьНастройкуСлужбы("SBPIMSVC");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "ThreatTrack");
	Настройка = ПолучитьНастройкуСлужбы("SpamCure");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "ThreatTrack");
	Настройка = ПолучитьНастройкуСлужбы("NinjaWatchSvc");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "ThreatTrack");
	
	//360 Total Security
	Настройка = ПолучитьНастройкуСлужбы("QHActiveDefense");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "360 Total Security");
	
	//AhnLab
	Настройка = ПолучитьНастройкуСлужбы("paSvc");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "AhnLab");
	
	//MicroWorld
	Настройка = ПолучитьНастройкуСлужбы("EconService");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "MicroWorld");
	Настройка = ПолучитьНастройкуСлужбы("ProcObsrv");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "MicroWorld");
	Настройка = ПолучитьНастройкуСлужбы("ProcObsrves");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "MicroWorld");
	Настройка = ПолучитьНастройкуСлужбы("ProcObsrvesx");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "MicroWorld");
	
	//Baidu
	Настройка = ПолучитьНастройкуСлужбы("BaiduHips");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Baidu");
	Настройка = ПолучитьНастройкуСлужбы("BDKVRTP");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Baidu");
	Настройка = ПолучитьНастройкуСлужбы("BDDefense");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Baidu");
	Настройка = ПолучитьНастройкуСлужбы("BDMNetMon");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Baidu");
	Настройка = ПолучитьНастройкуСлужбы("BDMRTP");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Baidu");
	Настройка = ПолучитьНастройкуСлужбы("BDSGRTP");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Baidu");
	Настройка = ПолучитьНастройкуСлужбы("bd0001");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Baidu");
	Настройка = ПолучитьНастройкуСлужбы("bd0002");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Baidu");
	Настройка = ПолучитьНастройкуСлужбы("bd0003");
	ДобавитьИнформациюОбАнтивирусахЕслиЕсть(Куда, Настройка, "Baidu");
	
КонецПроцедуры

&НаКлиенте
Функция ИнформацияОРазрядностиОС()
	
	WshShell = Неопределено;
	#Если НЕ МобильныйКлиент Тогда
		Попытка
			WshShell = Новый COMОбъект("WScript.Shell");
		Исключение
		КонецПопытки;
	#КонецЕсли
	
	Если WshShell = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Путь1 = "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\PROCESSOR_ARCHITECTURE";
	
	Попытка
		Значение = WshShell.RegRead(Путь1);
	Исключение
		Значение = Неопределено;
	КонецПопытки;
	Если Значение = "AMD64" Тогда 
		Значение = 64;
	Иначе
		Значение = 32;
	КонецЕсли;
	
	Возврат Значение;
	
КонецФункции

&НаКлиенте
Процедура ДобавитьИнформациюОВерсияхКриптопровайдеров(Куда)
	
	WshShell = Неопределено;
	#Если НЕ МобильныйКлиент Тогда
		Попытка
			WshShell = Новый COMОбъект("WScript.Shell");
		Исключение
		КонецПопытки;
	#КонецЕсли
	
	Если WshShell = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Путь1 = "HKLM\SOFTWARE\Crypto Pro\Settings\Version";
	Путь2 = "HKLM\SOFTWARE\Wow6432Node\Crypto Pro\Settings\Version";
	
	Путь3 = "HKLM\SOFTWARE\InfoTeCS\Setup\Products\InfoTeCS-CSP\ProductVersion";
	Путь4 = "HKLM\SOFTWARE\Wow6432Node\InfoTeCS\Setup\Products\InfoTeCS-CSP\ProductVersion";
	
	Попытка
		Значение = WshShell.RegRead(Путь1);
		Куда.Вставить("ВерсияCryptoPro", Значение);
	Исключение
	КонецПопытки;
	
	Попытка
		Значение = WshShell.RegRead(Путь2);
		Куда.Вставить("ВерсияCryptoPro", Значение);
	Исключение
	КонецПопытки;
	
	Попытка
		Значение = WshShell.RegRead(Путь3);
		Куда.Вставить("ВерсияViPNet", Значение);
	Исключение
	КонецПопытки;
	
	Попытка
		Значение = WshShell.RegRead(Путь4);
		Куда.Вставить("ВерсияViPNet", Значение);
	Исключение
	КонецПопытки;
	
КонецПроцедуры

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

&НаСервереБезКонтекста
Функция НормализоватьФорматСерийногоНомера(Знач СерийныйНомер)
	
	Нормализованный = "";
	СерийныйНомер = СокрЛП(СерийныйНомер);
	Пока СтрДлина(СерийныйНомер) > 0 Цикл
		Нормализованный = Прав(СерийныйНомер, 2) + ?(Нормализованный = "", "", " ") + Нормализованный;
		СерийныйНомер = Лев(СерийныйНомер, СтрДлина(СерийныйНомер) - 2);
	КонецЦикла;
	
	Возврат Нормализованный;
	
КонецФункции

&НаСервереБезКонтекста
Функция ИзвлечьСведенияИзЗашифрованногоПакета(ИмяФайла, РабочийКаталог, РазмерДокумента)
	
	WshShell = Неопределено;
	#Если НЕ МобильныйКлиент Тогда
		Попытка
			WshShell = Новый COMОбъект("WScript.Shell");
		Исключение
		КонецПопытки;
	#КонецЕсли
	
	Если WshShell = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	РазмерДокумента = 0;
	
	Файл = Новый Файл(РабочийКаталог + ИмяФайла);
	Если Не Файл.Существует() Тогда 
		Возврат Неопределено;
	КонецЕсли;
	
	РазмерДокумента = Файл.Размер();
	
	Приложение = "%SystemRoot%\system32\certutil.exe";
	
	КоманднаяСтрока = "cmd.exe /C ""%1";
	КоманднаяСтрока = СтрЗаменить(КоманднаяСтрока, "%1", Приложение);
	
	ПараметрыКоманднойСтроки = " -dump %1> %1.dump""";
		
	КодЗавершения = 0;	
	Если WshShell = Неопределено Тогда 
		ПараметрыКоманднойСтроки = СтрЗаменить(ПараметрыКоманднойСтроки, "%1", ИмяФайла);
		ЗапуститьПриложение(КоманднаяСтрока + ПараметрыКоманднойСтроки, РабочийКаталог, Истина, КодЗавершения);
	Иначе
		ПараметрыКоманднойСтроки = СтрЗаменить(ПараметрыКоманднойСтроки, "%1", РабочийКаталог + ИмяФайла);
		КодЗавершения = WshShell.Run(КоманднаяСтрока + ПараметрыКоманднойСтроки, 0, true);
	КонецЕсли;
	
	Если КодЗавершения <> 0 Тогда 
		Возврат Неопределено;
	КонецЕсли;
	
	ФайлРезультата = РабочийКаталог + ИмяФайла + ".dump";
	
	Файл = Новый Файл(ФайлРезультата);
	Если Не Файл.Существует() Тогда 
		Возврат Неопределено;
	КонецЕсли;
	
	Получатели = Новый Массив;
	
	Чтение = Новый ЧтениеТекста;
	Чтение.Открыть(ФайлРезультата, "windows-1251");
	СтрФайла = Чтение.ПрочитатьСтроку();
	Пока СтрФайла <> Неопределено Цикл 
		Если Найти(ВРег(СтрФайла), "CERT_ID_ISSUER_SERIAL_NUMBER") > 0 Тогда 
			СтрСерийныйНомер = Чтение.ПрочитатьСтроку();
			СтрПоставщик = Чтение.ПрочитатьСтроку();
			
			Если Найти(СтрСерийныйНомер, ": ") > 0 Тогда 
				СтрСерийныйНомер = Сред(СтрСерийныйНомер, Найти(СтрСерийныйНомер, ": ") + 2);
			Иначе
				СтрСерийныйНомер = "";
			КонецЕсли;
			
			Если Найти(СтрПоставщик, ": ") > 0 Тогда 
				СтрПоставщик = Сред(СтрПоставщик, Найти(СтрПоставщик, ": ") + 2);
			Иначе
				СтрПоставщик = "";
			КонецЕсли;
			
			Получатель = Новый Структура("issuer, serial_number, found", СтрПоставщик, НормализоватьФорматСерийногоНомера(СтрСерийныйНомер), Ложь);
			Получатели.Добавить(Получатель);
		КонецЕсли;
		СтрФайла = Чтение.ПрочитатьСтроку();
	КонецЦикла;
	
	Возврат Получатели;
	
КонецФункции

&НаСервереБезКонтекста
Функция ПолучитьДанныеТКС(ТССсылка, УИД)
	
	ИспользоватьCertUtil = Ложь;
	
	СисИнфо = Новый СистемнаяИнформация;
	Если СисИнфо.ТипПлатформы = ТипПлатформы.Windows_x86
		Или СисИнфо.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда 
		РазделительПути = "\";
		ИспользоватьCertUtil = Истина;
	Иначе
		РазделительПути = "/";
	КонецЕсли;

	КаталогКонтейнеров = "";
	
	ОграничениеРазмераДокументаВКонтейнере = 5 * 1024 * 1024;
	ТранспортныеКонтейнеры = Новый Массив;
	
	Отбор = Новый Структура("ТранспортноеСообщение", ТССсылка);
	ВсеТК = РегистрыСведений.ТранспортныеКонтейнеры.Выбрать(Отбор);
	Пока ВсеТК.Следующий() Цикл 
		ДанныеТК = ВсеТК.Данные.Получить();
		Если ТипЗнч(ДанныеТК) <> Тип("ДвоичныеДанные") Тогда 
			Продолжить;
		КонецЕсли;
		
		Если КаталогКонтейнеров = "" Тогда 
			КаталогКонтейнеров = ПолучитьИмяВременногоФайла("containers");
			СоздатьКаталог(КаталогКонтейнеров);
			КаталогКонтейнеров = КаталогКонтейнеров + РазделительПути;
		КонецЕсли;
	
		ПрефиксИмени = Формат(ТранспортныеКонтейнеры.Количество(), "ЧЦ=4; ЧДЦ=; ЧН=; ЧВН=; ЧГ="); //0000-9999
		ИмяФайла = ПрефиксИмени + ".zip";
		
		ПолныйПуть = КаталогКонтейнеров + ИмяФайла;
		КаталогКонтейнера = КаталогКонтейнеров + ПрефиксИмени + РазделительПути;
		
		РазмерКонтейнера = ДанныеТК.Размер();
		ДанныеТК.Записать(ПолныйПуть);
		
		Контейнер = Новый Структура("ОшибкаКонтейнера, РазмерКонтейнера, Документы", 0, РазмерКонтейнера, Новый Массив);
		ТранспортныеКонтейнеры.Добавить(Контейнер);
		Попытка
			ЧтениеАрхива = Новый ЧтениеZipФайла(ПолныйПуть);
		Исключение
			ТранспортныеКонтейнеры[ТранспортныеКонтейнеры.Количество()-1].ОшибкаКонтейнера = 1;
			Продолжить;
		КонецПопытки;
		
		ФорматДокументооборота = Неопределено;
		ИмяФайлаОписания = "packageDescription.xml";
		ФайлОписания = ЧтениеАрхива.Элементы.Найти(ИмяФайлаОписания);
		Если ФайлОписания = Неопределено Тогда
			РеквизитыЦиклаОбмена = ?(ЗначениеЗаполнено(ТССсылка.ЦиклОбмена),
				ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ТССсылка.ЦиклОбмена, "Вид, ФорматДокументооборота"),
				Новый Структура("Вид, ФорматДокументооборота", Неопределено, Неопределено));
			Если РеквизитыЦиклаОбмена.Вид = Перечисления.ТипыКонтролирующихОрганов.ПФР
			И (НЕ ЗначениеЗаполнено(РеквизитыЦиклаОбмена.ФорматДокументооборота) ИЛИ
			РеквизитыЦиклаОбмена.ФорматДокументооборота = Перечисления.ФорматыДокументооборотаСПФР.ЭДОК)
			ИЛИ ТССсылка.Тип = Перечисления.ТипыТранспортныхСообщений.ПервичноеСообщениеСодержащееОтчетностьПФР
			ИЛИ ТССсылка.Тип = Перечисления.ТипыТранспортныхСообщений.ПодтверждениеПолученияОтчетностиПФР
			ИЛИ ТССсылка.Тип = Перечисления.ТипыТранспортныхСообщений.ПротоколПФР
			ИЛИ ТССсылка.Тип = Перечисления.ТипыТранспортныхСообщений.ПротоколКвитанцияПФР
			ИЛИ ТССсылка.Тип = Перечисления.ТипыТранспортныхСообщений.ПисьмоИсходящееКвитанцияПФР
			ИЛИ ТССсылка.Тип = Перечисления.ТипыТранспортныхСообщений.УведомлениеОбОшибкеПФР
			ИЛИ ТССсылка.Тип = Перечисления.ТипыТранспортныхСообщений.ПодтверждениеПолученияЗапросаПФР
			ИЛИ ТССсылка.Тип = Перечисления.ТипыТранспортныхСообщений.ОтветНаЗапросПФР Тогда
				// обход ошибки платформы для архива zip с кодировкой имен файлов cp866, сформированного в Linux
				Попытка
					ЧтениеАрхива.Закрыть();
					МассивОписанийИДанных = ОбщегоНазначенияЭДКО.МассивОписанийИДанныхZipФайла(ПолныйПуть);
					Если МассивОписанийИДанных <> Неопределено Тогда
						ОперацииСФайламиЭДКО.УдалитьВременныйФайл(ПолныйПуть);
						ПолныйПуть = ПолныйПуть + ".zip";
						ОбщегоНазначенияЭДКО.СформироватьZip(МассивОписанийИДанных, ПолныйПуть);
					КонецЕсли;
					ЧтениеАрхива = Новый ЧтениеZipФайла(ПолныйПуть);
				Исключение
					ТранспортныеКонтейнеры[ТранспортныеКонтейнеры.Количество()-1].ОшибкаКонтейнера = 2;
					Продолжить;
				КонецПопытки;
			
				Для каждого ЭлементКонтейнера Из ЧтениеАрхива.Элементы Цикл
					ИмяФайлаВРег = СокрЛП(ЭлементКонтейнера.ИмяБезРасширения);
					ИмяФайлаВРег = ВРег(ИмяФайлаВРег);
					РасширениеФайла = СокрЛП(ЭлементКонтейнера.Расширение);
					
					Если (Лев(ИмяФайлаВРег, 4) = "ПФР_" ИЛИ Лев(ИмяФайлаВРег, 4) = "СФР_")
						И СтрНайти(ИмяФайлаВРег, "_ОСП_") > 0 И нрег(РасширениеФайла) = "xml" Тогда
						
						ИмяФайлаОписания = ЭлементКонтейнера.Имя;
						ФайлОписания = ЭлементКонтейнера;
						ФорматДокументооборота = Перечисления.ФорматыДокументооборотаСПФР.ЭДОК;
						Прервать;
					КонецЕсли;
				КонецЦикла;
			КонецЕсли;
			
			Если ФайлОписания = Неопределено Тогда
				ТранспортныеКонтейнеры[ТранспортныеКонтейнеры.Количество()-1].ОшибкаКонтейнера = 2;
				Продолжить;
			КонецЕсли;
		КонецЕсли;
		
		Попытка
			ЧтениеАрхива.ИзвлечьВсе(КаталогКонтейнера, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
		Исключение
			ТранспортныеКонтейнеры[ТранспортныеКонтейнеры.Количество()-1].ОшибкаКонтейнера = 3;
			Продолжить;
		КонецПопытки;
		
		ЧтениеОписания = Новый ЧтениеXML;
		ЧтениеОписания.ОткрытьФайл(КаталогКонтейнера + ИмяФайлаОписания);
		Описание = ФабрикаXDTO.ПрочитатьXML(ЧтениеОписания);
		ЧтениеОписания.Закрыть();
		
		Если ТипЗнч(Описание) <> Тип("ОбъектXDTO") Тогда
			ТранспортныеКонтейнеры[ТранспортныеКонтейнеры.Количество()-1].ОшибкаКонтейнера = 4;
			Продолжить;
		КонецЕсли;
		
		Если ФорматДокументооборота = Перечисления.ФорматыДокументооборотаСПФР.ЭДОК Тогда
			КонтекстЭДОСервер = ДокументооборотСКО.ПолучитьОбработкуЭДО();
			Если КонтекстЭДОСервер = Неопределено Тогда
				Продолжить;
			КонецЕсли;
			
			ДеревоОписанияСведений = КонтекстЭДОСервер.ЗагрузитьXMLВДеревоЗначений(КаталогКонтейнера + ИмяФайлаОписания);
			Если ДеревоОписанияСведений = Неопределено Тогда
				Продолжить;
			КонецЕсли;
			
			УзелОСП = КонтекстЭДОСервер.НайтиСтрокиДереваЗначений(ДеревоОписанияСведений,,, "ОСП", "Э");
			Если НЕ ЗначениеЗаполнено(УзелОСП) Тогда
				ТранспортныеКонтейнеры[ТранспортныеКонтейнеры.Количество()-1].ОшибкаКонтейнера = 5;
				Продолжить;
			КонецЕсли;
			
			УзелЗашифровано = КонтекстЭДОСервер.НайтиСтрокиДереваЗначений(УзелОСП,,, "Зашифровано", "Э", Ложь);
			ДокументыЗашифрованы = ?(ЗначениеЗаполнено(УзелЗашифровано),
				КонтекстЭДОСервер.БулевоПоСтроке(УзелЗашифровано.Значение), Неопределено);
			
			УзлыДокумент = Новый Массив;
			КонтекстЭДОСервер.НайтиСтрокиДереваЗначений(УзелОСП,, УзлыДокумент, "Документ", "Э", Ложь);
			УзелДополнительныеДокументы = КонтекстЭДОСервер.НайтиСтрокиДереваЗначений(УзелОСП,,,
				"ДополнительныеДокументы", "Э", Ложь);
			УзлыДополнительныйДокумент = Неопределено;
			Если ЗначениеЗаполнено(УзелДополнительныеДокументы) Тогда
				УзлыДополнительныйДокумент = Новый Массив;
				КонтекстЭДОСервер.НайтиСтрокиДереваЗначений(УзелДополнительныеДокументы,,
					УзлыДополнительныйДокумент, "Документ", "Э", Ложь);
			КонецЕсли;
			
			Для НомерУзловДокументов = 1 По ?(УзлыДополнительныйДокумент = Неопределено, 1, 2) Цикл
				ЭтоДополнительныйДокумент = (НомерУзловДокументов = 2);
				Если ЭтоДополнительныйДокумент Тогда
					УзлыДокумент = УзлыДополнительныйДокумент;
				КонецЕсли;
				
				Для каждого УзелДокумент Из УзлыДокумент Цикл
					УзелКод = КонтекстЭДОСервер.НайтиСтрокиДереваЗначений(УзелДокумент,,, "Код", "Э", Ложь);
					КодДокумента = ?(ЗначениеЗаполнено(УзелКод), СокрЛП(УзелКод.Значение), "");
					
					УзелФайл = КонтекстЭДОСервер.НайтиСтрокиДереваЗначений(УзелДокумент,,, "Файл", "Э", Ложь);
					ИмяФайлаДокумента = ?(ЗначениеЗаполнено(УзелФайл), СокрЛП(УзелФайл.Значение), "");
					Если (ВРег(КодДокумента) = "УОД" ИЛИ ВРег(КодДокумента) = "УОПП" ИЛИ ВРег(КодДокумента) = "УОНД")
						И НЕ ЗначениеЗаполнено(УзелЗашифровано) И (нрег(Прав(ИмяФайлаДокумента, 4)) = ".enc") Тогда // Обход ошибки ПФР
						ИмяФайлаДокумента = Лев(ИмяФайлаДокумента, СтрДлина(ИмяФайлаДокумента) - 4);
					КонецЕсли;
					
					УзелТипФайла = КонтекстЭДОСервер.НайтиСтрокиДереваЗначений(УзелДокумент,,, "ТипФайла", "Э", Ложь);
					ТипФайлаДокумента = ?(ЗначениеЗаполнено(УзелТипФайла), СокрЛП(УзелТипФайла.Значение), "");
					Если ТипФайлаДокумента = "application/gzip" Тогда // Обход ошибки ПФР
						ТипФайлаДокумента = "application/xml";
					КонецЕсли;
					
					Если ДокументыЗашифрованы <> Неопределено Тогда
						ДокументЗашифрован = ДокументыЗашифрованы;
					Иначе
						РасширениеДокументаНРег = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ИмяФайлаДокумента).Расширение;
						РасширениеДокументаНРег = нрег(РасширениеДокументаНРег);
						ДокументЗашифрован = (РасширениеДокументаНРег = ".enc"
							ИЛИ (РасширениеДокументаНРег <> ".gz" И РасширениеДокументаНРег <> ".der"
							И КонтекстЭДОСервер.ТипСодержимогоПоИмениФайла(ИмяФайлаДокумента) =
							Перечисления.ТипыСодержимогоФайлов.Неизвестный));
					КонецЕсли;
					
					ИмяФайла = ИмяФайлаДокумента;
					
					ТипСодержимогоИРасширение = КонтекстЭДОСервер.ТипСодержимогоИРасширениеПоMIMEТипу(ТипФайлаДокумента);
					
					ПозицияРазделителя = СтрНайти(ИмяФайлаДокумента, ".");
					Если ПозицияРазделителя > 1 Тогда
						ИмяФайлаДокумента = Лев(ИмяФайлаДокумента, ПозицияРазделителя - 1);
					КонецЕсли;
					
					Если ЗначениеЗаполнено(ТипСодержимогоИРасширение.Расширение) Тогда
						ИмяФайлаДокумента = ИмяФайлаДокумента + "." + ТипСодержимогоИРасширение.Расширение;
					КонецЕсли;
					
					ИсходноеИмяФайла = ИмяФайлаДокумента;
					
					Если ДокументЗашифрован Тогда
						РазмерДокумента = 0;
						Если ИспользоватьCertUtil Тогда
							Сведения = ИзвлечьСведенияИзЗашифрованногоПакета(ИмяФайла, КаталогКонтейнера, РазмерДокумента);
						КонецЕсли;
						Если (Сведения = Неопределено) И (РазмерДокумента <= ОграничениеРазмераДокументаВКонтейнере) Тогда
							Сведения = Новый Массив;
							ДД = Новый ДвоичныеДанные(КаталогКонтейнера + ИмяФайла);
							РазмерДокумента = ДД.Размер();
							ДДBase64 = Base64Строка(ДД);
							Адрес = ПоместитьВоВременноеХранилище(ДД, УИД);
							Адрес2 = ПоместитьВоВременноеХранилище(ДДBase64, УИД);
						Иначе
							Адрес = Неопределено;
							Адрес2 = Неопределено;
						КонецЕсли;
						Если ИсходноеИмяФайла = Неопределено Или ИсходноеИмяФайла = "" Тогда
							ИсходноеИмяФайла = ИмяФайла;
						КонецЕсли;
						ЗашифрованныйДокумент = Новый Структура("Имя, Представление, Сведения", ИмяФайла, ИсходноеИмяФайла, Сведения);
						ЗашифрованныйДокумент.Вставить("ОшибкаДокумента", 0);
						Если РазмерДокумента > ОграничениеРазмераДокументаВКонтейнере Тогда
							ЗашифрованныйДокумент.ОшибкаДокумента = 1;
						КонецЕсли;
						ЗашифрованныйДокумент.Вставить("Содержимое", Адрес);
						ЗашифрованныйДокумент.Вставить("СодержимоеWC", Адрес2);
						ЗашифрованныйДокумент.Вставить("РазмерДокумента", РазмерДокумента);
						
						ТранспортныеКонтейнеры[ТранспортныеКонтейнеры.Количество()-1].Документы.Добавить(ЗашифрованныйДокумент);
					КонецЕсли;
				КонецЦикла;
			КонецЦикла;
			
		Иначе
			Если Не ЕстьСвойствоОбъектаXDTO(Описание, "документ") Тогда
				ТранспортныеКонтейнеры[ТранспортныеКонтейнеры.Количество()-1].ОшибкаКонтейнера = 5;
				Продолжить;
			КонецЕсли;
			
			Если ТипЗнч(Описание.документ) = Тип("ОбъектXDTO") Тогда
				СписокДокументов = Новый Массив;
				СписокДокументов.Добавить(Описание.документ);
			Иначе
				СписокДокументов = Описание.документ;
			КонецЕсли;
			
			Для Каждого Документ Из СписокДокументов Цикл
				
				ИсходноеИмяФайла = Неопределено;
				ЕстьСвойствоОбъектаXDTO(Документ, "исходноеИмяФайла", ИсходноеИмяФайла);
				
				Значение = Неопределено;
				Если ЕстьСвойствоОбъектаXDTO(Документ, "зашифрован", Значение) Тогда
					Если НРег(Значение) = "true" Тогда
						Содержимое = Неопределено;
						Если ЕстьСвойствоОбъектаXDTO(Документ, "содержимое", Содержимое) Тогда
							ИмяФайла = Неопределено;
							Если ЕстьСвойствоОбъектаXDTO(Содержимое, "имяФайла", ИмяФайла) Тогда
								РазмерДокумента = 0;
								Если ИспользоватьCertUtil Тогда
									Сведения = ИзвлечьСведенияИзЗашифрованногоПакета(ИмяФайла, КаталогКонтейнера, РазмерДокумента);
								КонецЕсли;
								Если (Сведения = Неопределено) И (РазмерДокумента <= ОграничениеРазмераДокументаВКонтейнере) Тогда
									Сведения = Новый Массив;
									ДД = Новый ДвоичныеДанные(КаталогКонтейнера + ИмяФайла);
									РазмерДокумента = ДД.Размер();
									ДДBase64 = Base64Строка(ДД);
									Адрес = ПоместитьВоВременноеХранилище(ДД, УИД);
									Адрес2 = ПоместитьВоВременноеХранилище(ДДBase64, УИД);
								Иначе
									Адрес = Неопределено;
									Адрес2 = Неопределено;
								КонецЕсли;
								Если ИсходноеИмяФайла = Неопределено Или ИсходноеИмяФайла = "" Тогда
									ИсходноеИмяФайла = ИмяФайла;
								КонецЕсли;
								ЗашифрованныйДокумент = Новый Структура("Имя, Представление, Сведения", ИмяФайла, ИсходноеИмяФайла, Сведения);
								ЗашифрованныйДокумент.Вставить("ОшибкаДокумента", 0);
								Если РазмерДокумента > ОграничениеРазмераДокументаВКонтейнере Тогда
									ЗашифрованныйДокумент.ОшибкаДокумента = 1;
								КонецЕсли;
								ЗашифрованныйДокумент.Вставить("Содержимое", Адрес);
								ЗашифрованныйДокумент.Вставить("СодержимоеWC", Адрес2);
								ЗашифрованныйДокумент.Вставить("РазмерДокумента", РазмерДокумента);
								
								ТранспортныеКонтейнеры[ТранспортныеКонтейнеры.Количество()-1].Документы.Добавить(ЗашифрованныйДокумент);
							КонецЕсли;
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
	
	Если КаталогКонтейнеров <> "" Тогда 
		УдалитьФайлы(КаталогКонтейнеров);
		КаталогКонтейнеров = "";
	КонецЕсли;
	
	Возврат ТранспортныеКонтейнеры;
	
КонецФункции

&НаСервереБезКонтекста
Процедура ДобавитьИнформациюОНерасшифрованных(Куда, Организация, УчетнаяЗаписьОбмена, УИД)
	
	Запрос = Новый Запрос(
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	ДокТранспортноеСообщение.Отправитель КАК Отправитель,
		|	ДокТранспортноеСообщение.Тема КАК Тема,
		|	ДокТранспортноеСообщение.ДатаТранспорта КАК ДатаТранспорта,
		|	ДокТранспортноеСообщение.ИдентификаторСообщения КАК ИдентификаторСообщения,
		|	ДокТранспортноеСообщение.Ссылка КАК Ссылка
		|ИЗ
		|	РегистрСведений.ТранспортныеКонтейнеры КАК ТранспортныеКонтейнеры
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ТранспортноеСообщение КАК ДокТранспортноеСообщение
		|		ПО ТранспортныеКонтейнеры.ТранспортноеСообщение = ДокТранспортноеСообщение.Ссылка
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СодержимоеТранспортныхКонтейнеров КАК СодержимоеТранспортныхКонтейнеров
		|		ПО ТранспортныеКонтейнеры.ТранспортноеСообщение = СодержимоеТранспортныхКонтейнеров.ТранспортноеСообщение
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ЦиклыОбмена КАК ЦиклыОбмена
		|		ПО ЦиклыОбмена.Ссылка = ДокТранспортноеСообщение.ЦиклОбмена
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ВладельцыОбъектов1СОтчетности КАК ВладельцыОбъектов1СОтчетности
		|		ПО (ЦиклыОбмена.Ссылка = ВладельцыОбъектов1СОтчетности.Объект)
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ВладельцыОбъектов1СОтчетности КАК ВладельцыОбъектов1СОтчетностиТС
		|		ПО (ТранспортныеКонтейнеры.ТранспортноеСообщение = ВладельцыОбъектов1СОтчетностиТС.Объект
		|			И ВладельцыОбъектов1СОтчетности.Владелец ЕСТЬ NULL)
		|ГДЕ
		|	(ДокТранспортноеСообщение.Отправитель = &ОтборОрганизация
		|		ИЛИ ДокТранспортноеСообщение.Получатель = &ОтборОрганизация)
		|	И ДокТранспортноеСообщение.УчетнаяЗапись = &УчетнаяЗапись
		|	И НЕ ДокТранспортноеСообщение.ПометкаУдаления
		|	И НЕ ДокТранспортноеСообщение.ЦиклОбмена.ПометкаУдаления
		|	И СодержимоеТранспортныхКонтейнеров.ТранспортноеСообщение ЕСТЬ NULL
		|	И (ВладельцыОбъектов1СОтчетности.Владелец = &ТекущийПользователь
		|		ИЛИ ВладельцыОбъектов1СОтчетности.Владелец ЕСТЬ NULL)
		|	И (ВладельцыОбъектов1СОтчетностиТС.Владелец = &ТекущийПользователь
		|		ИЛИ ВладельцыОбъектов1СОтчетностиТС.Владелец ЕСТЬ NULL)");
	
	ТекущийПользователь = Пользователи.ТекущийПользователь();
	
	Запрос.Параметры.Вставить("УчетнаяЗапись", 			УчетнаяЗаписьОбмена);
	Запрос.Параметры.Вставить("ОтборОрганизация", 		Организация);
	Запрос.Параметры.Вставить("ТекущийПользователь", 	ТекущийПользователь);
	Результат = Запрос.Выполнить();
	Если Результат.Пустой() Тогда 
		Возврат;
	КонецЕсли;
	ВсеСообщения = Результат.Выгрузить();
	
	Для Каждого ТС из ВсеСообщения Цикл 
		Сообщение = Новый Структура;
		
		Для Каждого Колонка из ВсеСообщения.Колонки цикл
			Значение = ТС[Колонка.Имя];
			Сообщение.Вставить(Колонка.Имя, Значение);
		КонецЦикла;
		
		Если НЕ ТС.Ссылка.ЦиклОбмена.Пустая() Тогда 
			Сообщение.Вставить("идентификаторДокументооборота", ТС.Ссылка.ЦиклОбмена.Идентификатор);
		Иначе
			//Идентификатор первичного сообщения
			//X-Message-ID			
			Стр = ТС.Ссылка.ДополнительныеРеквизитыЗаголовка.Найти(Перечисления.ТипыДополнительныхРеквизитов.ИдентификаторПервичногоСообщения, "Тип");
			Если Стр = Неопределено Тогда
				Если ТС.Ссылка.Тип = Перечисления.ТипыТранспортныхСообщений.ПервичноеСообщениеСодержащееОтчетностьПФР
				ИЛИ ТС.Ссылка.Тип = Перечисления.ТипыТранспортныхСообщений.ПодтверждениеПолученияОтчетностиПФР
				ИЛИ ТС.Ссылка.Тип = Перечисления.ТипыТранспортныхСообщений.ПротоколПФР
				ИЛИ ТС.Ссылка.Тип = Перечисления.ТипыТранспортныхСообщений.ПротоколКвитанцияПФР
				ИЛИ ТС.Ссылка.Тип = Перечисления.ТипыТранспортныхСообщений.ПисьмоИсходящееКвитанцияПФР
				ИЛИ ТС.Ссылка.Тип = Перечисления.ТипыТранспортныхСообщений.УведомлениеОбОшибкеПФР
				ИЛИ ТС.Ссылка.Тип = Перечисления.ТипыТранспортныхСообщений.ПодтверждениеПолученияЗапросаПФР
				ИЛИ ТС.Ссылка.Тип = Перечисления.ТипыТранспортныхСообщений.ОтветНаЗапросПФР Тогда
					Стр = ТС.Ссылка.ДополнительныеРеквизитыЗаголовка.Найти("X-PFR-Message-ID", "Тип");
				КонецЕсли;
				Если Стр = Неопределено Тогда
					Стр = ТС.Ссылка.ДополнительныеРеквизитыЗаголовка.Найти("X-Message-ID", "Тип");
				КонецЕсли;
				Если Стр = Неопределено Тогда 
					Сообщение.Вставить("идентификаторДокументооборота", "");
				Иначе
					Сообщение.Вставить("идентификаторДокументооборота", Стр.Значение);
				КонецЕсли;
			Иначе
				Сообщение.Вставить("идентификаторДокументооборота", Стр.Значение);
			КонецЕсли;			
		КонецЕсли;
		
		Сообщение.Вставить("СодержимоеТранспортныхКонтейнеров", ПолучитьДанныеТКС(ТС.Ссылка, УИД));
		
		Куда.Добавить(Сообщение);
	КонецЦикла;
	
КонецПроцедуры

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

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

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

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

#Область ПроверкаУчетнойЗаписи

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

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

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

&НаСервере
Функция ПолучитьСписокПроблемСДоверенностями(ОрганизацияСсылка, ВладелецЭП, СведенияОРегистрации, СертификатВыданНаПредставителя)
	
	//Список возможных ошибок
	//I	10, "Представитель найден в базе"
	//I	11, "ФИО представителя И владельца ЭЦП совпали"
	//I 12, "Представитель не найден в базе"
	//W	10, "В регистрации в налоговом органе указан представитель отличный от такового в доверенности"
	//W	11, "Владельца ЭЦП нет в справочнике физических лиц"
	//W	12, "В доверенности не указаны полномочия представителя"
	//E	10, "Отсутствует доверенность"
	//E	11, "Срок действия доверенности уже истёк"
	//E	12, "Срок действия доверенности ещё не началася"
	//E	13, "Доверенность выдана не на владельца ЭЦП"
	
	//КонтекстМодуля = РеквизитФормыВЗначение("Объект");
	КонтекстМодуля = ДокументооборотСКО.ПолучитьОбработкуЭДО();
	
	Руководитель	= ЭлектронныйДокументооборотСКонтролирующимиОрганамиВызовСервераПереопределяемый.Руководитель(ОрганизацияСсылка); 
	ГлБухгалтер		= ЭлектронныйДокументооборотСКонтролирующимиОрганамиВызовСервераПереопределяемый.ГлБухгалтер(ОрганизацияСсылка);
	
	ВладелецЭП_ФЛ	= Мультирежим.ФизЛицоПоФИОиСНИЛС(
		ВладелецЭП.Фамилия, 
		ВладелецЭП.Имя, 
		ВладелецЭП.Отчество, 
		ВладелецЭП.СНИЛС);
			
	ВладелецЭП_ФИО = КонтекстМодуля.НормализованныеФИО(ВладелецЭП.Фамилия, ВладелецЭП.Имя, ВладелецЭП.Отчество);
		
	Руководитель_ФИО_ = ПолучитьФИОФизлица(Руководитель);
	Руководитель_ФИО = КонтекстМодуля.НормализованныеФИО(Руководитель_ФИО_);
	
	ВсеПроблемы = Новый Массив;
			
	Если ВладелецЭП_ФЛ.Пустая() Тогда 
		// В справочнике физлиц отсутствует владелец ЭЦП
		Если ВладелецЭП_ФИО = Руководитель_ФИО Тогда 
			// Владелец ЭЦП И Руководитель одно лицо, всё ОК, доверенность не нужна
			Возврат Неопределено;
		КонецЕсли;
	КонецЕсли;
	
	Если ВладелецЭП_ФЛ = Руководитель Тогда 
		// В справочнике физлиц найден владелец ЭЦП
		// Всё ОК, доверенность не нужна
		Возврат Неопределено;
	КонецЕсли;
	
	СертификатВыданНаПредставителя = Истина;
	
	ВсеРегистрации = ДокументооборотСКОВызовСервера.РегистрацииВНалоговомОргане(ОрганизацияСсылка);
	
	Направления = ПолучитьСписокНаправленийУчетнойЗаписи(ОрганизацияСсылка.УчетнаяЗаписьОбмена, Перечисления.ТипыКонтролирующихОрганов.ФНС);
	Если Направления = Неопределено Тогда 
		Возврат Неопределено;
	КонецЕсли;
	Если Направления.Количество() = 0 Тогда 
		Возврат Неопределено;
	КонецЕсли;
	
	Направления.Колонки.Добавить("ДоверенностьОК", Новый ОписаниеТипов("Булево"));
	Направления.Колонки.Добавить("ЕстьДоверенность", Новый ОписаниеТипов("Булево"));
			
	Для Каждого Регистрация из ВсеРегистрации Цикл
	
		Доверенность = Регистрация.Доверенность;
		РегистрацияСсылка = Регистрация.РегистрацияСсылка;
		
		Результат = Направления.НайтиСтроки(Новый Структура("КодПолучателя, КПП", РегистрацияСсылка.Код, РегистрацияСсылка.КПП));
		Если Результат.Количество() = 0 Тогда //Нет направления
			Продолжить; //Регистрация в налоговом органе сделана на лишнее направление
		КонецЕсли;
		
		Запись = Новый Структура("Направление, КодПолучателя, КПП, Регистрация, Доверенность, Проблемы", "ИФНС", 
						РегистрацияСсылка.Код, РегистрацияСсылка.КПП, РегистрацияСсылка, Неопределено, Новый Массив);
			
		Если НЕ ЗначениеЗаполнено(Доверенность) Тогда
			Запись.Проблемы.Добавить(ПолучитьОписаниеСобытия(1, 2, 10));
		Иначе
			
			// Проверяем доверенность
			Запись.Доверенность = ИзвлечьПоля(Доверенность);
			ПолномочияОК = Ложь;
			ПредставительОК = Ложь;
			СрокОК = Ложь;
			
			Если Результат.Количество() > 0 Тогда 
				Для Каждого СтрокаТаблицы из Результат Цикл 
					СтрокаТаблицы.ЕстьДоверенность = Истина;
				КонецЦикла;				
			КонецЕсли;
			
			ДатаОкончания = Доверенность.ДатаОкончания;
			Если ДатаОкончания = '00010101' Тогда 
				ДатаОкончания = '20990101';
			КонецЕсли;
	
			ТекущаяДата = ТекущаяДатаСеанса();
			Если ТекущаяДата >= Доверенность.ДатаВыдачи И ТекущаяДата <= ДатаОкончания Тогда 
				//# Срок годности доверенности ок
				СрокОК = Истина;
			ИначеЕсли ТекущаяДата < Доверенность.ДатаВыдачи Тогда 
				//# Доверенность ещё не действует
				Запись.Проблемы.Добавить(ПолучитьОписаниеСобытия(1, 2, 12));
			ИначеЕсли ТекущаяДата > ДатаОкончания Тогда 
				//# Доверенность больше не действует
				Запись.Проблемы.Добавить(ПолучитьОписаниеСобытия(1, 2, 11));
			КонецЕсли;
			
			ДоверенностьПредставитель_ФИО = ПолучитьФИОДоверенности(
												Доверенность, 
												Перечисления.СубъектыДоверенностиНалогоплательщика.ПредставительФЛ);
												
			Если ДоверенностьПредставитель_ФИО = ВладелецЭП_ФИО тогда
				
				ПредставительОК = Истина;
				
			Иначе
				
				Если НЕ ЗначениеЗаполнено(ДоверенностьПредставитель_ФИО) Тогда
					ДоверенностьПредставитель_ФИО = НСтр("ru = '<не заполнено>'");
				КонецЕсли;
				
				Проблема = ПолучитьОписаниеСобытия(1, 2, 13);
				Представители = Новый Структура("Ожидаемый, Фактический", ВладелецЭП_ФИО, ДоверенностьПредставитель_ФИО);
				Проблема.Вставить("Представитель", Представители);
				Запись.Проблемы.Добавить(Проблема);
				
			КонецЕсли;
			
			ИмяТипаСправочникаМашиночитаемыеДоверенности = "МашиночитаемыеДоверенности";
			Если ДокументооборотСКОКлиентСервер.ПодсистемаЦПРРМЧДСуществует() И
				ТипЗнч(Доверенность) = Тип("СправочникСсылка." + ИмяТипаСправочникаМашиночитаемыеДоверенности) Тогда
				
				ПолномочияОК = Истина;
				
			ИначеЕсли Доверенность.ПолномочияПредставителя.Количество() = 0 Тогда
				Если ТипЗнч(Доверенность) <> Тип("СправочникСсылка.МашиночитаемыеДоверенностиФНС")
					И ТипЗнч(Доверенность) <> Тип("СправочникСсылка.МашиночитаемыеДоверенностиРаспределенныйРеестр") Тогда
					
					Запись.Проблемы.Добавить(ПолучитьОписаниеСобытия(1, 1, 12));
				КонецЕсли;
				ПолномочияОК = Истина;
				
			ИначеЕсли Доверенность.ПолномочияПредставителя.Количество() > 0 Тогда
				ПолномочияОК = Истина;
			КонецЕсли;
			
			Если Результат.Количество() > 0 Тогда
				Для каждого СтрокаТаблицы Из Результат Цикл
					СтрокаТаблицы.ДоверенностьОК = ПолномочияОК И ПредставительОК И СрокОК;
				КонецЦикла;
			КонецЕсли;
			
		КонецЕсли;
		
		ВсеПроблемы.Добавить(Запись);
		
	КонецЦикла;
	
	Возврат ВсеПроблемы;
	
КонецФункции

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Функция ИзвлечьИнформациюСертификата(Результат, ВходящийКонтекст) Экспорт
		
	Если Результат.Выполнено Тогда
		КПСертификата = ИзвлечьИнформациюОКриптопровайдереПоСертификатуНаСервере(Результат.СтрокаBase64);
		
		//
		РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ИнформацияЛичногоСертификата.Найден = Истина;
		РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ИнформацияЛичногоСертификата.Отпечаток = ВходящийКонтекст.ПоляСертификата.Отпечаток;
		РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ИнформацияЛичногоСертификата.Выдан = ВходящийКонтекст.ПоляСертификата.ДействителенС;
		РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ИнформацияЛичногоСертификата.ДействуетПо = ВходящийКонтекст.ПоляСертификата.ДействителенПо;
		РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ИнформацияЛичногоСертификата.Криптопровайдер = КПСертификата[0].Криптопровайдер;
		РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ИнформацияЛичногоСертификата.Содержимое = Результат.СтрокаBase64;
		
		ТекущаяДатаСервер = РезультатыДиагностики.Параметры.ДатаКлиента;
		СекундВОдномДне = 24 * 60 * 60;
		КоличествоДнейЗаКотороеНужноПредупреждатьОбИстеченииСрока = 30;
		ПораПродлитьСертификат = Ложь;
		
		Если ТекущаяДатаСервер >= ВходящийКонтекст.ПоляСертификата.ДействителенС И ТекущаяДатаСервер <= ВходящийКонтекст.ПоляСертификата.ДействителенПо Тогда
			СрокГодности = 0;
			КоличествоДнейДоОкончания = (НачалоДня(ВходящийКонтекст.ПоляСертификата.ДействителенПо) - НачалоДня(ТекущаяДатаСервер)) / СекундВОдномДне;
			ПораПродлитьСертификат = КоличествоДнейДоОкончания <= КоличествоДнейЗаКотороеНужноПредупреждатьОбИстеченииСрока;
			Если ПораПродлитьСертификат Тогда
				СрокГодности = 1;				
			КонецЕсли;
		ИначеЕсли ТекущаяДатаСервер < ВходящийКонтекст.ПоляСертификата.ДействителенС Тогда
			СрокГодности = 3;
		ИначеЕсли ТекущаяДатаСервер > ВходящийКонтекст.ПоляСертификата.ДействителенПо Тогда
			ПораПродлитьСертификат = Истина;
			СрокГодности = 2;
		КонецЕсли;
		
		РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ИнформацияЛичногоСертификата.ПораПродлить = ПораПродлитьСертификат;
		РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ИнформацияЛичногоСертификата.СрокГодности = СрокГодности;
		
		Если СрокГодности = 1 ИЛИ СрокГодности = 2 Тогда 
			РезультатыДиагностики.Отчет.ФлагиМастераИзмененияПараметров.ПродлитьСертификат = Истина;
			РезультатыДиагностики.Отчет.ФлагиМастераИзмененияПараметров.ПереиздатьСертификат = Истина;
		КонецЕсли;
		
		ОписаниеСертификата = Новый Структура("Отпечаток, Наименование, Хранилище, Выдан, ГоденДо, Найден, Содержимое, Ошибка", 
			ВходящийКонтекст.ПоляСертификата.Отпечаток, "", "MY",,, Истина, "", "");
			
		ОписаниеСертификата.Вставить("Наименование", ВходящийКонтекст.ПоляСертификата.Наименование);
		ОписаниеСертификата.Вставить("Выдан", РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ИнформацияЛичногоСертификата.Выдан);
		ОписаниеСертификата.Вставить("ГоденДо", РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ИнформацияЛичногоСертификата.ДействуетПо);
		
		РезультатыДиагностики.Отчет.Проверки.ПроверкаСертификатов.Добавить(ОписаниеСертификата);
	КонецЕсли;
	
КонецФункции

&НаКлиенте
Функция ВыполнитьПроверкуУчетнойЗаписи() //1
	
	ОрганизацияКлиент = РезультатыДиагностики.Параметры.Организация;
	УчетнаяЗаписьОбменаКлиент = РезультатыДиагностики.Параметры.УчетнаяЗаписьОбмена;
	СтатусыУчетнойЗаписиДокументооборотаКлиент = ПолучитьЗначенияПеречисления("СтатусыУчетнойЗаписиДокументооборота");
	
	РезультатыДиагностики.Отчет.Проверки.Вставить("ПроверкаУчетнойЗаписи", Новый Структура);
	УчеткаАктивна = УчетнаяЗаписьОбменаКлиент.СтатусУчетнойЗаписи = СтатусыУчетнойЗаписиДокументооборотаКлиент.Активна;
	РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.Вставить("Активна", УчеткаАктивна);
	
	РезультатыДиагностики.Отчет.Проверки.Вставить("ПроверкаСертификатов", Новый Массив);	
	
	Если РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.Активна Тогда 		
		Событие = ПолучитьОписаниеСобытия(1, 0, 1);
	Иначе
		Событие = ПолучитьОписаниеСобытия(1, 2, 2);
	КонецЕсли;
	
	РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.Вставить("АктивностьСобытие", Событие);
	
	ТекущаяДатаСервер = РезультатыДиагностики.Параметры.ДатаКлиента;
	СекундВОдномДне = 24 * 60 * 60;
	
	Начало = УчетнаяЗаписьОбменаКлиент.ЛицензияДатаНачала;
	Окончание = УчетнаяЗаписьОбменаКлиент.ЛицензияДатаОкончания;
	
	Если Параметры.Тестирование Тогда 		
		Окончание = ДобавитьМесяц(ТекущаяДатаСервер, -1);
		Начало = ДобавитьМесяц(Окончание, -12);
	КонецЕсли;
	
	КоличествоДнейДоОкончанияЛицензии = (НачалоДня(Окончание) - НачалоДня(ТекущаяДатаСервер)) / СекундВОдномДне;
	ПораПродлитьЛицензиюНа1СОтчетность = КоличествоДнейДоОкончанияЛицензии <= КоличествоДнейЗаКотороеНужноПредупреждатьОбИстеченииСрока;
	
	Событие = Неопределено;
	Если ТекущаяДатаСервер >= Начало И ТекущаяДатаСервер <= Окончание Тогда
		СрокГодности = 0;		
		Событие = ПолучитьОписаниеСобытия(1, 0, 0);
		Если ПораПродлитьЛицензиюНа1СОтчетность Тогда
			СрокГодности = 1;
			Событие = ПолучитьОписаниеСобытия(1, 1, 0);
			
			РезультатыДиагностики.Отчет.ФлагиМастераИзмененияПараметров.ПродлитьЛицензиюНа1СОтчетность = Истина;
		КонецЕсли;
	ИначеЕсли ТекущаяДатаСервер < Начало Тогда
		СрокГодности = 3;
		Событие = ПолучитьОписаниеСобытия(1, 2, 1);
	ИначеЕсли ТекущаяДатаСервер > Окончание Тогда
		СрокГодности = 2;
		Событие = ПолучитьОписаниеСобытия(1, 2, 0);
		
		РезультатыДиагностики.Отчет.ФлагиМастераИзмененияПараметров.ПродлитьЛицензиюНа1СОтчетность = Истина;
	КонецЕсли;
			
	РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.Вставить("ЛицензияДатаНачала", Начало);
	РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.Вставить("ЛицензияДатаОкончания", Окончание);
	РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.Вставить("ЛицензияНаименование", УчетнаяЗаписьОбменаКлиент.ЛицензияНаименование);
	
	РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.Вставить("СрокГодностиЧислом", СрокГодности);
	РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.Вставить("СрокГодностиСобытие", Событие);
	
	РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.Вставить("РазличияРеквизитовСведений", Новый Массив);
	РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.Вставить("ИнформацияДоверенности", Новый Массив);
	
	РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.Вставить("РазличияРеквизитовСведенийСобытие", Неопределено);
	РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.Вставить("ИнформацияДоверенностиСобытие", Неопределено);
	
	Различия = ПолучитьСписокИзменившихсяРеквизитовПодключенияК1СОтчетности(
					Организация, 
					ОрганизацияКлиент.УчетнаяЗаписьОбмена);
					
	Если Различия <>  Неопределено Тогда
		РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.РазличияРеквизитовСведений = Различия;
		РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.РазличияРеквизитовСведенийСобытие = ПолучитьОписаниеСобытия(1, 2, 8);
		
		РезультатыДиагностики.Отчет.ФлагиМастераИзмененияПараметров.ИзменитьРеквизитыПодключенияК1СОтчетности = Истина;
	КонецЕсли;
	
	НетОшибок = РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.РазличияРеквизитовСведений.Количество() = 0;
	РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.Вставить("РазличияРеквизитовНетОшибок", НетОшибок);
		
	СертификатВыданНаПредставителя = Ложь;
	
	Проблемы = ПолучитьСписокПроблемСДоверенностями(
					Организация, 
					РезультатыДиагностики.Автонастройка.ВладелецЭП, 
					РезультатыДиагностики.Автонастройка.СведенияРегистрации,
					СертификатВыданНаПредставителя);
					
	РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.Вставить("СертификатВыданНаПредставителя", СертификатВыданНаПредставителя);
					
	Если Проблемы <>  Неопределено Тогда
		РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ИнформацияДоверенности = Проблемы;
		РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ИнформацияДоверенностиСобытие = ПолучитьОписаниеСобытия(1, 2, 9);
	КонецЕсли;
	
	ВсегоПроблем = 0;
	ВсегоДоверенностей = РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ИнформацияДоверенности.Количество();
	//Доверенность - Структура("Направление, КодПолучателя, КПП, Регистрация, Доверенность, Проблемы")
	Для Каждого Доверенность Из РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.ИнформацияДоверенности Цикл 
		ВсегоПроблем = ВсегоПроблем + Доверенность.Проблемы.Количество();
	КонецЦикла;
	
	НетОшибок = ВсегоДоверенностей = 0 ИЛИ ВсегоПроблем = 0;
	РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.Вставить("ИнформацияДоверенностиНетОшибок", НетОшибок);
	
	Личный = Новый Структура("Отпечаток, Содержимое, Выдан, ДействуетПо, Найден, Криптопровайдер, ПораПродлить, СрокГодности",,,,, Ложь,, Ложь, -1);
	РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.Вставить("ИнформацияЛичногоСертификата", Личный);
	
	Сертификат = МультирежимВызовСервера.СертификатПользователя(РезультатыДиагностики.Параметры.УчетнаяЗаписьОбмена.Ссылка);
	Если Сертификат.Найден Тогда
		ЗаполнитьИнформациюЛичногоСертификата(Сертификат.Отпечаток);
	Иначе
		Контекст = Новый Структура("ОтпечатокСертификата", Сертификат.Отпечаток);
		ДобавитьОшибкуСертификатНеНайден(Контекст);
	КонецЕсли;
	
	Заявления = Новый Структура("Документы, ЕстьРеквизиты, ЕстьЛицензия, ЕстьСертификат, ЕстьНаправления", Новый Массив, Ложь, Ложь, Ложь, Ложь);
	РезультатыДиагностики.Отчет.Проверки.ПроверкаУчетнойЗаписи.Вставить("ЗаявленияАбонента", Заявления);
	
	ЗаполнитьИнформациюЗаявлений();
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция СокрЛП_Врег(Строка)
	
	Возврат ЭлектронныйДокументооборотСКонтролирующимиОрганамиКлиентСервер.СтрокаВФорматеДляСравнения(Строка);

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

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

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

#Область ПроверкаПодключений

&НаКлиенте
Функция ВыполнитьПроверкуПодключений() //2
	
	РезультатыДиагностики.Отчет.Проверки.Вставить("ПроверкаПодключений", Новый Структура);
	РезультатыДиагностики.Отчет.Проверки.Вставить("ПроверяемыеХосты", Новый Массив);
	РезультатыДиагностики.Отчет.Проверки.Вставить("СостояниеСервисаПроверки", 0);
	
	РезультатыДиагностики.Отчет.Проверки.ПроверкаПодключений.Вставить("Ресурсы", Новый Массив);
	РезультатыДиагностики.Отчет.Проверки.ПроверкаПодключений.Вставить("Предупреждения", Новый Массив);
	
	Предупреждения = Новый Массив;
	Ресурсы = Новый Массив;
	
	Для Каждого Направление Из РезультатыДиагностики.Автонастройка.Получатели Цикл
		Если Не Направление.Пометка Тогда
			
			ИндексНаправления = РезультатыДиагностики.Автонастройка.Получатели.Индекс(Направление);
			Продолжить;
			
		КонецЕсли;
		Если Направление.Значение = "ФСРАР" Тогда 
						
			Адрес = ПолучитьЗаменяемоеЗначениеТестовогоСервера1С("service.fsrar.ru");
			Порт = 443;
			
			ДанныеХоста = Новый Структура("Проверен, Адрес, Порт, Псевдоним", Ложь, Адрес, Порт, "Росалкогольтабакконтроль (производство)");
			РезультатыДиагностики.Отчет.Проверки.ПроверяемыеХосты.Добавить(ДанныеХоста);
			
			Адрес = ПолучитьЗаменяемоеЗначениеТестовогоСервера1С("service.alcolicenziat.ru");
			Порт = 443;
			
			ДанныеХоста = Новый Структура("Проверен, Адрес, Порт, Псевдоним", Ложь, Адрес, Порт, "Росалкогольтабакконтроль (розница)");
			РезультатыДиагностики.Отчет.Проверки.ПроверяемыеХосты.Добавить(ДанныеХоста);
			
		ИначеЕсли Направление.Значение = "ПФР" Тогда 
			
		ИначеЕсли Направление.Значение = "ФНС" Тогда 
			
		ИначеЕсли Направление.Значение = "ФСГС" Тогда
			
		ИначеЕсли Направление.Значение = "РПН" Тогда 
			
			//АдресПолный = КонтекстЭДОКлиент.СерверПриемаОтчетностиРПН(Истина); // Прямой адрес
			//
			//Если Найти(АдресПолный, ":") > 0 Тогда 
			//	Адрес = Лев(АдресПолный, Найти(АдресПолный, ":") - 1);
			//	Порт = Сред(АдресПолный, Найти(АдресПолный, ":") + 1);
			//Иначе
			//	Адрес = АдресПолный;
			//	Порт = 443;
			//КонецЕсли;
			//
			//ДанныеХоста = Новый Структура("Проверен, Адрес, Порт, Псевдоним", Ложь, Адрес, Порт, "Росприроднадзор");
			//РезультатыДиагностики.Отчет.Проверки.ПроверяемыеХосты.Добавить(ДанныеХоста);
			//
			//СтруктураWS = КонтекстЭДОКлиент.СерверПриемаОтчетностиРПН(Ложь); // Адрес вебсервиса
			//АдресПолный = СтруктураWS["Определение"];
			//
			//Адрес = Сред(АдресПолный, Найти(АдресПолный, "://")+3);
			//Урл = Сред(Адрес, Найти(Адрес, "/"));
			//Адрес = Лев(Адрес, Найти(Адрес, "/")-1);
			//Порт = 80;
			//
			//ДанныеХоста = Новый Структура("Проверен, Адрес, Порт, Урл, Псевдоним", Ложь, Адрес, Порт, Урл, "Росприроднадзор");
			//РезультатыДиагностики.Отчет.Проверки.ПроверяемыеХосты.Добавить(ДанныеХоста);
			
		ИначеЕсли Направление.Значение = "ФТС" Тогда 
			
			Адрес = КонтекстЭДОКлиент.СерверПриемаОтчетностиФТС().АдресСервера;
			
			Порт = 443;
			
			// Добавляем URL, так как при запросе только к хосту возвращается статус 301.
			Урл = ПолучитьЗаменяемоеЗначениеТестовогоСервера1С("/FtsPersonalCabinetWeb", "{FTS}/FtsPersonalCabinetWeb");
			ДанныеХоста = Новый Структура("Проверен, Адрес, Порт, Псевдоним, Урл", Ложь, Адрес, Порт, "ФТС", Урл);
			РезультатыДиагностики.Отчет.Проверки.ПроверяемыеХосты.Добавить(ДанныеХоста);
			
		ИначеЕсли Направление.Значение = "ФСС" Тогда 
			
			Адрес = КонтекстЭДОКлиент.СерверПриемаОтчетностиФСС(
				ПредопределенноеЗначение("Перечисление.ТипыОтправляемыхДокументов.Отчет4ФСС"));
			Порт = 80;
			
			ДанныеХоста = Новый Структура("Проверен, Адрес, Порт, Псевдоним", Ложь, Адрес, Порт, "ФСС (форма 4)");
			РезультатыДиагностики.Отчет.Проверки.ПроверяемыеХосты.Добавить(ДанныеХоста);
			
			Адрес = КонтекстЭДОКлиент.СерверПриемаОтчетностиФСС(
				ПредопределенноеЗначение("Перечисление.ТипыОтправляемыхДокументов.РеестрСведенийФСС"));
			Порт = 80;
			
			ДанныеХоста = Новый Структура("Проверен, Адрес, Порт, Псевдоним", Ложь, Адрес, Порт, "ФСС (реестр)");
			РезультатыДиагностики.Отчет.Проверки.ПроверяемыеХосты.Добавить(ДанныеХоста);
			
		КонецЕсли;
	КонецЦикла;
	
	Адрес = КонтекстЭДОКлиент.СерверПриемаОтчетностиФСС(
		ПредопределенноеЗначение("Перечисление.ТипыОтправляемыхДокументов.ДанныеЭЛНФСС"),, Организация);
	ОтпечаткиСертификатов = КонтекстЭДОКлиент.ПолучитьОтпечаткиСертификатовИзНастроекОрганизацииДляФССНаСервере(
		Организация);
	ЭтоТестовыйСерверФССЭЛН = ОтпечаткиСертификатов <> Неопределено И ОтпечаткиСертификатов.ТестовыйСерверФССЭЛН = Истина;
	Порт = 443;
	Урл = ПолучитьЗаменяемоеЗначениеТестовогоСервера1С(?(ЭтоТестовыйСерверФССЭЛН,
		"/eln/ws-insurer-crypto/api/soap/FileOperationsLnService?wsdl", "/ws-insurer-crypto-v20/FileOperationsLnService?wsdl"),
		"{FSS}/ws-insurer-crypto-v20/FileOperationsLnService?wsdl");
	
	ДанныеХоста = Новый Структура("Проверен, Адрес, Порт, Урл, Псевдоним", Ложь, Адрес, Порт, Урл, "ФСС (б/л)");
	РезультатыДиагностики.Отчет.Проверки.ПроверяемыеХосты.Добавить(ДанныеХоста);
	
	Спецоператор = РезультатыДиагностики.Параметры.УчетнаяЗаписьОбмена.СпецоператорСвязи;
	
	СтруктураПараметра = Новый Структура("ВебСервисОпределение");		
	АдресПолный = КонтекстЭДОКлиент.ПолучитьПараметрСпецоператораКлиент(Спецоператор, СтруктураПараметра).ВебСервисОпределение;
	Адрес = Сред(АдресПолный, Найти(АдресПолный, "://") + 3);
	Урл = Сред(Адрес, Найти(Адрес, "/"));
	Адрес = Лев(Адрес, Найти(Адрес, "/") - 1);
	Порт = 80;
	
	ДанныеХоста = Новый Структура("Проверен, Адрес, Порт, Урл, Псевдоним", Ложь, Адрес, Порт, Урл, "1С-Отчетность");
	РезультатыДиагностики.Отчет.Проверки.ПроверяемыеХосты.Добавить(ДанныеХоста);

	ДанныеХоста = Новый Структура("Проверен, Адрес, Порт, Урл, УчетнаяЗаписьОбмена, Псевдоним", Ложь, Неопределено, Неопределено, Неопределено, Неопределено, "ФНС, ПФР И Росстат");
	ДанныеХоста.УчетнаяЗаписьОбмена = РезультатыДиагностики.Параметры.УчетнаяЗаписьОбмена;
	РезультатыДиагностики.Отчет.Проверки.ПроверяемыеХосты.Добавить(ДанныеХоста);
	
	ПараметрыСервераОбновлений1С = КонтекстЭДОКлиент.ПолучитьПараметрыИнтернета();
	Адрес = ПараметрыСервераОбновлений1С.URLСервера;
	Урл = ПараметрыСервераОбновлений1С.КаталогФайловНаСервере + ПараметрыСервераОбновлений1С.ИмяКлючевогоФайлаНаСервере;
	Порт = Неопределено;
	
	ДанныеХоста = Новый Структура("Проверен, Адрес, Порт, Урл, Псевдоним", Ложь, Адрес, Порт, Урл, "1С-Отчетность (обновления)");
	РезультатыДиагностики.Отчет.Проверки.ПроверяемыеХосты.Добавить(ДанныеХоста);
	
	Адрес = "getserial.infotecs.ru";
	Урл = "/partner/csp/service/GetSerialNumberByAbonentInfo/";
	Порт = 443;
	
	ДанныеХоста = Новый Структура("Проверен, Адрес, Порт, Урл, Псевдоним", Ложь, Адрес, Порт, Урл, "Установка ViPNet CSP");
	РезультатыДиагностики.Отчет.Проверки.ПроверяемыеХосты.Добавить(ДанныеХоста);
	
	ПодключитьОбработчикОжидания("Подключаемый_ПроверитьСписокХостов", 1, Ложь);
			
КонецФункции

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

&НаКлиенте
Процедура ПроверитьНедоступныеЧерезСервисПроверки()
	
	Хосты = "";
	СписокНедоступных = Новый СписокЗначений;
	Индекс = -1;
	
	Для Каждого Ресурс из РезультатыДиагностики.Отчет.Проверки.ПроверкаПодключений.Ресурсы Цикл 
		Индекс = Индекс + 1;
		Если Ресурс.Результат Тогда 
			Продолжить;			
		КонецЕсли;
		
		Если Хосты <> "" Тогда 
			Хосты = Хосты + Символы.ПС;
		КонецЕсли;
		
		Хост = Ресурс.ПараметрыПодключения.ПредставлениеХоста;
		
		Хосты = Хосты + Хост;
		СписокНедоступных.Добавить(НРег(Хост), Формат(Индекс, "ЧДЦ=; ЧН=; ЧГ="));
				
	КонецЦикла;
	
	Если Хосты = "" Тогда 
		Возврат;
	КонецЕсли;
	
	ОписаниеОшибки = "";
	СтруктураJSON = ЗапроситьДоступностьУСервисаПроверки(Хосты, ОписаниеОшибки);
	Если СтруктураJSON = Неопределено Тогда 
		РезультатыДиагностики.Отчет.Проверки.СостояниеСервисаПроверки = 2;
	Иначе
		Если СтруктураJSON.Свойство("error") Тогда 
			РезультатыДиагностики.Отчет.Проверки.СостояниеСервисаПроверки = 3;
		ИначеЕсли СтруктураJSON.Свойство("result") Тогда 
			Если ТипЗнч(СтруктураJSON.result) = Тип("Массив") Тогда 
				Для Каждого РезультатыХоста Из СтруктураJSON.result Цикл 
					Результат = СписокНедоступных.НайтиПоЗначению(НРег(РезультатыХоста.qu));
					Если Результат = Неопределено Тогда 
						Продолжить;
					КонецЕсли;
					Индекс = Число(Результат.Представление);
					Ресурс = РезультатыДиагностики.Отчет.Проверки.ПроверкаПодключений.Ресурсы[Индекс];
					Ресурс.СервисПроверки.Использовался = Истина;
					Ресурс.СервисПроверки.Доступен = РезультатыХоста.online = 1;
					Ресурс.СервисПроверки.ДоступностьЗаЧас = Число(РезультатыХоста.ratioH);
					Ресурс.СервисПроверки.ДоступностьЗаДень = Число(РезультатыХоста.ratioD);
				КонецЦикла;
			Иначе
				РезультатыДиагностики.Отчет.Проверки.СостояниеСервисаПроверки = 3;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

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

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

&НаСервере
Функция ЗапроситьДоступностьУСервисаПроверки(Знач Хосты, ОписаниеОшибки)
	Перем Пользователь, Пароль, ЗащищенноеСоединение, Прокси;
	Таймаут = 10;
	ОписаниеОшибки = "";
	
	Прокси = ПолучениеФайловИзИнтернета.ПолучитьПрокси("https");
	
	ЗащищенноеСоединение = ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение(
            Неопределено,
            Новый СертификатыУдостоверяющихЦентровОС);
			
	Запрос = Новый HTTPЗапрос("/static/online_stats.json");
	
	Соединение = Новый HTTPСоединение(Параметры.ХОХост, 443, Пользователь, Пароль, Прокси, Таймаут, ЗащищенноеСоединение);
	
	Попытка
		Ответ = Соединение.Получить(Запрос);
	Исключение
		Инф = ИнформацияОбОшибке();
		Если Инф.Причина = Неопределено Тогда 
			ОписаниеОшибки = Инф.Описание;
		Иначе 
			ОписаниеОшибки = Инф.Причина.Описание;
		КонецЕсли;
		Возврат Неопределено;
	КонецПопытки;
	
	ОтветСтрокой = Ответ.ПолучитьТелоКакСтроку();
	Если ОтветСтрокой = Неопределено Тогда 
		ОтветСтрокой = "{""error"": ""generic""}";
	КонецЕсли;
	
	ЧтJSON = Новый ЧтениеJSON;
	ЧтJSON.УстановитьСтроку(ОтветСтрокой);
	
	Попытка
		СтруктураJSON = ПрочитатьJSON(ЧтJSON, Ложь);
	Исключение
		Инф = ИнформацияОбОшибке();
		Если Инф.Причина = Неопределено Тогда 
			ОписаниеОшибки = Инф.Описание;
		Иначе 
			ОписаниеОшибки = Инф.Причина.Описание;
		КонецЕсли;
		Возврат Неопределено
	КонецПопытки;
	
	Возврат СтруктураJSON;
КонецФункции
	
&НаСервереБезКонтекста
Функция ЕстьПодключениеHTTPНаСервере(Хост, Знач Порт = Неопределено, Знач Урл = Неопределено, ОписаниеОшибки, КодСостояния = Неопределено)
	Перем ЗащищенноеСоединение, Пользователь, Пароль, Прокси;
	
	Таймаут = 10;
	
	Если (Порт = Неопределено) Тогда 
		Порт = 80
	КонецЕсли;
	
	Порт = Число(Порт);
	
	Если Порт = 443 Тогда 
		ЗащищенноеСоединение = ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение();
		Прокси = ПолучениеФайловИзИнтернета.ПолучитьПрокси("https");
	Иначе
		Прокси = ПолучениеФайловИзИнтернета.ПолучитьПрокси("http");
		ЗащищенноеСоединение = Неопределено;
	КонецЕсли;
			
	Запрос = Новый HTTPЗапрос(?(Урл = Неопределено, "/", Урл));
	Соединение = Новый HTTPСоединение(Хост, Порт, Пользователь, Пароль, Прокси, Таймаут, ЗащищенноеСоединение);
	
	Попытка
		Результат = Соединение.Получить(Запрос);
	Исключение
		Инф = ИнформацияОбОшибке();
		Если Инф.Причина = Неопределено Тогда 
			ОписаниеОшибки = Инф.Описание;
		Иначе 
			ОписаниеОшибки = Инф.Причина.Описание;
		КонецЕсли;
		Возврат Ложь;
	КонецПопытки;
	
	КодСостояния = Результат.КодСостояния;
	
	Если (КодСостояния = 200) или (КодСостояния = 302) или (КодСостояния = 401) Тогда //302 редирект, 401 не авторизован		
		ОписаниеОшибки="";
		Возврат Истина;
	Иначе
		ОписаниеОшибки = ОписаниеHTTPКода(КодСостояния);
	КонецЕсли;
	
	Возврат Ложь;
	
КонецФункции

&НаСервере
Функция ПроверитьХост(Адрес = Неопределено, 
			Порт 				= Неопределено, 
			Урл 				= Неопределено, 
			ПочтовыйПрофиль 	= Неопределено, 
			Псевдоним 			= Неопределено, 
			Тестирование 		= Ложь, 
			РезультатПроверки2 	= Неопределено)
			
	//КонтекстМодуля = РеквизитФормыВЗначение("Объект");
	КонтекстМодуля = ДокументооборотСКО.ПолучитьОбработкуЭДО();
	ОписаниеОшибки = "";
	КодСостояния = 0;
	
	ВнешняяПроверка = новый Структура("Использовался, Доступен, ДоступностьЗаЧас, ДоступностьЗаДень", Ложь, Неопределено, Неопределено, Неопределено);
	РезультатПроверки = новый Структура("ПараметрыПодключения, Результат, Ошибка, СервисПроверки",,,, ВнешняяПроверка);
		
	Если ПочтовыйПрофиль = Неопределено Тогда
		РезультатПроверки.ПараметрыПодключения = новый Структура("Адрес, Порт, Урл, Псевдоним", Адрес, Порт, Урл, Псевдоним);
		РезультатПроверки.ПараметрыПодключения.Вставить("ПредставлениеХоста", КонтекстМодуля.ПолучитьURL(РезультатПроверки.ПараметрыПодключения));
	Иначе
		ВнешняяПроверка2 = новый Структура("Использовался, Доступен, ДоступностьЗаЧас, ДоступностьЗаДень", Ложь, Неопределено, Неопределено, Неопределено);
		РезультатПроверки2 = новый Структура("ПараметрыПодключения, Результат, Ошибка, СервисПроверки",,,, ВнешняяПроверка2);
		
		РезультатПроверки.ПараметрыПодключения = новый Структура("АдресPOP3, АдресSMTP, ПортPOP3, ПортSMTP, Псевдоним", 
														ПочтовыйПрофиль.СерверPOP3, "", ПочтовыйПрофиль.ПортPOP3, 0, Псевдоним);
		РезультатПроверки2.ПараметрыПодключения = новый Структура("АдресPOP3, АдресSMTP, ПортPOP3, ПортSMTP, Псевдоним", "", 
														ПочтовыйПрофиль.СерверSMTP, 0, ПочтовыйПрофиль.ПортSMTP, Псевдоним);
		
		РезультатПроверки.ПараметрыПодключения.Вставить("ПредставлениеХоста", КонтекстМодуля.ПолучитьURL(РезультатПроверки.ПараметрыПодключения));
		РезультатПроверки2.ПараметрыПодключения.Вставить("ПредставлениеХоста", КонтекстМодуля.ПолучитьURL(РезультатПроверки2.ПараметрыПодключения));
	КонецЕсли;
	
	Если Тестирование Тогда
		Возврат РезультатПроверки;
	КонецЕсли;
	
	ОписаниеОшибки1 = "";
	ОписаниеОшибки2 = "";
	Результат1 = Ложь;
	Результат2 = Ложь;
	
	Если ПочтовыйПрофиль = Неопределено Тогда // http И https ресурсы
		Успешно = ЕстьПодключениеHTTPНаСервере(Адрес, Порт, Урл, ОписаниеОшибки, КодСостояния);
		
		Если Параметры.Тестирование Тогда 
			Если СлучайноеБулево() Тогда 				
				Успешно = Ложь;
				ОписаниеОшибки = "Service Unavailable, искусственная ошибка";
				КодСостояния = "503";
			КонецЕсли;
		КонецЕсли;
		
		РезультатПроверки.Результат = Успешно;
		
		Если Успешно Тогда 
			РезультатПроверки.Ошибка = Неопределено;
		Иначе
			РезультатПроверки.Ошибка = Новый Структура("Код, Описание", КодСостояния, ОписаниеОшибки);
		КонецЕсли;
	Иначе 		
		Успешно = ПараметрыДоступаКПочтеВерны(ПочтовыйПрофиль, Результат1, Результат2, ОписаниеОшибки1, ОписаниеОшибки2);
		
		КодСостояния = 0;
		ОписаниеОшибки = ОписаниеОшибки1;
		
		РезультатПроверки.Результат = Результат1;
		РезультатПроверки2.Результат = Результат2;
		
		Если Результат1 Тогда 
			РезультатПроверки.Ошибка = Неопределено;
		Иначе
			РезультатПроверки.Ошибка = Новый Структура("Код, Описание", КодСостояния, ОписаниеОшибки1);
		КонецЕсли;
		
		Если Результат2 Тогда 
			РезультатПроверки2.Ошибка = Неопределено;
		Иначе
			РезультатПроверки2.Ошибка = Новый Структура("Код, Описание", КодСостояния, ОписаниеОшибки2);
		КонецЕсли;
	КонецЕсли;
			
	Возврат РезультатПроверки;
	
КонецФункции

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

#Область ПроверкаКомпонентов

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

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

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

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

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

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

#Область ПроверкаСертификатов

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

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

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

&НаКлиенте
Процедура ВыполнитьПроверкуСертификатовНайтиСертификатЗавершение(Результат, ВхПараметры) Экспорт
	
	ТекущаяДата = РезультатыДиагностики.Параметры.ДатаКлиента;
		
	Если Результат.Выполнено Тогда 
		
		Ненайденные = Новый Массив;
		НенайденныеХранилища = Новый Массив;
		
		Для Каждого Сертификат из Результат.Сертификаты Цикл 
									
			ПрефиксНазвания = "";
			//ПрефиксНазвания = "[" + Формат(Сертификат.ДействителенС, "ДФ=dd.MM.yyyy") + " - " + Формат(Сертификат.ДействителенПо, "ДФ=dd.MM.yyyy") + "] ";
			Сертификат_Наименование = ПрефиксНазвания + Сертификат.Наименование;
			
			Если Параметры.Тестирование Тогда
				Если СлучайноеБулево() Тогда 
					Хранилище = "";
					Тело = ПолучитьСертификатПоОтпечатку(Сертификат.Отпечаток, Хранилище);
					//ОписаниеСертификата = Новый Структура("Отпечаток, Хранилище, Тело, Найден, Симуляция", Сертификат.Отпечаток, Хранилище, Тело, Ложь, Истина);
					ОписаниеСертификата = Новый Структура("Отпечаток, Наименование, Хранилище, Выдан, ГоденДо, Найден, Содержимое, Ошибка", 
					Сертификат.Отпечаток,, Хранилище,,, Ложь, Тело, "Не найден в хранилище");
					РезультатыДиагностики.Отчет.Проверки.ПроверкаСертификатов.Добавить(ОписаниеСертификата);
					Продолжить;
				КонецЕсли;
			КонецЕсли;
			
			ОписаниеСертификата = Новый Структура("Отпечаток, Наименование, Хранилище, Выдан, ГоденДо, Найден, Содержимое, Ошибка", 
				Сертификат.Отпечаток, Сертификат_Наименование, Сертификат.Хранилище, Сертификат.ДействителенС, Сертификат.ДействителенПо, Истина, "", Неопределено);
				
			Если (ТекущаяДата >= Сертификат.ДействителенС) И (ТекущаяДата <= Сертификат.ДействителенПо) Тогда
				Если (ТекущаяДата > ДобавитьМесяц(Сертификат.ДействителенПо, -1)) Тогда //за 1 месяц предупреждаем
					ОписаниеСертификата.Ошибка = "Истекает срок годности";
				КонецЕсли;
			Иначе
				ОписаниеСертификата.Ошибка = "Срок годности истёк";
			КонецЕсли;
			
			РезультатыДиагностики.Отчет.Проверки.ПроверкаСертификатов.Добавить(ОписаниеСертификата);
		КонецЦикла;
								
		Для Каждого Сертификат из Результат.НенайденныеСертификаты Цикл 
			
			Хранилище = "";
			Тело = ПолучитьСертификатПоОтпечатку(Сертификат.Отпечаток, Хранилище);
			Ненайденные.Добавить(Новый Структура("Отпечаток, Хранилище, Тело, Найден", Сертификат.Отпечаток, Хранилище, Тело, Ложь));
			
			Если НенайденныеХранилища.Найти(Хранилище) = Неопределено Тогда 
				НенайденныеХранилища.Добавить(Хранилище);
			КонецЕсли;
			
			//ОписаниеСертификата = Новый Структура("Отпечаток, Наименование, Хранилище, Выдан, ГоденДо, Найден, Содержимое, Ошибка", 
			//	Сертификат.Отпечаток, "", Хранилище,,, Ложь, Тело, "Не найден в хранилище");
			//	
			//РезультатыДиагностики.Отчет.Проверки.ПроверкаСертификатов.Добавить(ОписаниеСертификата);
			
		КонецЦикла;
		
		Если Ненайденные.Количество() > 0  И Не Параметры.Тестирование Тогда 
			МестоХраненияКлюча = КриптографияЭДКОКлиентСервер.КонтекстМоделиХраненияКлюча(РезультатыДиагностики.Параметры);

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

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

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

#Область ПроверкаКриптоопераций

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

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

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

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

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

	Если Результат.Свойство("ОписаниеОшибки") Тогда 
		ОписаниеОшибки = Результат.ОписаниеОшибки + ?(ОписаниеОшибки="", "", " ") + ОписаниеОшибки;
	Иначе
	КонецЕсли;

	Если ОписаниеОшибки = "" Тогда 
		ОписаниеОшибки = "Не удалось получить описание ошибки операции ""шифрование""";
	КонецЕсли;

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

	ОписаниеОповещения = Новый ОписаниеОповещения("ВсеПроверкиЗавершены", ЭтотОбъект, Неопределено);
	ВыполнитьОбработкуОповещения(ОписаниеОповещения, ?(ВходящийКонтекст.ИнтерактивныеУведомления, 2, 0) );
	
КонецПроцедуры

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

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

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

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

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

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

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

#Область ЗаполнениеИОтправкаОтчета

&НаСервере
Функция ЗаданиеЧтенияЖРВыполнено(Знач ИдентификаторЗадания)
	
	Если ИдентификаторЗадания = "ffffffff-d0ne-d0ne-d0ne-ffffffffffff" Тогда 
		Возврат Истина;
	КонецЕсли;
	
	Возврат ДлительныеОперации.ЗаданиеВыполнено(ИдентификаторЗадания);
	
КонецФункции

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

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

&НаСервере
Функция ОтправитьОтчетНаСервере(ОтчетДиагностики, ОписаниеОшибки = "", Знач ТолькоСформировать = Ложь)
	
	Перем ЗащищенноеСоединение, Прокси;
	
	Ген = Новый ГенераторСлучайныхЧисел(ТекущаяУниверсальнаяДатаВМиллисекундах());
	ВтораяТриада = Ген.СлучайноеЧисло(100, 999);
	Если ВтораяТриада = 666 Тогда
		ВтораяТриада = ВтораяТриада - 1;
	КонецЕсли;
	
	ТретьяТриада = Ген.СлучайноеЧисло(100, 999);
	Если ТретьяТриада = 666 Тогда
		ТретьяТриада = ТретьяТриада - 1;
	КонецЕсли;
	
	Идентификатор = "911-"+Формат(ВтораяТриада, "ЧЦ=3; ЧВН=")+"-"+Формат(ТретьяТриада, "ЧЦ=3; ЧВН=");
	
	РеквизитыПодключения = ЭлектронныйДокументооборотСКонтролирующимиОрганамиВнутренний.РеквизитыПодключенияСервисаОтчетов();
	ПолучательОтчета = Параметры.ХОХост;
				
	//Обработка = РеквизитФормыВЗначение("Объект");	
	Обработка = ДокументооборотСКО.ПолучитьОбработкуЭДО();
	
	ТекстовыйМакет = Обработка.ПолучитьМакет("ДиагностикаОтчетности_СхемаXML");
	СхемаТекстом = ТекстовыйМакет.ПолучитьТекст();	
	Чтение = Новый ЧтениеXML;
	Чтение.УстановитьСтроку(СхемаТекстом);
	Построитель = Новый ПостроительDOM;
	Дом = Построитель.Прочитать(Чтение);	
	Построитель = Новый ПостроительСхемXML;  
	Схема = Построитель.СоздатьСхемуXML(Дом);	
	НаборСхем = Новый НаборСхемXML;
	НаборСхем.Добавить(Схема);	
	Определение = Новый Структура();
	Определение.Вставить("ФабрикаXDTO", Новый ФабрикаXDTO(НаборСхем));
	
	Отчет = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипОтчет") );
	Отчет_Абонент = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипАбонент") );
	Отчет_Абонент_УчетнаяЗапись = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипУчетнаяЗапись") );
	
	Отчет_Проверки_ПроверкаУчетнойЗаписи = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПроверкаУЗ") );
	Отчет_Проверки_ПроверкаДоступностиРесурсов = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПроверкаРесурса") );
	Отчет_Проверки_ПроверкаКриптографии = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПроверкаКриптографии") );
	Отчет_Проверки_ПроверкаСертификатов = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПроверкаСертификатов") );
	Отчет_Проверки_ПроверкаКриптоопераций = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПроверкаКриптоопераций") );
	
	Отчет.ВерсияФормата = "1.1";
	Отчет.ВерсияПрограммы = ОтчетДиагностики.ДополнительнаяИнформация["Метаданные.Синоним"];
	Отчет.ДатаВремя = ОтчетДиагностики.ДатаВремя;
	
	Отчет_Абонент.НазваниеАбонента = СокрЛП(ОтчетДиагностики.Абонент.НазваниеАбонента);
	Отчет_Абонент.ИНН = ОтчетДиагностики.Абонент.ИНН;
	Отчет_Абонент.КПП = ОтчетДиагностики.Абонент.КПП;
	
	Отчет_Абонент_УчетнаяЗапись.ИдентификаторАбонента =  ОтчетДиагностики.Абонент.УчетнаяЗапись.ИдентификаторАбонента;
	Отчет_Абонент_УчетнаяЗапись.НачалоДействияЛицензии = XMLСтрока(ОтчетДиагностики.Абонент.УчетнаяЗапись.НачалоДействияЛицензииДата);
	Отчет_Абонент_УчетнаяЗапись.ОкончаниеДействияЛицензии = XMLСтрока(ОтчетДиагностики.Абонент.УчетнаяЗапись.ОкончаниеДействияЛицензииДата);
	Отчет_Абонент_УчетнаяЗапись.ТипЛицензии = ОтчетДиагностики.Абонент.УчетнаяЗапись.ЛицензияНаименование;
	Отчет_Абонент_УчетнаяЗапись.ЭПВоблаке = XMLСтрока(ОтчетДиагностики.Абонент.УчетнаяЗапись.ЭПВоблаке);
	Отчет_Абонент_УчетнаяЗапись.МодельХраненияЗакрытогоКлюча = XMLСтрока(ОтчетДиагностики.Абонент.УчетнаяЗапись.МодельХраненияЗакрытогоКлюча);
	
	КриптопровайдерВОтчет = ?(ОтчетДиагностики.Абонент.УчетнаяЗапись.КриптопровайдерXML = "CryptoPro CSP",
		"КриптоПро CSP", ОтчетДиагностики.Абонент.УчетнаяЗапись.КриптопровайдерXML);
	
	Если Не ЗначениеЗаполнено(КриптопровайдерВОтчет) Тогда 
		КриптопровайдерВОтчет = "ViPNet CSP";
	КонецЕсли;
		
	Отчет_Абонент_УчетнаяЗапись.Криптопровайдер = КриптопровайдерВОтчет;
	Отчет_Абонент.УчетнаяЗапись = Отчет_Абонент_УчетнаяЗапись;
	Отчет_Абонент.РегНомерПФР = ОтчетДиагностики.Абонент.РегНомерПФР;
	Отчет_Абонент.РегНомерФСС = "";
	Отчет.Абонент = Отчет_Абонент;
	
	//Отчет_Проверки_ПроверкаУчетнойЗаписи
	ТекущаяПроверка = ОтчетДиагностики.Проверки.ПроверкаУчетнойЗаписи;
	
	Отчет_Проверки_ПроверкаУчетнойЗаписи.Активна = ТекущаяПроверка.Активна;
	Отчет_Проверки_ПроверкаУчетнойЗаписи.СрокГодности = XMLСтрока(ТекущаяПроверка.СрокГодностиЧислом);
	
	//Добавление реквизитов версии 1.1 {
	Отчет_Проверки_ПроверкаУчетнойЗаписи.СертификатВыданНаПредставителя = ТекущаяПроверка.СертификатВыданНаПредставителя;
	// }
	
	МассивЧувствительных = новый Массив;
	МассивЧувствительных.Добавить(Перечисления.ПараметрыПодключенияК1СОтчетности.ВладелецЭЦП);
	МассивЧувствительных.Добавить(Перечисления.ПараметрыПодключенияК1СОтчетности.ВладелецЭЦПДолжность);
	МассивЧувствительных.Добавить(Перечисления.ПараметрыПодключенияК1СОтчетности.ВладелецЭЦПСНИЛС);
	
	РезультатСведенияУЗ = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипРезультатСведенияУЗ") );
	РезультатСведенияУЗ.Состояние = XMLСтрока(ТекущаяПроверка.РазличияРеквизитовНетОшибок);
	Если НЕ ТекущаяПроверка.РазличияРеквизитовНетОшибок Тогда 
		ОтличиеСведений = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипОтличиеСведений") );
		Для Каждого  Отличие из ТекущаяПроверка.РазличияРеквизитовСведений Цикл
			ПоляОтличия = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПоляОтличия") );
			ПоляОтличия.Реквизит = Отличие.Атрибут;
			
			СтароеЗначение = Отличие.СтароеЗначение;
			НовоеЗначение = Отличие.НовоеЗначение;
			
			Если МассивЧувствительных.Найти(Отличие.АтрибутВнутренний) <> Неопределено Тогда 
				СтароеЗначение = "*";
				НовоеЗначение = "***";
				//СтароеЗначение = ЗакрытьЗвездочками(СтароеЗначение);
				//НовоеЗначение = ЗакрытьЗвездочками(НовоеЗначение);
			КонецЕсли;
	
			ПоляОтличия.СтароеЗначение = СтароеЗначение;
			ПоляОтличия.НовоеЗначение = НовоеЗначение;
			ОтличиеСведений.Отличие.Добавить(ПоляОтличия);
		КонецЦикла;		
		РезультатСведенияУЗ.Различия = ОтличиеСведений;
	КонецЕсли;
	Отчет_Проверки_ПроверкаУчетнойЗаписи.СведенияСовпадают = РезультатСведенияУЗ;
	
	РезультатСведенияУЗДоверенности = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипРезультатСведенияУЗДоверенности") );
	Для Каждого  Направление из ТекущаяПроверка.ИнформацияДоверенности Цикл
		РеквизитыДоверенности = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПоляДоверенности") );
		
		Если Направление.Доверенность <> Неопределено Тогда 
			РеквизитыДоверенности.ДатаВыдачи = XMLСтрока(Направление.Доверенность.ДатаВыдачи);
			РеквизитыДоверенности.ДатаОкончанияДействия = XMLСтрока(Направление.Доверенность.ДатаОкончания);
			РеквизитыДоверенности.Номер = ?(ТипЗнч(Направление.Доверенность) = Тип("Структура")
				И Направление.Доверенность.Свойство("НомерДоверенности"), Направление.Доверенность.НомерДоверенности,
				Направление.Доверенность.НомерДовер);
			
			Представитель1_ФИО = ПолучитьФИОДоверенности(Направление.Доверенность, Перечисления.СубъектыДоверенностиНалогоплательщика.ПредставительФЛ);
			Представитель2_ФИО = ПолучитьФИОДоверенности(Направление.Доверенность, Перечисления.СубъектыДоверенностиНалогоплательщика.ПредставительЮЛ);
			
			Представитель = ?(ПустаяСтрока(Представитель1_ФИО), Представитель2_ФИО, Представитель1_ФИО);
			
			РеквизитыДоверенности.Представитель = "***";//ЗакрытьЗвездочками(Представитель);
			РеквизитыДоверенности.ОписаниеКратко = Строка(Направление.Доверенность.Ссылка);
		Иначе
			РеквизитыДоверенности.ОписаниеКратко = "Нет доверенности";
		КонецЕсли;
		
		РеквизитыДоверенности.КПП = Направление.КПП;
		РеквизитыДоверенности.КодОрганаИФНС = Направление.КодПолучателя;
						
		Если Направление.Проблемы.Количество() = 0 Тогда 
			РеквизитыДоверенности.Состояние = "0";
		Иначе
			РеквизитыДоверенности.Состояние = "2";
			ПростаяОшибка = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПростаяОшибка") );
			Для Каждого  Проблема из Направление.Проблемы Цикл
				ПоляОшибки = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПоляОшибки") );
				ПоляОшибки.Код = Проблема.Код;
				ПоляОшибки.Описание = Проблема.Описание;
				ПростаяОшибка.Ошибка.Добавить(ПоляОшибки);
			КонецЦикла;
			РеквизитыДоверенности.Ошибки = ПростаяОшибка;
		КонецЕсли;
		
		РезультатСведенияУЗДоверенности.Доверенность.Добавить(РеквизитыДоверенности);
	КонецЦикла;		
	Отчет_Проверки_ПроверкаУчетнойЗаписи.ИнформацияДоверенности = РезультатСведенияУЗДоверенности;
	
	Если ОтчетДиагностики.Проверки.Свойство("ПроверкаПодключений") Тогда 
		ТекущаяПроверка = ОтчетДиагностики.Проверки.ПроверкаПодключений;
		
		Для Каждого Сервис из ТекущаяПроверка.Ресурсы цикл
			Ресурс = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипРесурс") );
			
			ПП = Сервис.ПараметрыПодключения;
			Адрес = ПП.ПредставлениеХоста;
			
			Если ПП.Свойство("Адрес") Тогда 							
				Если (ПП.Порт = Неопределено) Тогда 
					Ресурс.Порт = 80;
				Иначе 
					Ресурс.Порт = ПП.Порт;
				КонецЕсли;	
			Иначе 
				Если ПП.ПортSMTP <> 0 Тогда 
					Ресурс.Порт = ПП.ПортSMTP;
				Иначе
					Ресурс.Порт = ПП.ПортPOP3;				
				КонецЕсли;
			КонецЕсли;
									
			Ресурс.Хост = Адрес;			
			Ресурс.Доступен = Сервис.Результат;
			
			Если НЕ Сервис.Результат Тогда 
				Ресурс.HTTPКодОтвета = Сервис.Ошибка.Код;
				
				ПоляОшибки = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПоляОшибки") );
				ПоляОшибки.Код = Сервис.Ошибка.Код;
				ПоляОшибки.Описание = Сервис.Ошибка.Описание;
				
				Ресурс.Ошибка = ПоляОшибки;
			КонецЕсли;		
			
			Если Сервис.СервисПроверки <> Неопределено И Сервис.СервисПроверки.Использовался Тогда 
				ПоказателиВнешнейПроверки = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПоказателиВнешнейПроверки") );
				ПоказателиВнешнейПроверки.Доступен = ПривестиТип(Сервис.СервисПроверки.Доступен, "boolean");
				ПоказателиВнешнейПроверки.ДоступностьЗаПоследнийЧас = ПривестиТип(Сервис.СервисПроверки.ДоступностьЗаЧас, "unsignedByte");
				ПоказателиВнешнейПроверки.ДоступностьЗаПоследниеСутки = ПривестиТип(Сервис.СервисПроверки.ДоступностьЗаДень, "unsignedByte");
				Ресурс.ПоказателиВнешнейПроверки = ПоказателиВнешнейПроверки;
			КонецЕсли;
			
			Отчет_Проверки_ПроверкаДоступностиРесурсов.Ресурс.Добавить(Ресурс);
		КонецЦикла;
	КонецЕсли;

	//Отчет_Проверки_ПроверкаКриптографии
	Если ОтчетДиагностики.Проверки.Свойство("ПроверкаКомпонентов") Тогда 
		ТекущаяПроверка = ОтчетДиагностики.Проверки.ПроверкаКомпонентов;
		
		//Криптокомпонент
		РезультатПроверкиКомпоненты = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипРезультатПроверкиКомпоненты") );
		РезультатПроверкиКомпоненты.Состояние = ?(ТекущаяПроверка.Криптокомпонент.Подключен, 0, 2);
		Если НЕ ТекущаяПроверка.Криптокомпонент.Подключен Тогда 
			ПоляОшибки = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПоляОшибки") );
			ПоляОшибки.Код = ТекущаяПроверка.Криптокомпонент.КодОшибки;
			ПоляОшибки.Описание = ТекущаяПроверка.Криптокомпонент.ОписаниеОшибки;
			РезультатПроверкиКомпоненты.Ошибка = ПоляОшибки;
		КонецЕсли;
		Отчет_Проверки_ПроверкаКриптографии.КомпонентКриптографии = РезультатПроверкиКомпоненты;
		
		//Криптопровайдеры
		РезультатПроверкиCSP = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипРезультатПроверкиCSP") );
		РезультатПроверкиCSP.Состояние = ТекущаяПроверка.Криптопровайдеры.Состояние;
		Если НЕ ТекущаяПроверка.Криптопровайдеры.Подключен Тогда 
			ПоляОшибки = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПоляОшибки") );
			ПоляОшибки.Код = ТекущаяПроверка.Криптопровайдеры.КодОшибки;
			ПоляОшибки.Описание = ТекущаяПроверка.Криптопровайдеры.ОписаниеОшибки;
			РезультатПроверкиCSP.Ошибка = ПоляОшибки;
		КонецЕсли;
		Отчет_Проверки_ПроверкаКриптографии.СовместимыйCSP = РезультатПроверкиCSP;
		
		//РасширениеРаботыСФайлами
		РезультатПроверкиКомпоненты = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипРезультатПроверкиКомпоненты") );
		РезультатПроверкиКомпоненты.Состояние = ?(ТекущаяПроверка.РасширениеРаботыСФайлами.Подключен, 0, 2);
		Если НЕ ТекущаяПроверка.РасширениеРаботыСФайлами.Подключен Тогда 
			ПоляОшибки = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПоляОшибки") );
			ПоляОшибки.Код = ТекущаяПроверка.РасширениеРаботыСФайлами.КодОшибки;
			ПоляОшибки.Описание = ТекущаяПроверка.РасширениеРаботыСФайлами.ОписаниеОшибки;
			РезультатПроверкиКомпоненты.Ошибка = ПоляОшибки;
		КонецЕсли;
		Отчет_Проверки_ПроверкаКриптографии.РасширениеРаботыСФайлами = РезультатПроверкиКомпоненты;
	КонецЕсли;
	
	//Отчет_Проверки_ПроверкаСертификатов
	Если ОтчетДиагностики.Проверки.Свойство("ПроверкаСертификатов") Тогда 
		ТекущаяПроверка = ОтчетДиагностики.Проверки.ПроверкаСертификатов;
		Для Каждого Сертификат из ТекущаяПроверка Цикл
			ПроверкаСертификат = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипСертификат") );
			Если Сертификат.Найден Тогда 
				ПроверкаСертификат.НаименованиеПолучателя = Сертификат.Наименование;
				ПроверкаСертификат.Выдан = Сертификат.Выдан;
				ПроверкаСертификат.ГоденДо = Сертификат.ГоденДо;				
			Иначе 

				Если Сертификат.Ошибка <> Неопределено Тогда 
					ПоляОшибки = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПростоеСобытие") );
					ПоляОшибки.Код = 0;
					ПоляОшибки.Описание = Сертификат.Ошибка;
					ПроверкаСертификат.Ошибка = ПоляОшибки;
				КонецЕсли;
				
				ПроверкаСертификат.Содержимое = Сертификат.Содержимое;
			КонецЕсли;
			ПроверкаСертификат.Хранилище = Сертификат.Хранилище;
			ПроверкаСертификат.Отпечаток = Сертификат.Отпечаток;
			ПроверкаСертификат.Найден = Сертификат.Найден;			
			Отчет_Проверки_ПроверкаСертификатов.Сертификат.Добавить(ПроверкаСертификат);
		КонецЦикла;		
	КонецЕсли;
	
	//Отчет_Проверки_ПроверкаКриптоопераций
	Если ОтчетДиагностики.Проверки.Свойство("ПроверкаКриптоопераций") Тогда 
		ТекущаяПроверка = ОтчетДиагностики.Проверки.ПроверкаКриптоопераций;
		Для Каждого Криптооперация из ТекущаяПроверка Цикл
			ПроверкаКриптооперация = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипКриптооперация") );
			Если Криптооперация.Операция = "Шифрование" Тогда 
				КодКО = 0;
			ИначеЕсли Криптооперация.Операция = "Расшифровка" Тогда 
				КодКО = 1;
			ИначеЕсли Криптооперация.Операция = "Подпись" Тогда 
				КодКО = 2;
			ИначеЕсли Криптооперация.Операция = "Проверка подписи" Тогда 
				КодКО = 3;
			Иначе
				КодКО = 9;
			КонецЕсли;
			ПроверкаКриптооперация.Код = КодКО;
			ПроверкаКриптооперация.Описание = Криптооперация.Операция;
			ПроверкаКриптооперация.Успешно = Криптооперация.Успешно;
			Если НЕ Криптооперация.Успешно Тогда 
				ПоляОшибки = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПоляОшибки") );
				ПоляОшибки.Код = 0;
				ПоляОшибки.Описание = Криптооперация.ОписаниеОшибки;
				ПроверкаКриптооперация.Ошибка = ПоляОшибки;
			КонецЕсли;
			Отчет_Проверки_ПроверкаКриптоопераций.Криптооперация.Добавить(ПроверкаКриптооперация);
		КонецЦикла;
	КонецЕсли;
	
	Отчет_Проверки = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипВсеПроверки") );
	Отчет.Проверки = Отчет_Проверки;
	
	Отчет.Проверки.ПроверкаУчетнойЗаписи = Отчет_Проверки_ПроверкаУчетнойЗаписи;
	Отчет.Проверки.ПроверкаДоступностиРесурсов = Отчет_Проверки_ПроверкаДоступностиРесурсов;
	Отчет.Проверки.ПроверкаКриптографии = Отчет_Проверки_ПроверкаКриптографии;
	Отчет.Проверки.ПроверкаСертификатов = Отчет_Проверки_ПроверкаСертификатов;
	Отчет.Проверки.ПроверкаКриптоопераций = Отчет_Проверки_ПроверкаКриптоопераций;
	
	Отчет_ДополнительнаяИнформация = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипИнформация") );
	
	//Отчет_ДополнительнаяИнформация
	ТекущаяПроверка = ОтчетДиагностики.ДополнительнаяИнформация;
	
	Для Каждого Информация из ТекущаяПроверка Цикл
		
		ПоляИнформации = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПоляИнформации") );
		ПоляИнформации.Вид = Информация.Ключ;
		
		Если Информация.Ключ = "ПодключенныеНаправления" Тогда 			
			ЭлементСписка = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипИнформацияСписками") );
			Для Каждого Элемент из Информация.Значение Цикл
				ПоляНаправления = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПоляНаправления") );
				
				ПоляНаправления.ТипПолучателя = Элемент.ТипПолучателяСтрокой;
				ПоляНаправления.КодПолучателя = Элемент.КодПолучателя;
				ПоляНаправления.КПП = Элемент.КПП;
				
				ЭлементСписка.Направление.Добавить(ПоляНаправления);
			КонецЦикла;
			ПоляИнформации.Значения = ЭлементСписка;
			
		ИначеЕсли Информация.Ключ = "Нерасшифрованные" Тогда 			
			ЭлементСписка = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипИнформацияСписками") );
			Для Каждого Элемент из Информация.Значение Цикл
				
				ПоляНерасшифрованногоСообщения = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПоляНерасшифрованногоСообщения") );
				
				Если Элемент.Отправитель = Неопределено Тогда 
					Отправитель = "<неизвестный>"
				ИначеЕсли Элемент.Отправитель.Наименование = "" Тогда 
					Отправитель = Элемент.Отправитель.Код;
				ИначеЕсли Найти(НРег(Строка(ТипЗнч(Элемент.Отправитель))), "органы") > 0  Тогда 
					Отправитель = Элемент.Отправитель.Код + " - " + Элемент.Отправитель.Наименование;
				Иначе
					Отправитель = Элемент.Отправитель.Наименование;
				КонецЕсли;
				
				ПоляНерасшифрованногоСообщения.ИдентификаторСообщения = Элемент.ИдентификаторСообщения;
				ПоляНерасшифрованногоСообщения.ДатаТранспорта = Элемент.ДатаТранспорта;
				ПоляНерасшифрованногоСообщения.Тема = Элемент.Тема;
				ПоляНерасшифрованногоСообщения.Отправитель = Отправитель;
				ПоляНерасшифрованногоСообщения.ИдентификаторДокументооборота = Элемент.идентификаторДокументооборота;
				
				//Добавление реквизитов версии 1.1
				
				ПоляНерасшифрованногоСообщения.Контейнеры = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипКонтейнеры") );
				Для Каждого ТК Из Элемент.СодержимоеТранспортныхКонтейнеров Цикл
					Контейнер = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипКонтейнер") );
					Контейнер.ОшибкаКонтейнера = ТК.ОшибкаКонтейнера;
					Контейнер.Размер = ТК.РазмерКонтейнера;
					Контейнер.Вложения = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипВложенияКонтейнера") );
										
					Для Каждого Вложение Из ТК.Документы Цикл
						ВложениеXML = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипВложение") );	
						ВложениеXML.ОшибкаВложения = Вложение.ОшибкаДокумента;
						ВложениеXML.Размер = Вложение.РазмерДокумента;
						ВложениеXML.Представление = Вложение.Представление;
						ВложениеXML.ТранспортныеСертификаты = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипТранспортныеСертификаты") );	
						Для Каждого Сертификат Из Вложение.Сведения Цикл
							ТранспортныйСертификат = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипТранспортныйСертификат") );
							ТранспортныйСертификат.СерийныйНомер = Сертификат.serial_number;
							ТранспортныйСертификат.Поставщик = Сертификат.issuer;
							ТранспортныйСертификат.Найден = Сертификат.found;
							
							ВложениеXML.ТранспортныеСертификаты.ТранспортныйСертификат.Добавить(ТранспортныйСертификат);
						КонецЦикла;
						Контейнер.Вложения.Вложение.Добавить(ВложениеXML);
					КонецЦикла;
										
					ПоляНерасшифрованногоСообщения.Контейнеры.Контейнер.Добавить(Контейнер);
				КонецЦикла;
				//***
				
				ЭлементСписка.Сообщение.Добавить(ПоляНерасшифрованногоСообщения);
			КонецЦикла;
			ПоляИнформации.Значения = ЭлементСписка;
			
		ИначеЕсли Информация.Ключ = "АнтивирусноеПО" Тогда 
			ЭлементСписка = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипИнформацияСписками") );
			Для Каждого Элемент из Информация.Значение Цикл
				КомпонентАВ = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипКомпонентАВ") );
				КомпонентАВ.Группа = Элемент.Группа;
				КомпонентАВ.DisplayName = Элемент.DisplayName;
				КомпонентАВ.ImagePath = Элемент.ImagePath;
				КомпонентАВ.Start = Строка(Элемент.Start);
				КомпонентАВ.Запущен = Элемент.Запущен;
				
				ЭлементСписка.Компонент.Добавить(КомпонентАВ);
			КонецЦикла;
			ПоляИнформации.Значения = ЭлементСписка;
			
		Иначе			
			ПоляИнформации.Значение = ?(Информация.Значение = Неопределено, "", Информация.Значение);
		КонецЕсли;	
						
		Отчет_ДополнительнаяИнформация.Инфо.Добавить(ПоляИнформации);
	КонецЦикла;
	
	//Отчет.Свойство("АдресСодержимогоЖР")
	//Отчет.Вставить("СодержимоеЖРПолучено", Истина);
	
	ПоляИнформацииЖРПолучен = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПоляИнформации") );
	ПоляИнформацииЖРПолучен.Вид = "ЖурналРегистрации.Получен";
	ПоляИнформацииЖРПолучен.Значение = Ложь;
			
	Если ОтчетДиагностики.Свойство("СодержимоеЖРПолучено") Тогда
		Если ОтчетДиагностики.СодержимоеЖРПолучено Тогда
			ФоновоеЗадание_ЖурналРегистрации = ПолучитьИзВременногоХранилища(ОтчетДиагностики.АдресСодержимогоЖР);
			Если ФоновоеЗадание_ЖурналРегистрации = Неопределено Тогда 
				
				ПоляИнформации = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПоляИнформации") );
				ПоляИнформации.Вид = "ЖурналРегистрации.Медленный";
				ПоляИнформации.Значение = Истина;
				Отчет_ДополнительнаяИнформация.Инфо.Добавить(ПоляИнформации);
				
				ТекущаяПроверка = ОтчетДиагностики.ЖурналРегистрации;
			Иначе
				ПоляИнформацииЖРПолучен.Значение = Истина;
				ТекущаяПроверка = ФоновоеЗадание_ЖурналРегистрации.Журнал;
				
				ПоляИнформации = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПоляИнформации") );
				ПоляИнформации.Вид = "ЖурналРегистрации.Начало";
				ПоляИнформации.Значение = XMLСтрока(ФоновоеЗадание_ЖурналРегистрации.Начало);
				Отчет_ДополнительнаяИнформация.Инфо.Добавить(ПоляИнформации);
				
				ПоляИнформации = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПоляИнформации") );
				ПоляИнформации.Вид = "ЖурналРегистрации.Окончание";
				ПоляИнформации.Значение = XMLСтрока(ФоновоеЗадание_ЖурналРегистрации.Окончание);
				Отчет_ДополнительнаяИнформация.Инфо.Добавить(ПоляИнформации);
				
				ПоляИнформации = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПоляИнформации") );
				ПоляИнформации.Вид = "ЖурналРегистрации.ЗатраченоСек";
				ПоляИнформации.Значение = XMLСтрока(ФоновоеЗадание_ЖурналРегистрации.ЗатраченоВремениСекунд);
				Отчет_ДополнительнаяИнформация.Инфо.Добавить(ПоляИнформации);
				
			КонецЕсли;			
		Иначе
			ТекущаяПроверка = ОтчетДиагностики.ЖурналРегистрации;
		КонецЕсли;
	Иначе
		ТекущаяПроверка = ОтчетДиагностики.ЖурналРегистрации;
	КонецЕсли;
	
	Отчет_ДополнительнаяИнформация.Инфо.Добавить(ПоляИнформацииЖРПолучен);
	
	Если ТекущаяПроверка.Количество() > 0 Тогда 
		ПоляИнформации = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПоляИнформации") );
		ПоляИнформации.Вид = "ЖурналРегистрации";
		
		ЭлементСписка = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипИнформацияСписками") );	
		Для Каждого ЗаписьЖР из ТекущаяПроверка Цикл 
			РеквизитыЖР = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипРеквизитыЗаписиЖР") );
			ЗаполнитьЗначенияСвойств(РеквизитыЖР, ЗаписьЖР);
			ЭлементСписка.ЗаписьЖурнала.Добавить(РеквизитыЖР);			
		КонецЦикла;		
		ПоляИнформации.Значения = ЭлементСписка;		
		Отчет_ДополнительнаяИнформация.Инфо.Добавить(ПоляИнформации);
	КонецЕсли;
	
	ЧастьОтчета = ОтчетДиагностики.Проверки.ПроверкаУчетнойЗаписи.ЗаявленияАбонента;
	Если ЧастьОтчета.Документы.Количество() > 0 Тогда
		ПоляИнформации = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипПоляИнформации") );
		ПоляИнформации.Вид = "НеобработанныеЗаявления";
		
		ЭлементСписка = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипИнформацияСписками") );	
		Для Каждого Запись из ЧастьОтчета.Документы Цикл 
			Реквизиты = Определение.ФабрикаXDTO.Создать( Определение.ФабрикаXDTO.Тип("1c.services", "ТипРеквизитыИнформацииЗаявления") );
			ЗаполнитьЗначенияСвойств(Реквизиты, Запись, "Лицензия, Сертификат, Направления, Реквизиты");
			Реквизиты.Представление = "Заявление оператору ЭДО № " + Строка(Запись.Заявление.Номер) + " от " + Строка(Запись.Заявление.Дата);
			ЭлементСписка.Заявление.Добавить(Реквизиты);			
		КонецЦикла;		
		ПоляИнформации.Значения = ЭлементСписка;		
		Отчет_ДополнительнаяИнформация.Инфо.Добавить(ПоляИнформации);
	КонецЕсли;
	
	Отчет.ДополнительнаяИнформация = Отчет_ДополнительнаяИнформация;
	
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку();
	ЗаписьXML.ЗаписатьОбъявлениеXML();
	
	Определение.ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, Отчет);
	
	ОтчетСтрокойXML = ЗаписьXML.Закрыть();
			
	Если ТолькоСформировать Тогда 
		Возврат ОтчетСтрокойXML;
	КонецЕсли;
	
	Прокси = ПолучениеФайловИзИнтернета.ПолучитьПрокси("https");
	
	ЗащищенноеСоединение = ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение(
            Неопределено,
            Новый СертификатыУдостоверяющихЦентровОС);
	
	Если СтрДлина(ОтчетСтрокойXML) > 50000 Тогда
		ИспользоватьСжатие = Истина;
	Иначе
		ИспользоватьСжатие = Ложь;
	КонецЕсли;
	
	СжатыйОтчетXML = "";
	
	Если ИспользоватьСжатие Тогда 
		СжатыйОтчет = Новый ХранилищеЗначения(ОтчетСтрокойXML, Новый СжатиеДанных(9));
		СжатыйОтчетXML = XMLСтрока(СжатыйОтчет);	
	КонецЕсли;
	
	Таймаут = 20;
	ОписаниеОшибки = "";
		
	Если ИспользоватьСжатие Тогда
		Запрос = Новый HTTPЗапрос("/diag/hs/api/v1/AddReportZip");
		Запрос.УстановитьТелоИзСтроки(СжатыйОтчетXML,, ИспользованиеByteOrderMark.НеИспользовать);
	Иначе 
		Запрос = Новый HTTPЗапрос("/diag/hs/api/v1/AddReport");
		Запрос.УстановитьТелоИзСтроки(ОтчетСтрокойXML,, ИспользованиеByteOrderMark.НеИспользовать);
	КонецЕсли;
	
	Соединение = Новый HTTPСоединение(ПолучательОтчета, 443, РеквизитыПодключения.Реквизит, РеквизитыПодключения.Значение, Прокси, Таймаут, ЗащищенноеСоединение);
	
	ОтправленУспешно = Ложь;
	Для ш = 1 по 3 Цикл 
		Попытка
			Ответ = Соединение.ОтправитьДляОбработки(Запрос);
			Если Ответ.КодСостояния <> 200 Тогда 
				ОтветСтрокой = Ответ.ПолучитьТелоКакСтроку();
				Если ОтветСтрокой = Неопределено Тогда 
					ОтветСтрокой = "{""error"": ""generic""}";
				КонецЕсли;
				ЗаписьЖурналаРегистрации("Диагностика 1С-Отчетность. Отправка отчета", УровеньЖурналаРегистрации.Ошибка,,, ОтветСтрокой);
				Продолжить;
			КонецЕсли;
			ОтправленУспешно = Истина;
			Прервать;
		Исключение
			
			Инф = ИнформацияОбОшибке();
			Если Инф.Причина = Неопределено Тогда 
				ОписаниеОшибки = Инф.Описание;
			Иначе 
				ОписаниеОшибки = Инф.Причина.Описание;
			КонецЕсли;
			ЗаписьЖурналаРегистрации("Диагностика 1С-Отчетность. Отправка отчета", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки);
		КонецПопытки;
	КонецЦикла;
	
	Если НЕ ОтправленУспешно Тогда 
		ИдентификаторОтчета = Идентификатор;
		Элементы.ДекорацияУспешноОтправлен.Видимость = Ложь;
		Элементы.ГруппаГоризонтальная.Видимость = Истина;		
		Возврат Ложь;
	КонецЕсли;
	
	ОтветСтрокой = Ответ.ПолучитьТелоКакСтроку();
	Если ОтветСтрокой = Неопределено Тогда 
		ОтветСтрокой = "{""error"": ""generic""}";
	КонецЕсли;
	
	ЧтJSON = Новый ЧтениеJSON;
	ЧтJSON.УстановитьСтроку(ОтветСтрокой);
	
	Попытка
		СтруктураJSON = ПрочитатьJSON(ЧтJSON, Ложь);
	Исключение
		СтруктураJSON = Новый Структура("error", "Не удалось разобрать ответ сервера");
		ЗаписьЖурналаРегистрации("Диагностика 1С-Отчетность. Отправка отчета", УровеньЖурналаРегистрации.Ошибка,,, СтруктураJSON.error);
	КонецПопытки;
	
	Если СтруктураJSON.Свойство("error") Тогда 
		ОписаниеОшибки = СтруктураJSON.error;
		ИдентификаторОтчета = Идентификатор;
		Элементы.ДекорацияУспешноОтправлен.Видимость = Ложь;
		Элементы.ГруппаГоризонтальная.Видимость = Истина;		
		Возврат Ложь;
	КонецЕсли;
	
	ИдентификаторОтчета = СтруктураJSON.result;
	Элементы.ДекорацияУспешноОтправлен.Видимость = Истина;
	Элементы.ГруппаГоризонтальная.Видимость = Истина;
		
	Возврат Истина;

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

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

#Область ОбработчикиДействий

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

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

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

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

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

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

	Иначе
		Сообщение = НСтр("ru = 'Не удалось найти подробное описание данного элемента'");
		ОбщегоНазначенияКлиент.СообщитьПользователю(Сообщение);
	КонецЕсли;
	
КонецПроцедуры

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

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

#Область ОбщегоНазначения

&НаСервереБезКонтекста
Функция СлучайноеБулево() Экспорт
	
	Ген = Новый ГенераторСлучайныхЧисел();
	СлЧисло = Ген.СлучайноеЧисло(1, 999999);
	Если СлЧисло%2 = 0 Тогда 
		Возврат Истина;
	КонецЕсли;
	Возврат Ложь;
	
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Функция ТипКлиента(ТипЧислом = -1) Экспорт
	
	ТипЧислом = 2;
	Возврат "Тонкий клиент";

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

&НаКлиенте
Функция ДанныеДляТеста()
	
	Возврат Base64Значение("MDEyMzQ1Njc5OEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFla");
	
КонецФункции

&НаСервереБезКонтекста
Функция ИмяЗначенияПеречисления(Вид)
	
	Индекс = Перечисления[Вид.Метаданные().Имя].Индекс(Вид);
	Возврат Метаданные.Перечисления[Вид.Метаданные().Имя].ЗначенияПеречисления.Получить(Индекс).Имя;	
	
КонецФункции

&НаСервереБезКонтекста
Функция ОрганизацияЯвляетсяИП(Организация)
	
	Возврат НЕ РегламентированнаяОтчетностьПереопределяемый.ЭтоЮридическоеЛицо(Организация.Ссылка);
	
КонецФункции

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

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

&НаСервереБезКонтекста
Функция ПолучитьВсеСобытия() Экспорт
	
	События = Новый Соответствие;
	
	//Общие события
	События.Вставить(0, "Нет ошибок");
	События.Вставить(0 + 256 + 0, "Ошибка");
	События.Вставить(0 + 256 + 1, "Не найдено описание ошибки");
	События.Вставить(0 + 128 + 0, "Предупреждение");
	События.Вставить(0 + 128 + 1, "Не найдено описание предупреждения");
	События.Вставить(0 + 128 + 2, "Есть сообщения которые нельзя расшифровать");
	События.Вставить(0 +  0  + 0, "Информация");
	События.Вставить(0 +  0  + 1, "Не найдено описание информации");
	
	//События проверки учетной записи
	//Ошибки
	События.Вставить(512 + 256 +  0, "Период действия лицензии закончился");
	События.Вставить(512 + 256 +  1, "Период действия лицензии ещё не начался");
	События.Вставить(512 + 256 +  2, "Учетная запись документооборота неактивна");
	События.Вставить(512 + 256 +  8, "Один или несколько реквизитов учетной записи различаются");
	События.Вставить(512 + 256 +  9, "Одна или несколько доверенностей содержат ошибки");
	События.Вставить(512 + 256 + 10, "Отсутствует доверенность");
	События.Вставить(512 + 256 + 11, "Срок действия доверенности уже истёк");
	События.Вставить(512 + 256 + 12, "Срок действия доверенности ещё не начался");
	События.Вставить(512 + 256 + 13, "Доверенность должна быть выдана на владельца ЭП");
	
	События.Вставить(512 + 256 + 20, "Не удалось выполнить тестовую криптооперацию");
	
	//Предупреждения
	События.Вставить(512 + 128 +  0, "Период действия лицензии заканчивается");	
	События.Вставить(512 + 128 +  5, "Есть необработанные заявления");	
	События.Вставить(512 + 128 + 10, "В регистрации в налоговом органе указан представитель отличный от такового в доверенности");
	События.Вставить(512 + 128 + 11, "Владельца ЭЦП нет в справочнике физических лиц");
	События.Вставить(512 + 128 + 12, "В доверенности не указаны полномочия представителя");
	
	//Информация
	События.Вставить(512 +  0  +  0, "Период действия лицензии в порядке");
	События.Вставить(512 +  0  +  1, "Учетная запись документооборота активна");
	События.Вставить(512 +  0  + 10, "Представитель найден в базе");
	События.Вставить(512 +  0  + 11, "ФИО представителя И владельца ЭП совпали");
	События.Вставить(512 +  0  + 12, "Представитель не найден в базе");
	
	//События проверки ресурсов
	//Ошибки
	События.Вставить(1024 + 256 +  0, "");
	События.Вставить(1024 + 256 +  1, "Не удалось подключиться к службе");
	
	//Предупреждения
	События.Вставить(1024 + 128 +  0, "");
	События.Вставить(1024 + 128 +  1, "Включен тестовый режим, адреса тестовых серверов получателей могут отличаться от продуктивных");
	События.Вставить(1024 + 128 +  2, "Направление ФСРАР отключено");
	События.Вставить(1024 + 128 +  3, "Направление ПФР отключено");
	События.Вставить(1024 + 128 +  4, "Направление ФНС отключено");
	События.Вставить(1024 + 128 +  5, "Направление ФСГС отключено");
	События.Вставить(1024 + 128 +  6, "Направление РПН отключено");
	События.Вставить(1024 + 128 +  7, "Направление ФТС отключено");
	События.Вставить(1024 + 128 +  8, "Направление ФСС отключено");
	
	//Информация
	События.Вставить(1024 +  0  +  0, "");
	
	//События проверки криптографии
	//Ошибки
	События.Вставить(2048 + 256 +  0, "Есть ошибки криптографии");
	
	//Предупреждения
	События.Вставить(2048 + 128 +  0, "");
	
	//Информация
	События.Вставить(2048 +  0  +  0, "");
	
	//События проверки сертификатов
	//Ошибки
	События.Вставить(4096 + 256 +  0, "");
	События.Вставить(4096 + 256 +  1, "Сертификат не установлен");
	
	//Предупреждения
	События.Вставить(4096 + 128 +  0, "");
	
	//Информация
	События.Вставить(4096 +  0  +  0, "");
	
	//События проверки криптоопераций
	//Ошибки
	События.Вставить(8192 + 256 +  0, "Не удалось выполнить криптооперацию");
	События.Вставить(8192 + 256 +  1, "Не удалось выполнить шифрование");
	События.Вставить(8192 + 256 +  2, "Не удалось выполнить расшифровку");
	
	//Предупреждения
	События.Вставить(8192 + 128 +  0, "");
	
	//Информация
	События.Вставить(8192 +  0  +  0, "");
	
	Возврат События;	
	
КонецФункции

&НаСервереБезКонтекста
Функция ПолучитьОписаниеСобытия(Категория = 0, Вид = 0, Событие = 0) Экспорт
	
	//Алгоритм генерации кода события
	//Категория 0, 1, 2, 3, 4
	// 0 Общая
	// 1 Проверка учетной записи
	// 2 Проверка ресурсов
	// 3 Проверка криптографии
	// 4 Проверка сертификатов
	// 5 Проверка криптоопераций
	//Вид 0, 1, 2
	// &0x0000h 0 Информация
	// &0x0080h 1 Предупреждение
	// &0x0100h 2 Ошибка

	КодКатегории = 0;
	КодВида = 0;
	Если Категория > 0 Тогда 
		КодКатегории = Pow(2, 8 + Категория);
	КонецЕсли;
	Если Вид > 0 Тогда 
		КодВида = Pow(2, 6 + Вид);
	КонецЕсли;
	
	КодОшибки = КодКатегории+КодВида+Событие;
	
	События = ПолучитьВсеСобытия();
		
	Событие = События.Получить(КодОшибки);
	
	Если Событие = Неопределено Тогда 
		Событие = События.НайтиПоЗначению(257);
	КонецЕсли;	
	
	Возврат Новый Структура("Код, Описание", КодОшибки, Событие)
	
КонецФункции

&НаСервереБезКонтекста
Функция ПривестиТип(Значение, СтандартныйТипXML)
	
	ТипЗначения = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", СтандартныйТипXML);
	Если ТипЗначения = Неопределено Тогда 
		Возврат Неопределено;
	КонецЕсли;
	Результат = ФабрикаXDTO.Создать(ТипЗначения, Значение);
	Возврат Результат.ЛексическоеЗначение;
	
КонецФункции

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

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

&НаСервере
Функция НайтиОписаниеПоКоду(Код, МакетПодсказки = Неопределено, 
			Ссылка1 = Неопределено, 
			Ссылка2 = Неопределено, 
			ВхПараметр1 = Неопределено, 
			ВхПараметр2 = Неопределено, 
			ВхПараметр3 = Неопределено, 
			ВхПараметр4 = Неопределено, 
			ВхПараметр5 = Неопределено)
	
	Ссылка1 = Новый Структура("Текст, Ссылка, Действие", "", Неопределено, Неопределено);
	Ссылка2 = Новый Структура("Текст, Ссылка, Действие", "", Неопределено, Неопределено);
	
	Если МакетПодсказки = Неопределено Тогда 
		//Обработка = РеквизитФормыВЗначение("Объект");
		Обработка = ДокументооборотСКО.ПолучитьОбработкуЭДО();
		МакетПодсказки = Обработка.ПолучитьМакет("ДиагностикаОтчетности_Подсказки");
	КонецЕсли;
	
	КолонкаКод = МакетПодсказки.Область("C1");
	Область = МакетПодсказки.НайтиТекст(Код,, КолонкаКод);
	Если Область = Неопределено Тогда 
		Возврат "";
	КонецЕсли;
	НомерСтроки = Область.Низ;
	
	СсылкаТекст1 = СокрЛП(МакетПодсказки.Область(НомерСтроки, 2, НомерСтроки, 2).Текст);
	СсылкаТекст2 = СокрЛП(МакетПодсказки.Область(НомерСтроки, 3, НомерСтроки, 3).Текст);
	СсылкаДействие1 = СокрЛП(МакетПодсказки.Область(НомерСтроки, 4, НомерСтроки, 4).Текст);
	СсылкаДействие2 = СокрЛП(МакетПодсказки.Область(НомерСтроки, 5, НомерСтроки, 5).Текст);
	
	НайденныйТекст = МакетПодсказки.Область(НомерСтроки, 6, НомерСтроки, 6).Текст;
	
	Если ВхПараметр5 <> Неопределено Тогда 
		НайденныйТекст = СтрЗаменить(НайденныйТекст, "%5", ВхПараметр5);
	КонецЕсли;
	Если ВхПараметр4 <> Неопределено Тогда 
		НайденныйТекст = СтрЗаменить(НайденныйТекст, "%4", ВхПараметр4);
	КонецЕсли;
	Если ВхПараметр3 <> Неопределено Тогда 
		НайденныйТекст = СтрЗаменить(НайденныйТекст, "%3", ВхПараметр3);
	КонецЕсли;
	Если ВхПараметр2 <> Неопределено Тогда 
		НайденныйТекст = СтрЗаменить(НайденныйТекст, "%2", ВхПараметр2);
	КонецЕсли;
	Если ВхПараметр1 <> Неопределено Тогда 
		НайденныйТекст = СтрЗаменить(НайденныйТекст, "%1", ВхПараметр1);
	КонецЕсли;
	
	Если СсылкаТекст1 <> "" Тогда 
		Ссылка1.Текст = СсылкаТекст1;
		Если СсылкаДействие1 <> "" Тогда 
			Ссылка1.Действие = СсылкаДействие1;
		КонецЕсли;		
		НайденныйТекст = СтрЗаменить(НайденныйТекст, СсылкаТекст1, "%1");
	КонецЕсли;
	Если СсылкаТекст2 <> "" Тогда 
		Ссылка2.Текст = СсылкаТекст2;
		Если СсылкаДействие2 <> "" Тогда 
			Ссылка2.Действие = СсылкаДействие2;
		КонецЕсли;		
		НайденныйТекст = СтрЗаменить(НайденныйТекст, СсылкаТекст2, "%2");
	КонецЕсли;
			
	Возврат НайденныйТекст;
	
КонецФункции

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

&НаСервереБезКонтекста
Функция ОписаниеHTTPКода(Код)
	
	СписокКодовHTTP = Новый СписокЗначений;
	
	///Стандартные
	СписокКодовHTTP.Добавить(100, "Continue");
	СписокКодовHTTP.Добавить(101, "Switching Protocols");
	СписокКодовHTTP.Добавить(102, "Processing");
	
	СписокКодовHTTP.Добавить(200, "OK");
	СписокКодовHTTP.Добавить(201, "Created");
	СписокКодовHTTP.Добавить(202, "Accepted");
	СписокКодовHTTP.Добавить(203, "Non-Authoritative Information");
	СписокКодовHTTP.Добавить(204, "No Content");
	СписокКодовHTTP.Добавить(205, "Reset Content");
	СписокКодовHTTP.Добавить(206, "Partial Content");
	СписокКодовHTTP.Добавить(207, "Multi-Status");
	СписокКодовHTTP.Добавить(208, "Already Reported");
	СписокКодовHTTP.Добавить(226, "IM Used");
	
	СписокКодовHTTP.Добавить(300, "Multiple Choices");
	СписокКодовHTTP.Добавить(301, "Moved Permanently");
	СписокКодовHTTP.Добавить(302, "Found");
	СписокКодовHTTP.Добавить(303, "See Other");
	СписокКодовHTTP.Добавить(304, "Not Modified");
	СписокКодовHTTP.Добавить(305, "Use Proxy");
	СписокКодовHTTP.Добавить(306, "Switch Proxy");
	СписокКодовHTTP.Добавить(307, "Temporary Redirect");
	СписокКодовHTTP.Добавить(308, "Permanent Redirect");
	
	СписокКодовHTTP.Добавить(400, "Bad Request");
	СписокКодовHTTP.Добавить(401, "Unauthorized ");
	СписокКодовHTTP.Добавить(402, "Payment Required");
	СписокКодовHTTP.Добавить(403, "Forbidden");
	СписокКодовHTTP.Добавить(404, "Not Found");
	СписокКодовHTTP.Добавить(405, "Method Not Allowed");
	СписокКодовHTTP.Добавить(406, "Not Acceptable");
	СписокКодовHTTP.Добавить(407, "Proxy Authentication Required");
	СписокКодовHTTP.Добавить(408, "Request Timeout");
	СписокКодовHTTP.Добавить(409, "Conflict");
	СписокКодовHTTP.Добавить(410, "Gone");
	СписокКодовHTTP.Добавить(411, "Length Required");
	СписокКодовHTTP.Добавить(412, "Precondition Failed");
	СписокКодовHTTP.Добавить(413, "Payload Too Large");
	СписокКодовHTTP.Добавить(414, "URI Too Long");
	СписокКодовHTTP.Добавить(415, "Unsupported Media Type");
	СписокКодовHTTP.Добавить(416, "Range Not Satisfiable");
	СписокКодовHTTP.Добавить(417, "Expectation Failed");
	СписокКодовHTTP.Добавить(418, "I'm a teapot");
	СписокКодовHTTP.Добавить(421, "Misdirected Request");
	СписокКодовHTTP.Добавить(422, "Unprocessable Entity");
	СписокКодовHTTP.Добавить(423, "Locked");
	СписокКодовHTTP.Добавить(424, "Failed Dependency");
	СписокКодовHTTP.Добавить(426, "Upgrade Required");
	СписокКодовHTTP.Добавить(428, "Precondition Required");
	СписокКодовHTTP.Добавить(429, "Too Many Requests");
	СписокКодовHTTP.Добавить(431, "Request Header Fields Too Large");
	СписокКодовHTTP.Добавить(449, "Retry With");
	СписокКодовHTTP.Добавить(451, "Unavailable For Legal Reasons");
	
	СписокКодовHTTP.Добавить(500, "Internal Server Error");
	СписокКодовHTTP.Добавить(501, "Not Implemented");
	СписокКодовHTTP.Добавить(502, "Bad Gateway");
	СписокКодовHTTP.Добавить(503, "Service Unavailable");
	СписокКодовHTTP.Добавить(504, "Gateway Timeout");
	СписокКодовHTTP.Добавить(505, "HTTP Version Not Supported");
	СписокКодовHTTP.Добавить(506, "Variant Also Negotiates");
	СписокКодовHTTP.Добавить(507, "Insufficient Storage");
	СписокКодовHTTP.Добавить(508, "Loop Detected");
	СписокКодовHTTP.Добавить(510, "Not Extended");
	СписокКодовHTTP.Добавить(511, "Network Authentication Required");
	
	///Нестандартные
	СписокКодовHTTP.Добавить(103, "Checkpoint");
	СписокКодовHTTP.Добавить(450, "Blocked by Windows Parental Controls");
	СписокКодовHTTP.Добавить(499, "Request has been forbidden by antivirus");
	СписокКодовHTTP.Добавить(509, "Bandwidth Limit Exceeded");
	СписокКодовHTTP.Добавить(530, "Site is frozen");
	СписокКодовHTTP.Добавить(440, "Login Timeout");
	СписокКодовHTTP.Добавить(449, "Retry With");
	СписокКодовHTTP.Добавить(451, "Redirect");
	СписокКодовHTTP.Добавить(444, "No Response");
	СписокКодовHTTP.Добавить(495, "SSL Certificate Error");
	СписокКодовHTTP.Добавить(496, "SSL Certificate Required");
	СписокКодовHTTP.Добавить(497, "HTTP Request Sent to HTTPS Port");
	СписокКодовHTTP.Добавить(499, "Client Closed Request");
	СписокКодовHTTP.Добавить(520, "Unknown Error");
	СписокКодовHTTP.Добавить(521, "Web Server Is Down");
	СписокКодовHTTP.Добавить(522, "Connection Timed Out");
	СписокКодовHTTP.Добавить(523, "Origin Is Unreachable");
	СписокКодовHTTP.Добавить(524, "A Timeout Occurred");
	СписокКодовHTTP.Добавить(525, "SSL Handshake Failed");
	СписокКодовHTTP.Добавить(526, "Invalid SSL Certificate");
	
	Результат = СписокКодовHTTP.НайтиПоЗначению(Код);
	Если Результат = Неопределено Тогда 
		Возврат Формат(Код, "ЧЦ=3; ЧДЦ=; ЧГ=") + " Unknown HTTP Status Code"
	КонецЕсли;
	
	Возврат Формат(Код, "ЧЦ=3; ЧДЦ=; ЧГ=") + " " + Результат.Представление;
	
КонецФункции

&НаСервереБезКонтекста
Функция СтрокаБезДефисов(Текст) Экспорт
	
	Возврат СтрЗаменить(Текст, "-", "");
	
КонецФункции

&НаСервереБезКонтекста
Функция КодПФР(РеквизитыОрганизации)
	
	ПолученыйКодПФР = "";
	
	Если ПустаяСтрока(РеквизитыОрганизации.КодОрганаПФР) ИЛИ СтрДлина(РеквизитыОрганизации.КодОрганаПФР) < 7 Тогда
		ПолученыйКодПФР = Лев(РеквизитыОрганизации.КодОрганаПФР, 7); 
	Иначе
		ПолученыйКодПФР = РеквизитыОрганизации.КодОрганаПФР;
	КонецЕсли;
	
	Возврат ПолученыйКодПФР;
	
КонецФункции

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

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