Документооборот с контролирующими органами / Модуль менеджера

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ДиагностикаОтчетности_ФоновыеЗадания

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

Процедура ДобавитьИнформациюЖР(Параметры, АдресРезультата) Экспорт
	
	Результат = ПолучитьИнформациюЖР(Параметры.Начало, Параметры.Окончание);
	ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
				
КонецПроцедуры

Процедура ДобавитьПодсистемы(Куда, ПодсистемаРодитель)
	
	Для Каждого Объект из ПодсистемаРодитель.Состав Цикл 
		Куда.Добавить(Объект);
	КонецЦикла;
	Для Каждого Подсистема из ПодсистемаРодитель.Подсистемы Цикл 
		ДобавитьПодсистемы(Куда, Подсистема);
	КонецЦикла;
	
КонецПроцедуры

Функция ПредставлениеМетаданных(МетаданныеЖурнала)
	
	Если ТипЗнч(МетаданныеЖурнала) = Тип("Массив") Тогда 
		Представление = "";
		Для Каждого ОбъектМетаданных Из МетаданныеЖурнала Цикл 
			Представление = Представление + ?(Представление = "", "", ", ") + СокрЛП(ОбъектМетаданных);
		КонецЦикла;
		
		Возврат Представление;
		
	Иначе
		
		Возврат СокрЛП(МетаданныеЖурнала);
		
	КонецЕсли;
	
КонецФункции

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

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

#Область СервисыОбратногоЗвонка_КалугаАстрал

Функция ПолучитьЗапрос(Знач Телефон, Знач Имя)
	
	ЗапросSoap = Новый ЗаписьXML;
	ЗапросSoap.УстановитьСтроку("UTF-8");
	ЗапросSoap.ЗаписатьОбъявлениеXML();
	ЗапросSoap.ЗаписатьНачалоЭлемента("soap:Envelope");
	ЗапросSoap.ЗаписатьСоответствиеПространстваИмен("cal", "http://callback.keydisk.ru/");
	ЗапросSoap.ЗаписатьСоответствиеПространстваИмен("soap", "http://www.w3.org/2003/05/soap-envelope");
		
	ЗапросSoap.ЗаписатьНачалоЭлемента("soap:Header");
	ЗапросSoap.ЗаписатьКонецЭлемента();
	ЗапросSoap.ЗаписатьНачалоЭлемента("soap:Body");
	ЗапросSoap.ЗаписатьНачалоЭлемента("cal:SendCallbackRequestForNewConnection");
	
	ЗапросSoap.ЗаписатьНачалоЭлемента("cal:phone");	
	ЗапросSoap.ЗаписатьТекст(СокрЛП(Телефон));
	ЗапросSoap.ЗаписатьКонецЭлемента();
	
	ЗапросSoap.ЗаписатьНачалоЭлемента("cal:name");
	ЗапросSoap.ЗаписатьТекст(СокрЛП(Имя));
	ЗапросSoap.ЗаписатьКонецЭлемента();
	
	ЗапросSoap.ЗаписатьНачалоЭлемента("cal:inn");	
	ЗапросSoap.ЗаписатьКонецЭлемента();
	
	ЗапросSoap.ЗаписатьКонецЭлемента(); //cal:SendCallbackRequestForNewConnection
	ЗапросSoap.ЗаписатьКонецЭлемента(); //soap:Body	
	ЗапросSoap.ЗаписатьКонецЭлемента(); //soap:Envelope
	
	Возврат ЗапросSoap.Закрыть();
	
КонецФункции

