Документооборот с контролирующими органами / Просмотр протокола ФСГС / Модуль формы

файл

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

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

	// считываем текст из файла уведомления
	Попытка
		ПутьКФайлу = ПолучитьИмяВременногоФайла();
		ПолучитьИзВременногоХранилища(Параметры.Протокол).Записать(ПутьКФайлу);
		ТекстИзФайла = КонтекстЭДОСервер.ПрочитатьТекстИзФайла(ПутьКФайлу, , Истина);
		ОперацииСФайламиЭДКО.УдалитьВременныйФайл(ПутьКФайлу); // xml-файл
	Исключение
		Отказ = Истина;
		ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru='Ошибка чтения протокола из файла: %1'"), Символы.ПС + Символы.ПС + ИнформацияОбОшибке().Описание);
		ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
		Возврат;
	КонецПопытки;
	
	ЭтоФорматXML = Ложь;
	
	// загружаем XML из строки в дерево
	ДеревоXML = КонтекстЭДОСервер.ЗагрузитьСтрокуXMLВДеревоЗначений(ТекстИзФайла);
	Если ДеревоXML <> Неопределено Тогда
		ЭтоФорматXML = Истина;
	КонецЕсли;
	
	Если ЭтоФорматXML Тогда
		
		УзелПротокол = ДеревоXML.Строки.Найти("protocol", "Имя");
		
		Если УзелПротокол <> Неопределено Тогда
			
			УзелСтатусПротокола = УзелПротокол.Строки.Найти("status", "Имя");
			СтатусПротокола = "";
			Если УзелСтатусПротокола <> Неопределено Тогда
				СтатусПротокола = XMLЗначение(Тип("Строка"), УзелСтатусПротокола.Значение);
			КонецЕсли;
			УзелСообщениеПротокола = УзелПротокол.Строки.Найти("msg", "Имя");
			СообщениеПротокола = "";
			Если УзелСообщениеПротокола <> Неопределено Тогда
				СообщениеПротокола = XMLЗначение(Тип("Строка"), УзелСообщениеПротокола.Значение);
			КонецЕсли;
			
			УзелТитульный = УзелПротокол.Строки.Найти("title", "Имя");
			Если УзелТитульный <> Неопределено Тогда
				
				ЗначенияЭлементов = Новый Соответствие;
				УзлыЭлементы = УзелТитульный.Строки.НайтиСтроки(Новый Структура("Имя, Тип", "item", "Э"));
				Для каждого УзелЭлемент Из УзлыЭлементы Цикл
					УзелИмяЭлемента = УзелЭлемент.Строки.Найти("name", "Имя");
					Если УзелИмяЭлемента <> Неопределено И ЗначениеЗаполнено(УзелИмяЭлемента.Значение) Тогда
						УзелЗначениеЭлемента = УзелЭлемент.Строки.Найти("value", "Имя");
						ЗначенияЭлементов.Вставить(УзелИмяЭлемента.Значение, ?(УзелЗначениеЭлемента <> Неопределено, XMLЗначение(Тип("Строка"), УзелЗначениеЭлемента.Значение), Неопределено));
					КонецЕсли;
				КонецЦикла;
				
				ЗначенияУведомлений = Новый Массив;
				УзелГруппа = УзелПротокол.Строки.Найти("group", "Имя");
				ЗаголовокГруппы = "";
				Если УзелГруппа <> Неопределено Тогда
					Для каждого УзелУведомление Из УзелГруппа.Строки Цикл
						СообщениеЭлемента = СокрЛП(XMLЗначение(Тип("Строка"), УзелУведомление.Значение));
						Если УзелУведомление.Тип <> "Э" Тогда
							Если УзелУведомление.Имя = "msg" Тогда
								ЗаголовокГруппы = СообщениеЭлемента;
							КонецЕсли;
							Продолжить;
						КонецЕсли;
						УзелСообщение = УзелУведомление.Строки.Найти("msg", "Имя");
						Если УзелСообщение <> Неопределено И ЗначениеЗаполнено(УзелСообщение.Значение) Тогда
							СообщениеЭлемента = " - " + СокрЛП(XMLЗначение(Тип("Строка"), УзелСообщение.Значение));
						КонецЕсли;
						ЗначенияУведомлений.Добавить(СообщениеЭлемента);
					КонецЦикла;
				КонецЕсли;
				
				// определяем дату-время отправки
				ДатаВремяОтправки = Формат(КонтекстЭДОСервер.ДатаВремяИзСтроки(ЗначенияЭлементов["dt_send"]), "ДЛФ=DDT; ДП=-");
				
				// получаем признак того, что протокол положительный
				ПротоколЯвляетсяПоложительным = "";
				ОтчетСдан = КонтекстЭДОСервер.ПротоколФСГСОтчетСданПоТексту(СтатусПротокола, СообщениеПротокола);
				Если ОтчетСдан Тогда
					ПротоколЯвляетсяПоложительным = "Да";
				ИначеЕсли УзелГруппа <> Неопределено Тогда
					ПротоколЯвляетсяПоложительным = "Нет";
					Элементы.НадписьПротоколЯвляетсяПоложительным.ЦветТекста = Новый Цвет(255, 0, 0);
				КонецЕсли;
				
				// формируем текст протокола
				Если ПротоколЯвляетсяПоложительным = "Да" И НРег(СтатусПротокола) = "ok" Тогда
					ТекстПротокола = "ОТЧЕТ ПРИНЯТ УСПЕШНО." + Символы.ПС + Символы.ПС + "Уведомление о при~ме в обработку." + Символы.ПС + Символы.ПС;
				ИначеЕсли ПротоколЯвляетсяПоложительным = "Да" Тогда
					ТекстПротокола = "ОТЧЕТ ПРИНЯТ УСПЕШНО." + Символы.ПС + Символы.ПС + СообщениеПротокола + Символы.ПС + Символы.ПС;
				Иначе
					ТекстПротокола = СообщениеПротокола + Символы.ПС + Символы.ПС;
				КонецЕсли;
				
				Если ЗначенияЭлементов["dt_load"] <> Неопределено Тогда
					ТекстПротокола = ТекстПротокола + "Дата при~ма отч~та: " + Формат(КонтекстЭДОСервер.ДатаВремяИзСтроки(ЗначенияЭлементов["dt_load"]), "ДЛФ=DT; ДП=-") + Символы.ПС;
				КонецЕсли;
				Если ЗначенияЭлементов["obj"] <> Неопределено Тогда
					Если СокрЛП(ЗначенияЭлементов["ko"]) = СокрЛП(ЗначенияЭлементов["obj"]) Тогда
						ИдентификаторРеспондента = СокрЛП(ЗначенияЭлементов["obj"]);
					Иначе
						ИдентификаторРеспондента = СокрЛП(Строка(ЗначенияЭлементов["ko"]) + " " + ЗначенияЭлементов["obj"]);
					КонецЕсли;
					ТекстПротокола = ТекстПротокола + "Идентификатор респондента: " + ИдентификаторРеспондента + Символы.ПС;
				КонецЕсли;
				Если ЗначенияЭлементов["file"] <> Неопределено Тогда
					ТекстПротокола = ТекстПротокола + "Имя файла с отч~том: " + СокрЛП(ЗначенияЭлементов["file"]) + Символы.ПС;
				КонецЕсли;
				Если ЗначенияЭлементов["dt_send"] <> Неопределено Тогда
					ТекстПротокола = ТекстПротокола + "Дата передачи файла: " + Формат(КонтекстЭДОСервер.ДатаВремяИзСтроки(ЗначенияЭлементов["dt_send"]), "ДЛФ=DT; ДП=-") + Символы.ПС;
				КонецЕсли;
				
				ТекстПротокола = ТекстПротокола + Символы.ПС;
				
				Если ЗначенияЭлементов["form_name"] <> Неопределено Тогда
					ТекстПротокола = ТекстПротокола + "Форма отч~та: " + СокрЛП(ЗначенияЭлементов["form_name"]) + Символы.ПС;
				КонецЕсли;
				Если ЗначенияЭлементов["form_code"] <> Неопределено Тогда
					ТекстПротокола = ТекстПротокола + "Код формы отч~та: " + СокрЛП(ЗначенияЭлементов["form_code"]) + Символы.ПС;
				КонецЕсли;
				Если ЗначенияЭлементов["year"] <> Неопределено Тогда
					ТекстПротокола = ТекстПротокола + "Год отч~та: " + СокрЛП(ЗначенияЭлементов["year"]) + Символы.ПС;
				КонецЕсли;
				Если ЗначенияЭлементов["period"] <> Неопределено Тогда
					ТекстПротокола = ТекстПротокола + "Код периода отч~та: " + СокрЛП(ЗначенияЭлементов["period"]) + Символы.ПС;
				КонецЕсли;
				
				// выводим уведомления, для разъяснения причины отказа
				Если ЗначенияУведомлений.Количество() > 0 Тогда
					ТекстПротокола = ТекстПротокола + Символы.ПС + ЗаголовокГруппы + ":" + Символы.ПС;
					Для каждого Уведомление Из ЗначенияУведомлений Цикл
						ТекстПротокола = ТекстПротокола + Уведомление + Символы.ПС;
					КонецЦикла;
				КонецЕсли;
				
				ТекстПротокола = СтрЗаменить(СтрЗаменить(ТекстПротокола, "~", Символ(1105)), "&quot;", """");
				
			Иначе
				ЭтоФорматXML = Ложь;
			КонецЕсли;
		Иначе
			ЭтоФорматXML = Ложь;
		КонецЕсли;
		
	КонецЕсли;
	
	Если НЕ ЭтоФорматXML Тогда
		
		// определяем дату-время получения
		ДатаВремяОтправки = "";
		Для СчетчикСтрок = 1 По СтрЧислоСтрок(ТекстИзФайла) Цикл
			ТекСтрока = СтрПолучитьСтроку(ТекстИзФайла, СчетчикСтрок);
			ПозСтрДата = СтрНайти(ТекСтрока, "Дата передачи файла:");
			Если ПозСтрДата > 0 Тогда
				ДатаВремяОтправки = Формат(КонтекстЭДОСервер.ДатаВремяИзСтроки(СокрЛП(Сред(ТекСтрока, ПозСтрДата + 20))), "ДЛФ=DDT; ДП=-");
				Прервать;
			КонецЕсли; 
		КонецЦикла;
		
		// исключение из стандарта 456,
		// требуется полное соответствие строке из внешнего файла
		// получаем признак того, что протокол положительный
		Если СтрНайти(ВРег(ТекстПротокола), ВРег("Отчёт не принят")) > 0 ИЛИ СтрНайти(ВРег(ТекстПротокола), ВРег("Отчет не принят")) > 0 Тогда
			ПротоколЯвляетсяПоложительным = "Нет";
			Элементы.НадписьПротоколЯвляетсяПоложительным.ЦветТекста = Новый Цвет(255, 0, 0);
		Иначе
			ПротоколЯвляетсяПоложительным = "Да";
		КонецЕсли;
		
		ТекстПротокола = ТекстИзФайла;
		
	КонецЕсли;
	
	Элементы.КнопкаПечать.Видимость = Параметры.ПечатьВозможна;
	Если Параметры.ПечатьВозможна Тогда
		ЦиклОбмена = Параметры.ЦиклОбмена;
		ФорматДокументооборота = Параметры.ЦиклОбмена.ФорматДокументооборота;
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

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