Документооборот с контролирующими органами / Уведомление об отказе / Модуль формы

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

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

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

#Область ОбработчикиСобытийЭлементовШапкиФормы

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

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

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

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

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

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

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

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

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