Функция ВыполнитьЗапросКСервисуСлужебная(Знач Телефон, Знач Имя) Экспорт
	
	Таймаут = 60;
	ОписаниеОшибки = "";
	
	Прокси = ПолучениеФайловИзИнтернета.ПолучитьПрокси("https");	
	ЗащищенноеСоединение = ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение(
            Неопределено,
            Новый СертификатыУдостоверяющихЦентровОС);
			
	Хост = "callback.keydisk.ru";
	Порт = 443;
	Пользователь = Неопределено;
	Пароль = Неопределено;
			
	Запрос = Новый HTTPЗапрос("/callbackservice.asmx");	
	Запрос.УстановитьТелоИзСтроки(ПолучитьЗапрос(Телефон, Имя), "UTF-8", ИспользованиеByteOrderMark.НеИспользовать);
	Запрос.Заголовки.Вставить("SOAPAction", "http://callback.keydisk.ru/SendCallbackRequestForNewConnection");
	Запрос.Заголовки.Вставить("Content-Type", "text/xml;charset=UTF-8");
	
	Соединение = Новый HTTPСоединение(Хост, Порт, Пользователь, Пароль, Прокси, Таймаут, ЗащищенноеСоединение);
	
	Попытка
		Ответ = Соединение.ОтправитьДляОбработки(Запрос);
	Исключение
		ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
		Возврат Новый Структура("Успешно, Код, ОписаниеОшибки", Ложь, 1, ТекстОшибки);
	КонецПопытки;
	
	ОтветСтрокой = Ответ.ПолучитьТелоКакСтроку();
	Если ОтветСтрокой = Неопределено Тогда 
		ОтветСтрокой = "";
		Возврат Новый Структура("Успешно, Код, ОписаниеОшибки", Ложь, 2, "Запрос не вернул никаких данных");
	КонецЕсли;
	
	ОтветСтрокой = СтрЗаменить(ОтветСтрокой, "xmlns=""","xmlns:dummy=""");
	ОбработкаОтвета = Новый ЧтениеXML;
	Попытка
		ОбработкаОтвета.УстановитьСтроку(ОтветСтрокой);
	Исключение
		Возврат Новый Структура("Успешно, Код, ОписаниеОшибки", Ложь, 3, "Не удалось разобрать ответ");
	КонецПопытки;
	
	КодЗавершения = "";
	ТекстОшибкиСервиса = "";
	
	Построитель = Новый ПостроительDOM;
	ДокументDOM = Построитель.Прочитать(ОбработкаОтвета);	
	Разыменователь = Новый РазыменовательПространствИменDOM("", "");	
	
	Результат = ДокументDOM.ВычислитьВыражениеXPath("//SendCallbackRequestForNewConnectionResult/Code", ДокументDOM, Разыменователь, ТипРезультатаDOMXPath.ПервыйУпорядоченныйУзел);	
	Если ТипЗнч(Результат.ОдиночныйУзелЗначение) = Тип("ЭлементDOM") Тогда 
		КодЗавершения = СокрЛП(Результат.ОдиночныйУзелЗначение.ТекстовоеСодержимое);
	КонецЕсли;
	
	Результат = ДокументDOM.ВычислитьВыражениеXPath("//SendCallbackRequestForNewConnectionResult/ErrorMessage", ДокументDOM, Разыменователь, ТипРезультатаDOMXPath.ПервыйУпорядоченныйУзел);	
	Если ТипЗнч(Результат.ОдиночныйУзелЗначение) = Тип("ЭлементDOM") Тогда 
		ТекстОшибкиСервиса = СокрЛП(Результат.ОдиночныйУзелЗначение.ТекстовоеСодержимое);
	КонецЕсли;
	
	Если КодЗавершения = "0" Тогда 
		Возврат Новый Структура("Успешно, Код, ОписаниеОшибки", Истина, 0, "");
	Иначе
		Возврат Новый Структура("Успешно, Код, ОписаниеОшибки, КодОшибкиСервиса", Ложь, 9, ТекстОшибкиСервиса, КодЗавершения);
	КонецЕсли;

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

Процедура ВыполнитьЗапросКСервису(Параметры, АдресРезультата) Экспорт
	
	Результат = ВыполнитьЗапросКСервисуСлужебная(Параметры.Телефон, Параметры.Имя);
	ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
				
КонецПроцедуры

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

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

Процедура ОбменССерверомПроверитьЛогинФоновое(ПараметрыФункции, АдресРезультата) Экспорт
	
	Результат = ПолучитьОбновленныйМодуль().ОбменССерверомПроверитьЛогин(ПараметрыФункции);
	
	ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
	
КонецПроцедуры

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

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

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

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

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

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

#КонецЕсли

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